package ml.docilealligator.infinityforreddit.activities; import android.app.job.JobInfo; import android.app.job.JobScheduler; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.os.Bundle; import android.os.PersistableBundle; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout.LayoutParams; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; import com.bumptech.glide.Glide; import com.bumptech.glide.RequestManager; import com.bumptech.glide.request.RequestOptions; import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import javax.inject.Inject; import javax.inject.Named; import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.RedditDataRoomDatabase; import ml.docilealligator.infinityforreddit.account.Account; import ml.docilealligator.infinityforreddit.customtheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.customviews.slidr.Slidr; import ml.docilealligator.infinityforreddit.databinding.ActivityEditProfileBinding; import ml.docilealligator.infinityforreddit.events.SubmitChangeAvatarEvent; import ml.docilealligator.infinityforreddit.events.SubmitChangeBannerEvent; import ml.docilealligator.infinityforreddit.events.SubmitSaveProfileEvent; import ml.docilealligator.infinityforreddit.services.EditProfileService; import ml.docilealligator.infinityforreddit.user.UserViewModel; import ml.docilealligator.infinityforreddit.utils.EditProfileUtils; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.Utils; import retrofit2.Retrofit; public class EditProfileActivity extends BaseActivity { private static final int PICK_IMAGE_BANNER_REQUEST_CODE = 0x401; private static final int PICK_IMAGE_AVATAR_REQUEST_CODE = 0x402; @Inject @Named("current_account") SharedPreferences mCurrentAccountSharedPreferences; @Inject @Named("default") SharedPreferences mSharedPreferences; @Inject @Named("oauth") Retrofit mOauthRetrofit; @Inject RedditDataRoomDatabase mRedditDataRoomDatabase; @Inject CustomThemeWrapper mCustomThemeWrapper; private ActivityEditProfileBinding binding; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { ((Infinity) getApplication()).getAppComponent().inject(this); setImmersiveModeNotApplicable(); super.onCreate(savedInstanceState); binding = ActivityEditProfileBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); EventBus.getDefault().register(this); applyCustomTheme(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && isChangeStatusBarIconColor()) { addOnOffsetChangedListener(binding.appbarLayoutViewEditProfileActivity); } setSupportActionBar(binding.toolbarViewEditProfileActivity); if (mSharedPreferences.getBoolean(SharedPreferencesUtils.SWIPE_RIGHT_TO_GO_BACK, true)) { Slidr.attach(this); } binding.imageViewChangeBannerEditProfileActivity.setOnClickListener(view -> { startPickImage(PICK_IMAGE_BANNER_REQUEST_CODE); }); binding.imageViewChangeAvatarEditProfileActivity.setOnClickListener(view -> { startPickImage(PICK_IMAGE_AVATAR_REQUEST_CODE); }); final RequestManager glide = Glide.with(this); final UserViewModel.Factory userViewModelFactory = new UserViewModel.Factory(mRedditDataRoomDatabase, accountName); final UserViewModel userViewModel = new ViewModelProvider(this, userViewModelFactory).get(UserViewModel.class); userViewModel.getUserLiveData().observe(this, userData -> { if (userData == null) { return; } // BANNER final String userBanner = userData.getBanner(); LayoutParams cBannerLp = (LayoutParams) binding.imageViewChangeBannerEditProfileActivity.getLayoutParams(); if (userBanner == null || userBanner.isEmpty()) { binding.imageViewChangeBannerEditProfileActivity.setLongClickable(false); cBannerLp.gravity = Gravity.CENTER; binding.imageViewChangeBannerEditProfileActivity.setLayoutParams(cBannerLp); binding.imageViewChangeBannerEditProfileActivity.setOnLongClickListener(v -> false); } else { binding.imageViewChangeBannerEditProfileActivity.setLongClickable(true); cBannerLp.gravity = Gravity.END | Gravity.BOTTOM; binding.imageViewChangeBannerEditProfileActivity.setLayoutParams(cBannerLp); glide.load(userBanner).into(binding.imageViewBannerEditProfileActivity); binding.imageViewChangeBannerEditProfileActivity.setOnLongClickListener(view -> { if (accountName.equals(Account.ANONYMOUS_ACCOUNT)) { return false; } new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme) .setTitle(R.string.remove_banner) .setMessage(R.string.are_you_sure) .setPositiveButton(R.string.yes, (dialogInterface, i) -> EditProfileUtils.deleteBanner(mOauthRetrofit, accessToken, accountName, new EditProfileUtils.EditProfileUtilsListener() { @Override public void success() { Toast.makeText(EditProfileActivity.this, R.string.message_remove_banner_success, Toast.LENGTH_SHORT).show(); binding.imageViewBannerEditProfileActivity.setImageDrawable(null);// } @Override public void failed(String message) { Toast.makeText(EditProfileActivity.this, getString(R.string.message_remove_banner_failed, message), Toast.LENGTH_SHORT).show(); } })) .setNegativeButton(R.string.no, null) .show(); return true; }); } // AVATAR final String userAvatar = userData.getIconUrl(); glide.load(userAvatar) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0))) .into(binding.imageViewAvatarEditProfileActivity); LayoutParams cAvatarLp = (LayoutParams) binding.imageViewChangeAvatarEditProfileActivity.getLayoutParams(); if (userAvatar.contains("avatar_default_")) { binding.imageViewChangeAvatarEditProfileActivity.setLongClickable(false); binding.imageViewChangeAvatarEditProfileActivity.setOnLongClickListener(v -> false); } else { binding.imageViewChangeAvatarEditProfileActivity.setLongClickable(true); binding.imageViewChangeAvatarEditProfileActivity.setOnLongClickListener(view -> { if (accountName.equals(Account.ANONYMOUS_ACCOUNT)) { return false; } new MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme) .setTitle(R.string.remove_avatar) .setMessage(R.string.are_you_sure) .setPositiveButton(R.string.yes, (dialogInterface, i) -> EditProfileUtils.deleteAvatar(mOauthRetrofit, accessToken, accountName, new EditProfileUtils.EditProfileUtilsListener() { @Override public void success() { Toast.makeText(EditProfileActivity.this, R.string.message_remove_avatar_success, Toast.LENGTH_SHORT).show();// } @Override public void failed(String message) { Toast.makeText(EditProfileActivity.this, getString(R.string.message_remove_avatar_failed, message), Toast.LENGTH_SHORT).show(); } })) .setNegativeButton(R.string.no, null) .show(); return true; }); } binding.editTextAboutYouEditProfileActivity.setText(userData.getDescription()); binding.editTextDisplayNameEditProfileActivity.setText(userData.getTitle()); }); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK || data == null || accountName.equals(Account.ANONYMOUS_ACCOUNT)) { return; } /*Intent intent = new Intent(this, EditProfileService.class); intent.setData(data.getData()); intent.putExtra(EditProfileService.EXTRA_ACCOUNT_NAME, accountName); intent.putExtra(EditProfileService.EXTRA_ACCESS_TOKEN, accessToken); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); switch (requestCode) { case PICK_IMAGE_BANNER_REQUEST_CODE: intent.putExtra(EditProfileService.EXTRA_POST_TYPE, EditProfileService.EXTRA_POST_TYPE_CHANGE_BANNER); ContextCompat.startForegroundService(this, intent); break; case PICK_IMAGE_AVATAR_REQUEST_CODE: intent.putExtra(EditProfileService.EXTRA_POST_TYPE, EditProfileService.EXTRA_POST_TYPE_CHANGE_AVATAR); ContextCompat.startForegroundService(this, intent); break; default: break; }*/ int contentEstimatedBytes = 0; PersistableBundle extras = new PersistableBundle(); extras.putString(EditProfileService.EXTRA_MEDIA_URI, data.getData().toString()); extras.putString(EditProfileService.EXTRA_ACCOUNT_NAME, accountName); extras.putString(EditProfileService.EXTRA_ACCESS_TOKEN, accessToken); switch (requestCode) { case PICK_IMAGE_BANNER_REQUEST_CODE: { extras.putInt(EditProfileService.EXTRA_POST_TYPE, EditProfileService.EXTRA_POST_TYPE_CHANGE_BANNER); //TODO: contentEstimatedBytes JobInfo jobInfo = EditProfileService.constructJobInfo(this, 500000, extras); ((JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE)).schedule(jobInfo); break; } case PICK_IMAGE_AVATAR_REQUEST_CODE: { extras.putInt(EditProfileService.EXTRA_POST_TYPE, EditProfileService.EXTRA_POST_TYPE_CHANGE_AVATAR); //TODO: contentEstimatedBytes JobInfo jobInfo = EditProfileService.constructJobInfo(this, 500000, extras); ((JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE)).schedule(jobInfo); break; } default: break; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.edit_profile_activity, menu); applyMenuItemTheme(menu); return true; } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { final int itemId = item.getItemId(); if (itemId == android.R.id.home) { finish(); return true; } else if (itemId == R.id.action_save_edit_profile_activity) { String displayName = null; if (binding.editTextDisplayNameEditProfileActivity.getText() != null) { displayName = binding.editTextDisplayNameEditProfileActivity.getText().toString(); } String aboutYou = null; if (binding.editTextAboutYouEditProfileActivity.getText() != null) { aboutYou = binding.editTextAboutYouEditProfileActivity.getText().toString(); } if (aboutYou == null || displayName == null) return false; // /*Intent intent = new Intent(this, EditProfileService.class); intent.putExtra(EditProfileService.EXTRA_ACCOUNT_NAME, accountName); intent.putExtra(EditProfileService.EXTRA_ACCESS_TOKEN, accessToken); intent.putExtra(EditProfileService.EXTRA_DISPLAY_NAME, displayName); // intent.putExtra(EditProfileService.EXTRA_ABOUT_YOU, aboutYou); // intent.putExtra(EditProfileService.EXTRA_POST_TYPE, EditProfileService.EXTRA_POST_TYPE_SAVE_EDIT_PROFILE); ContextCompat.startForegroundService(this, intent);*/ PersistableBundle extras = new PersistableBundle(); extras.putString(EditProfileService.EXTRA_ACCOUNT_NAME, accountName); extras.putString(EditProfileService.EXTRA_ACCESS_TOKEN, accessToken); extras.putString(EditProfileService.EXTRA_DISPLAY_NAME, displayName); extras.putString(EditProfileService.EXTRA_ABOUT_YOU, aboutYou); extras.putInt(EditProfileService.EXTRA_POST_TYPE, EditProfileService.EXTRA_POST_TYPE_SAVE_EDIT_PROFILE); JobInfo jobInfo = EditProfileService.constructJobInfo(this, 1000, extras); ((JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE)).schedule(jobInfo); return true; } return false; } @Subscribe public void onSubmitChangeAvatar(SubmitChangeAvatarEvent event) { if (event.isSuccess) { Toast.makeText(this, R.string.message_change_avatar_success, Toast.LENGTH_SHORT).show(); } else { String message = getString(R.string.message_change_avatar_failed, event.errorMessage); Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } } @Subscribe public void onSubmitChangeBanner(SubmitChangeBannerEvent event) { if (event.isSuccess) { Toast.makeText(this, R.string.message_change_banner_success, Toast.LENGTH_SHORT).show(); } else { String message = getString(R.string.message_change_banner_failed, event.errorMessage); Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } } @Subscribe public void onSubmitSaveProfile(SubmitSaveProfileEvent event) { if (event.isSuccess) { Toast.makeText(this, R.string.message_save_profile_success, Toast.LENGTH_SHORT).show(); } else { String message = getString(R.string.message_save_profile_failed, event.errorMessage); Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); } } @Override public SharedPreferences getDefaultSharedPreferences() { return mSharedPreferences; } @Override public SharedPreferences getCurrentAccountSharedPreferences() { return mCurrentAccountSharedPreferences; } @Override public CustomThemeWrapper getCustomThemeWrapper() { return mCustomThemeWrapper; } @Override protected void applyCustomTheme() { applyAppBarLayoutAndCollapsingToolbarLayoutAndToolbarTheme(binding.appbarLayoutViewEditProfileActivity, binding.collapsingToolbarLayoutEditProfileActivity, binding.toolbarViewEditProfileActivity); binding.rootLayoutViewEditProfileActivity.setBackgroundColor(mCustomThemeWrapper.getBackgroundColor()); changeColorTextView(binding.contentViewEditProfileActivity, mCustomThemeWrapper.getPrimaryTextColor()); if (typeface != null) { Utils.setFontToAllTextViews(binding.rootLayoutViewEditProfileActivity, typeface); } } private void changeColorTextView(ViewGroup viewGroup, int color) { final int childCount = viewGroup.getChildCount(); for (int i = 0; i < childCount; i++) { View child = viewGroup.getChildAt(i); if (child instanceof ViewGroup) { changeColorTextView((ViewGroup) child, color); } else if (child instanceof TextView) { ((TextView) child).setTextColor(color); } } } private void startPickImage(int requestId) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult( Intent.createChooser(intent, getString(R.string.select_from_gallery)), requestId); } }