diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java b/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java index 9ad484e0..d51bf734 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/ProfileEditor.java @@ -28,6 +28,7 @@ import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; import org.nuclearfog.twidda.R; @@ -41,7 +42,8 @@ import org.nuclearfog.twidda.backend.utils.DialogBuilder.OnDialogClick; import org.nuclearfog.twidda.backend.utils.ErrorHandler; import org.nuclearfog.twidda.database.GlobalSettings; -import jp.wasabeef.picasso.transformations.BlurTransformation; +import java.io.File; + import jp.wasabeef.picasso.transformations.RoundedCornersTransformation; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; @@ -53,6 +55,7 @@ import static android.view.Window.FEATURE_NO_TITLE; import static android.widget.Toast.LENGTH_SHORT; import static org.nuclearfog.twidda.activity.UserProfile.RETURN_PROFILE_CHANGED; import static org.nuclearfog.twidda.activity.UserProfile.RETURN_PROFILE_DATA; +import static org.nuclearfog.twidda.activity.UserProfile.TOOLBAR_TRANSPARENCY; import static org.nuclearfog.twidda.backend.utils.DialogBuilder.DialogType.PROFILE_EDIT_LEAVE; import static org.nuclearfog.twidda.database.GlobalSettings.BANNER_IMG_MID_RES; import static org.nuclearfog.twidda.database.GlobalSettings.PROFILE_IMG_HIGH_RES; @@ -60,7 +63,7 @@ import static org.nuclearfog.twidda.database.GlobalSettings.PROFILE_IMG_HIGH_RES /** * Activity for Twitter profile editor */ -public class ProfileEditor extends AppCompatActivity implements OnClickListener, OnDismissListener, OnDialogClick { +public class ProfileEditor extends AppCompatActivity implements OnClickListener, OnDismissListener, OnDialogClick, Callback { /** * key to preload user data @@ -132,6 +135,8 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, setSupportActionBar(toolbar); settings = GlobalSettings.getInstance(this); + toolbar.setBackgroundColor(settings.getBackgroundColor() & TOOLBAR_TRANSPARENCY); + profile_banner.setDrawingCacheEnabled(true); AppStyles.setTheme(settings, root); closeDialog = DialogBuilder.create(this, PROFILE_EDIT_LEAVE, this); @@ -218,20 +223,18 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, Cursor c = getContentResolver().query(intent.getData(), MEDIA_MODE, null, null, null); if (c != null) { if (c.moveToFirst()) { - int index = c.getColumnIndex(MEDIA_MODE[0]); - String mediaPath = c.getString(index); - Bitmap image = BitmapFactory.decodeFile(mediaPath); - + String mediaPath = c.getString(0); if (reqCode == REQ_PROFILE_IMG) { // Add image as profile image + Bitmap image = BitmapFactory.decodeFile(mediaPath); profile_image.setImageBitmap(image); profileLink = mediaPath; } else { // Add image as banner image - int bannerHeight = profile_banner.getMeasuredWidth() / 3; - if (bannerHeight > 0) - profile_banner.setMaxHeight(bannerHeight); - profile_banner.setImageBitmap(image); + File img = new File(mediaPath); + Point displaySize = new Point(); + getWindowManager().getDefaultDisplay().getSize(displaySize); + Picasso.get().load(img).resize(displaySize.x, displaySize.x / 3).centerCrop(Gravity.TOP).into(profile_banner, this); addBannerBtn.setVisibility(INVISIBLE); changeBannerBtn.setVisibility(VISIBLE); bannerLink = mediaPath; @@ -277,6 +280,18 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, } } + + @Override + public void onSuccess() { + AppStyles.setToolbarBackground(ProfileEditor.this, profile_banner, toolbar_background); + } + + + @Override + public void onError(Exception e) { + } + + /** * enable or disable loading dialog * @@ -322,12 +337,7 @@ public class ProfileEditor extends AppCompatActivity implements OnClickListener, } if (user.hasBannerImage()) { String bnLink = user.getBannerLink() + BANNER_IMG_MID_RES; - Point displaySize = new Point(); - getWindowManager().getDefaultDisplay().getSize(displaySize); - int toolbarHeight = (int) getResources().getDimension(R.dimen.profile_toolbar_height); - Picasso.get().load(bnLink).into(profile_banner); - Picasso.get().load(bnLink).resize(displaySize.x, toolbarHeight).centerCrop(Gravity.TOP) - .transform(new BlurTransformation(this, 10)).into(toolbar_background); + Picasso.get().load(bnLink).into(profile_banner, this); addBannerBtn.setVisibility(INVISIBLE); changeBannerBtn.setVisibility(VISIBLE); } else { diff --git a/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java b/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java index 2b648304..86a80f96 100644 --- a/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java +++ b/app/src/main/java/org/nuclearfog/twidda/activity/UserProfile.java @@ -4,11 +4,9 @@ import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.Intent; import android.graphics.Color; -import android.graphics.Point; import android.net.Uri; import android.os.Bundle; import android.text.Spanned; -import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -27,6 +25,7 @@ import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; import com.google.android.material.tabs.TabLayout.OnTabSelectedListener; import com.google.android.material.tabs.TabLayout.Tab; +import com.squareup.picasso.Callback; import com.squareup.picasso.Picasso; import org.nuclearfog.tag.Tagger; @@ -47,7 +46,6 @@ import org.nuclearfog.twidda.database.GlobalSettings; import java.text.NumberFormat; import java.text.SimpleDateFormat; -import jp.wasabeef.picasso.transformations.BlurTransformation; import jp.wasabeef.picasso.transformations.RoundedCornersTransformation; import static android.content.Intent.ACTION_VIEW; @@ -123,18 +121,21 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O /** * background color mask for TextView backgrounds */ - private static final int TRANSPARENCY = 0xafffffff; + private static final int TEXT_TRANSPARENCY = 0xafffffff; + + /** + * background color mask for toolbar background + */ + public static final int TOOLBAR_TRANSPARENCY = 0x5fffffff; - private Point displaySize; private FragmentAdapter adapter; private GlobalSettings settings; private UserAction profileAsync; private TextView[] tabTweetCount; - private TextView txtUser, txtScrName; - private TextView txtLocation, txtCreated, lnkTxt, bioTxt, follow_back; - private Button following, follower; + private TextView txtLocation, txtCreated, lnkTxt, bioTxt, follow_back, txtUser, txtScrName; private ImageView profileImage, bannerImage, toolbarBackground; + private Button following, follower; private View profile_head; private ViewPager pager; private TabLayout tabLayout; @@ -152,7 +153,6 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O setContentView(R.layout.page_profile); Toolbar tool = findViewById(R.id.profile_toolbar); View root = findViewById(R.id.user_view); - View profile_layer = findViewById(R.id.profile_layer); tabLayout = findViewById(R.id.profile_tab); bioTxt = findViewById(R.id.bio); following = findViewById(R.id.following); @@ -169,14 +169,6 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O follow_back = findViewById(R.id.follow_back); pager = findViewById(R.id.profile_pager); - displaySize = new Point(); - getWindowManager().getDefaultDisplay().getSize(displaySize); - int layoutHeight = displaySize.x / 3; - int buttonHeight = (int) getResources().getDimension(R.dimen.profile_button_height); - int layerPadding = (int) getResources().getDimension(R.dimen.profile_layer_padding); - profile_layer.getLayoutParams().height = layoutHeight + buttonHeight + layerPadding; - profile_layer.requestLayout(); - settings = GlobalSettings.getInstance(this); following.setCompoundDrawablesWithIntrinsicBounds(R.drawable.following, 0, 0, 0); follower.setCompoundDrawablesWithIntrinsicBounds(R.drawable.follower, 0, 0, 0); @@ -184,9 +176,10 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O txtLocation.setCompoundDrawablesWithIntrinsicBounds(R.drawable.userlocation, 0, 0, 0); lnkTxt.setCompoundDrawablesWithIntrinsicBounds(R.drawable.link, 0, 0, 0); follow_back.setCompoundDrawablesWithIntrinsicBounds(R.drawable.followback, 0, 0, 0); - txtUser.setBackgroundColor(settings.getBackgroundColor() & TRANSPARENCY); - txtScrName.setBackgroundColor(settings.getBackgroundColor() & TRANSPARENCY); - follow_back.setBackgroundColor(settings.getBackgroundColor() & TRANSPARENCY); + tool.setBackgroundColor(settings.getBackgroundColor() & TOOLBAR_TRANSPARENCY); + txtUser.setBackgroundColor(settings.getBackgroundColor() & TEXT_TRANSPARENCY); + txtScrName.setBackgroundColor(settings.getBackgroundColor() & TEXT_TRANSPARENCY); + follow_back.setBackgroundColor(settings.getBackgroundColor() & TEXT_TRANSPARENCY); bioTxt.setMovementMethod(LinkAndScrollMovement.getInstance()); bioTxt.setLinkTextColor(settings.getHighlightColor()); AppStyles.setTheme(settings, root); @@ -602,11 +595,18 @@ public class UserProfile extends AppCompatActivity implements OnClickListener, O } if (settings.getImageLoad()) { if (user.hasBannerImage()) { + Callback callback = new Callback() { + @Override + public void onSuccess() { + AppStyles.setToolbarBackground(UserProfile.this, bannerImage, toolbarBackground); + } + + @Override + public void onError(Exception e) { + } + }; String bannerLink = user.getBannerLink() + settings.getBannerSuffix(); - Picasso.get().load(bannerLink).error(R.drawable.no_banner).into(bannerImage); - int toolbarHeight = (int) getResources().getDimension(R.dimen.profile_toolbar_height); - Picasso.get().load(bannerLink).resize(displaySize.x, toolbarHeight).centerCrop(Gravity.TOP) - .transform(new BlurTransformation(this, 10)).error(R.drawable.no_banner).into(toolbarBackground); + Picasso.get().load(bannerLink).error(R.drawable.no_banner).into(bannerImage, callback); } else { bannerImage.setImageResource(0); } diff --git a/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java b/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java index fbaeac4b..7f08e535 100644 --- a/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java +++ b/app/src/main/java/org/nuclearfog/twidda/backend/utils/AppStyles.java @@ -1,9 +1,13 @@ package org.nuclearfog.twidda.backend.utils; +import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Point; import android.graphics.PorterDuffColorFilter; +import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.StateListDrawable; import android.view.Menu; @@ -27,6 +31,10 @@ import com.kyleduo.switchbutton.SwitchButton; import org.nuclearfog.twidda.R; import org.nuclearfog.twidda.database.GlobalSettings; +import jp.wasabeef.picasso.transformations.BlurTransformation; +import jp.wasabeef.picasso.transformations.CropTransformation; + +import static android.graphics.Bitmap.Config.ARGB_8888; import static android.graphics.PorterDuff.Mode.SRC_ATOP; /** @@ -269,6 +277,21 @@ public final class AppStyles { return tabs; } + + public static void setToolbarBackground(Activity activity, ImageView background, ImageView toolbarBackground) { + Point displaySize = new Point(); + activity.getWindowManager().getDefaultDisplay().getSize(displaySize); + float toolbarRatio = displaySize.x / activity.getResources().getDimension(R.dimen.profile_toolbar_height); + Bitmap image = ((BitmapDrawable) background.getDrawable()).getBitmap(); + + BlurTransformation blur = new BlurTransformation(background.getContext(), 20); + CropTransformation crop = new CropTransformation(image.getWidth(), (int) (image.getWidth() / toolbarRatio), + CropTransformation.GravityHorizontal.CENTER, CropTransformation.GravityVertical.TOP); + + Bitmap result = blur.transform(crop.transform(image.copy(ARGB_8888, true))); + toolbarBackground.setImageBitmap(result); + } + /** * color drawable * diff --git a/app/src/main/res/layout/page_editprofile.xml b/app/src/main/res/layout/page_editprofile.xml index bee98ec7..83addb11 100644 --- a/app/src/main/res/layout/page_editprofile.xml +++ b/app/src/main/res/layout/page_editprofile.xml @@ -6,7 +6,9 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" - android:orientation="vertical"> + android:orientation="vertical" + android:focusable="true" + android:focusableInTouchMode="true"> @@ -71,9 +73,9 @@ android:id="@+id/edit_pb" android:layout_width="@dimen/editprofile_image" android:layout_height="@dimen/editprofile_image" - android:layout_marginStart="10dp" - android:layout_marginLeft="10dp" - android:layout_marginTop="30dp" + android:layout_marginStart="@dimen/editprofile_profile_image_left_margin" + android:layout_marginLeft="@dimen/editprofile_profile_image_left_margin" + android:layout_marginTop="@dimen/editprofile_profile_image_top_margin" android:contentDescription="@string/image_preview" android:scaleType="centerCrop" app:layout_constraintStart_toStartOf="@+id/edit_banner" diff --git a/app/src/main/res/layout/page_profile.xml b/app/src/main/res/layout/page_profile.xml index 975f04e6..d191bcd9 100644 --- a/app/src/main/res/layout/page_profile.xml +++ b/app/src/main/res/layout/page_profile.xml @@ -17,184 +17,204 @@ android:layout_height="match_parent" app:layout_scrollFlags="scroll|exitUntilCollapsed"> - - + android:layout_height="0dp" + android:adjustViewBounds="true" + android:contentDescription="@string/profile_banner" + android:scaleType="centerCrop" + app:layout_constraintDimensionRatio="3.0" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent" /> - + - + - + - + - + - - + - +