From acc55e3433f51d9970243951afc25e8db891a780 Mon Sep 17 00:00:00 2001 From: opyale Date: Sat, 6 Jun 2020 22:04:07 +0200 Subject: [PATCH] Using blurred avatar as background. (#532) Fixing NullPointerException when image isn't loaded yet. Display country instead of raw language code. Minor improvements and contrasting color. First changes. Co-authored-by: opyale Reviewed-by: M M Arif --- app/build.gradle | 1 + .../mian/gitnex/activities/MainActivity.java | 210 ++++++++++-------- .../mian/gitnex/clients/PicassoService.java | 10 +- .../gitnex/fragments/ProfileFragment.java | 89 ++++++-- .../mian/gitnex/helpers/ColorInverter.java | 21 +- app/src/main/res/layout/activity_login.xml | 4 +- app/src/main/res/layout/fragment_profile.xml | 123 ++++++---- .../res/layout/list_profile_followers.xml | 4 +- .../res/layout/list_profile_following.xml | 4 +- app/src/main/res/layout/nav_header.xml | 127 ++++++----- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 2 +- 12 files changed, 371 insertions(+), 225 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9031e609..e4a20a3d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -86,5 +86,6 @@ dependencies { implementation "ch.acra:acra-mail:$acra" implementation "ch.acra:acra-limiter:$acra" implementation "ch.acra:acra-notification:$acra" + implementation 'com.eightbitlab:blurview:1.6.3' } diff --git a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java index e56c1d7f..fcb78671 100644 --- a/app/src/main/java/org/mian/gitnex/activities/MainActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/MainActivity.java @@ -12,6 +12,7 @@ import android.os.Bundle; import android.util.Log; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; @@ -22,7 +23,6 @@ import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import com.google.android.material.navigation.NavigationView; -import com.squareup.picasso.NetworkPolicy; import org.mian.gitnex.R; import org.mian.gitnex.clients.PicassoService; import org.mian.gitnex.clients.RetrofitClient; @@ -38,6 +38,7 @@ import org.mian.gitnex.fragments.StarredRepositoriesFragment; import org.mian.gitnex.helpers.AlertDialogs; import org.mian.gitnex.helpers.Authorization; import org.mian.gitnex.helpers.ChangeLog; +import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.helpers.Toasty; import org.mian.gitnex.models.GiteaVersion; @@ -45,6 +46,8 @@ import org.mian.gitnex.models.UserInfo; import org.mian.gitnex.util.AppUtil; import org.mian.gitnex.util.TinyDB; import java.util.Objects; +import eightbitlab.com.blurview.BlurView; +import eightbitlab.com.blurview.RenderScriptBlur; import retrofit2.Call; import retrofit2.Callback; @@ -55,9 +58,12 @@ import retrofit2.Callback; public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener { private DrawerLayout drawer; + private BlurView blurView; private TextView userFullName; private TextView userEmail; private ImageView userAvatar; + private ImageView userAvatarBackground; + private ViewGroup navHeaderFrame; private TextView toolbarTitle; final Context ctx = this; private Context appCtx; @@ -131,6 +137,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig FragmentManager fm = getSupportFragmentManager(); Fragment fragmentById = fm.findFragmentById(R.id.fragment_container); + if(fragmentById instanceof SettingsFragment) { toolbarTitle.setText(getResources().getString(R.string.pageTitleSettings)); } @@ -163,15 +170,10 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); toggle.getDrawerArrowDrawable().setColor(getResources().getColor(R.color.darkGreen)); + drawer.addDrawerListener(toggle); - drawer.addDrawerListener(new DrawerLayout.DrawerListener() { - @Override - public void onDrawerSlide(@NonNull View drawerView, float slideOffset) { - - } - @Override public void onDrawerOpened(@NonNull View drawerView) { @@ -184,78 +186,118 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig String userFullNameNav = tinyDb.getString("userFullname"); String userAvatarNav = tinyDb.getString("userAvatar"); + blurView = hView.findViewById(R.id.blurView); userEmail = hView.findViewById(R.id.userEmail); + userFullName = hView.findViewById(R.id.userFullname); + userAvatar = hView.findViewById(R.id.userAvatar); + userAvatarBackground = hView.findViewById(R.id.userAvatarBackground); + navHeaderFrame = hView.findViewById(R.id.navHeaderFrame); + + userEmail.setTypeface(myTypeface); + userFullName.setTypeface(myTypeface); + + navigationView.getMenu().findItem(R.id.nav_administration).setVisible(tinyDb.getBoolean("userIsAdmin")); + if(!userEmailNav.equals("")) { userEmail.setText(userEmailNav); - userEmail.setTypeface(myTypeface); } - userFullName = hView.findViewById(R.id.userFullname); if(!userFullNameNav.equals("")) { userFullName.setText(userFullNameNav); - userFullName.setTypeface(myTypeface); } - userAvatar = hView.findViewById(R.id.userAvatar); if(!userAvatarNav.equals("")) { - PicassoService.getInstance(ctx).get().load(userAvatarNav).networkPolicy(NetworkPolicy.OFFLINE).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(160, 160).centerCrop().into(userAvatar); + + PicassoService.getInstance(ctx).get() + .load(userAvatarNav) + .placeholder(R.drawable.loader_animated) + .transform(new RoundedTransformation(8, 0)) + .resize(160, 160) + .centerCrop().into(userAvatar); + + PicassoService.getInstance(ctx).get() + .load(userAvatarNav) + .into(userAvatarBackground, new com.squareup.picasso.Callback() { + + @Override + public void onSuccess() { + + int textColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground); + + userFullName.setTextColor(textColor); + userEmail.setTextColor(textColor); + + blurView.setupWith(navHeaderFrame) + .setBlurAlgorithm(new RenderScriptBlur(ctx)) + .setBlurRadius(5) + .setHasFixedTransformationMatrix(false); + + } + + @Override + public void onError(Exception e) {} + + }); + } - userAvatar.setOnClickListener(new View.OnClickListener() { + userAvatar.setOnClickListener(v -> { - public void onClick(View v) { - - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); - drawer.closeDrawers(); - } + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); + drawer.closeDrawers(); }); } @Override - public void onDrawerClosed(@NonNull View drawerView) { - // Called when a drawer has settled in a completely closed state. - } + public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {} @Override - public void onDrawerStateChanged(int newState) { - // Called when the drawer motion state changes. The new state will be one of STATE_IDLE, STATE_DRAGGING or STATE_SETTLING. - } + public void onDrawerClosed(@NonNull View drawerView) {} + + @Override + public void onDrawerStateChanged(int newState) {} + }); toggle.syncState(); if(savedInstanceState == null) { - if(tinyDb.getInt("homeScreenId") == 0) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleMyRepos)); - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit(); - navigationView.setCheckedItem(R.id.nav_home); - } - else if(tinyDb.getInt("homeScreenId") == 1) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos)); - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new StarredRepositoriesFragment()).commit(); - navigationView.setCheckedItem(R.id.nav_starred_repos); - } - else if(tinyDb.getInt("homeScreenId") == 2) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleOrganizations)); - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit(); - navigationView.setCheckedItem(R.id.nav_organizations); - } - else if(tinyDb.getInt("homeScreenId") == 3) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleRepositories)); - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit(); - navigationView.setCheckedItem(R.id.nav_repositories); - } - else if(tinyDb.getInt("homeScreenId") == 4) { - toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); - navigationView.setCheckedItem(R.id.nav_profile); - } - else { - toolbarTitle.setText(getResources().getString(R.string.pageTitleMyRepos)); - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit(); - navigationView.setCheckedItem(R.id.nav_home); + + switch(tinyDb.getInt("homeScreenId")) { + + case 1: + toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos)); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new StarredRepositoriesFragment()).commit(); + navigationView.setCheckedItem(R.id.nav_starred_repos); + break; + + case 2: + toolbarTitle.setText(getResources().getString(R.string.pageTitleOrganizations)); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit(); + navigationView.setCheckedItem(R.id.nav_organizations); + break; + + case 3: + toolbarTitle.setText(getResources().getString(R.string.pageTitleRepositories)); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit(); + navigationView.setCheckedItem(R.id.nav_repositories); + break; + + case 4: + toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); + navigationView.setCheckedItem(R.id.nav_profile); + break; + + default: + toolbarTitle.setText(getResources().getString(R.string.pageTitleMyRepos)); + getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit(); + navigationView.setCheckedItem(R.id.nav_home); + break; + } + } if(!connToInternet) { @@ -269,7 +311,7 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig } else { - displayUserInfo(instanceUrl, instanceToken, loginUid); + loadUserInfo(instanceUrl, instanceToken, loginUid); giteaVersion(instanceUrl); tinyDb.putBoolean("noConnection", false); @@ -314,46 +356,56 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) { switch(menuItem.getItemId()) { + case R.id.nav_home: toolbarTitle.setText(getResources().getString(R.string.pageTitleMyRepos)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new MyRepositoriesFragment()).commit(); break; + case R.id.nav_organizations: toolbarTitle.setText(getResources().getString(R.string.pageTitleOrganizations)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new OrganizationsFragment()).commit(); break; + case R.id.nav_profile: toolbarTitle.setText(getResources().getString(R.string.pageTitleProfile)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); break; + case R.id.nav_repositories: toolbarTitle.setText(getResources().getString(R.string.pageTitleRepositories)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new RepositoriesFragment()).commit(); - break; + case R.id.nav_settings: toolbarTitle.setText(getResources().getString(R.string.pageTitleSettings)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new SettingsFragment()).commit(); break; + case R.id.nav_logout: logout(this, ctx); overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); break; + case R.id.nav_about: toolbarTitle.setText(getResources().getString(R.string.pageTitleAbout)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AboutFragment()).commit(); break; + case R.id.nav_rate_app: rateThisApp(); break; + case R.id.nav_starred_repos: toolbarTitle.setText(getResources().getString(R.string.pageTitleStarredRepos)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new StarredRepositoriesFragment()).commit(); break; + case R.id.nav_explore: toolbarTitle.setText(getResources().getString(R.string.pageTitleExplore)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ExploreRepositoriesFragment()).commit(); break; + case R.id.nav_administration: toolbarTitle.setText(getResources().getString(R.string.pageTitleAdministration)); getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new AdministrationFragment()).commit(); @@ -422,15 +474,12 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig } - private void displayUserInfo(String instanceUrl, String token, String loginUid) { + private void loadUserInfo(String instanceUrl, String token, String loginUid) { final TinyDB tinyDb = new TinyDB(appCtx); Call call = RetrofitClient.getInstance(instanceUrl, ctx).getApiInterface().getUserInfo(Authorization.returnAuthentication(ctx, loginUid, token)); - NavigationView navigationView = findViewById(R.id.nav_view); - final View hView = navigationView.getHeaderView(0); - call.enqueue(new Callback() { @Override @@ -443,12 +492,14 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig if(response.code() == 200) { assert userDetails != null; + if(userDetails.getIs_admin() != null) { tinyDb.putBoolean("userIsAdmin", userDetails.getIs_admin()); - navigationView.getMenu().findItem(R.id.nav_administration).setVisible(userDetails.getIs_admin()); } + tinyDb.putString("userLogin", userDetails.getLogin()); tinyDb.putInt("userId", userDetails.getId()); + if(!userDetails.getFullname().equals("")) { tinyDb.putString("userFullname", userDetails.getFullname()); } @@ -458,51 +509,14 @@ public class MainActivity extends BaseActivity implements NavigationView.OnNavig tinyDb.putString("userEmail", userDetails.getEmail()); tinyDb.putString("userAvatar", userDetails.getAvatar()); + if(userDetails.getLang() != null) { tinyDb.putString("userLang", userDetails.getLang()); } else { tinyDb.putString("userLang", "..."); } - - userAvatar = hView.findViewById(R.id.userAvatar); - if(!Objects.requireNonNull(userDetails).getAvatar().equals("")) { - PicassoService.getInstance(ctx).get().load(userDetails.getAvatar()).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(160, 160).centerCrop().into(userAvatar); - } - else { - userAvatar.setImageResource(R.mipmap.app_logo_round); - } - - userFullName = hView.findViewById(R.id.userFullname); - if(!userDetails.getFullname().equals("")) { - userFullName.setText(userDetails.getFullname()); - } - else if(!userDetails.getLogin().equals("")) { - userFullName.setText(userDetails.getLogin()); - } - else { - userFullName.setText("..."); - } - - userEmail = hView.findViewById(R.id.userEmail); - if(!userDetails.getEmail().equals("")) { - userEmail.setText(userDetails.getEmail()); - } - else { - userEmail.setText("..."); - } - - userAvatar.setOnClickListener(new View.OnClickListener() { - - public void onClick(View v) { - - getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new ProfileFragment()).commit(); - drawer.closeDrawers(); - } - }); - } - } else if(response.code() == 401) { diff --git a/app/src/main/java/org/mian/gitnex/clients/PicassoService.java b/app/src/main/java/org/mian/gitnex/clients/PicassoService.java index c79d9f03..fc76091e 100644 --- a/app/src/main/java/org/mian/gitnex/clients/PicassoService.java +++ b/app/src/main/java/org/mian/gitnex/clients/PicassoService.java @@ -14,16 +14,18 @@ import javax.net.ssl.X509TrustManager; import okhttp3.OkHttpClient; /** - * Author anonTree1417 + * Author opyale */ public class PicassoService { private static PicassoService picassoService; + private static File cachePath; private Picasso picasso; private PicassoService(Context context) { + cachePath = new File(context.getCacheDir() + "/picasso_cache/"); Picasso.Builder builder = new Picasso.Builder(context); try { @@ -45,10 +47,6 @@ public class PicassoService { }); - File cachePath = new File(context.getCacheDir() + "/picasso_cache/"); - //noinspection ResultOfMethodCallIgnored - cachePath.mkdirs(); - picasso = builder.memoryCache(new PicassoCache(cachePath, context)).build(); } @@ -61,7 +59,9 @@ public class PicassoService { public Picasso get() { + cachePath.mkdirs(); return picasso; + } public static synchronized PicassoService getInstance(Context context) { diff --git a/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java b/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java index 26a03a80..0a837637 100644 --- a/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java +++ b/app/src/main/java/org/mian/gitnex/fragments/ProfileFragment.java @@ -3,12 +3,6 @@ package org.mian.gitnex.fragments; import android.content.Context; import android.graphics.Typeface; import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentManager; -import androidx.fragment.app.FragmentStatePagerAdapter; -import androidx.viewpager.widget.ViewPager; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -17,13 +11,24 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentStatePagerAdapter; +import androidx.viewpager.widget.ViewPager; import com.google.android.material.tabs.TabLayout; +import com.squareup.picasso.Callback; import org.mian.gitnex.R; import org.mian.gitnex.activities.MainActivity; import org.mian.gitnex.clients.PicassoService; +import org.mian.gitnex.helpers.ColorInverter; import org.mian.gitnex.helpers.RoundedTransformation; import org.mian.gitnex.util.TinyDB; +import java.util.Locale; import java.util.Objects; +import eightbitlab.com.blurview.BlurView; +import eightbitlab.com.blurview.RenderScriptBlur; /** * Author M M Arif @@ -31,26 +36,67 @@ import java.util.Objects; public class ProfileFragment extends Fragment { - private Context ctx = getContext(); + private Context ctx; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + ctx = getContext(); + View v = inflater.inflate(R.layout.fragment_profile, container, false); setHasOptionsMenu(true); TinyDB tinyDb = new TinyDB(getContext()); + BlurView blurView = v.findViewById(R.id.blurView); TextView userFullName = v.findViewById(R.id.userFullName); + ImageView userAvatarBackground = v.findViewById(R.id.userAvatarBackground); ImageView userAvatar = v.findViewById(R.id.userAvatar); TextView userLogin = v.findViewById(R.id.userLogin); - TextView userEmail = v.findViewById(R.id.userEmail); + TextView userLanguage = v.findViewById(R.id.userLanguage); + + ViewGroup aboutFrame = v.findViewById(R.id.aboutFrame); + + String[] userLanguageCodes = tinyDb.getString("userLang").split("-"); + Locale locale = new Locale(userLanguageCodes[0], userLanguageCodes[1]); + + userFullName.setText(tinyDb.getString("userFullname")); + userLogin.setText(getString(R.string.usernameWithAt, tinyDb.getString("userLogin"))); + userLanguage.setText(locale.getDisplayCountry()); + + PicassoService.getInstance(ctx).get() + .load(tinyDb.getString("userAvatar")) + .transform(new RoundedTransformation(8, 0)) + .placeholder(R.drawable.loader_animated) + .resize(120, 120) + .centerCrop().into(userAvatar); + + PicassoService.getInstance(ctx).get() + .load(tinyDb.getString("userAvatar")) + .into(userAvatarBackground, new Callback() { + + @Override + public void onSuccess() { + + int textColor = new ColorInverter().getImageViewContrastColor(userAvatarBackground); + + userFullName.setTextColor(textColor); + userLogin.setTextColor(textColor); + userLanguage.setTextColor(textColor); + + blurView.setupWith(aboutFrame) + .setBlurAlgorithm(new RenderScriptBlur(ctx)) + .setBlurRadius(3) + .setHasFixedTransformationMatrix(true); + + } + + @Override + public void onError(Exception e) {} + + }); - userFullName.setText(tinyDb.getString("userFullname")); - PicassoService.getInstance(ctx).get().load(tinyDb.getString("userAvatar")).placeholder(R.drawable.loader_animated).transform(new RoundedTransformation(8, 0)).resize(120, 120).centerCrop().into(userAvatar); - userLogin.setText(getString(R.string.usernameWithAt, tinyDb.getString("userLogin"))); - userEmail.setText(tinyDb.getString("userEmail")); ProfileFragment.SectionsPagerAdapter mSectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager()); @@ -79,11 +125,16 @@ public class ProfileFragment extends Fragment { ViewGroup vg = (ViewGroup) tabLayout.getChildAt(0); int tabsCount = vg.getChildCount(); + for (int j = 0; j < tabsCount; j++) { + ViewGroup vgTab = (ViewGroup) vg.getChildAt(j); int tabChildCount = vgTab.getChildCount(); + for (int i = 0; i < tabChildCount; i++) { + View tabViewChild = vgTab.getChildAt(i); + if (tabViewChild instanceof TextView) { ((TextView) tabViewChild).setTypeface(myTypeface); } @@ -108,15 +159,22 @@ public class ProfileFragment extends Fragment { public Fragment getItem(int position) { Fragment fragment = null; + switch (position) { + case 0: // followers return ProfileFollowersFragment.newInstance("repoOwner", "repoName"); + case 1: // following return ProfileFollowingFragment.newInstance("repoOwner", "repoName"); + case 2: // emails return ProfileEmailsFragment.newInstance("repoOwner", "repoName"); + } + return fragment; + } @Override @@ -128,9 +186,11 @@ public class ProfileFragment extends Fragment { @Override public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { + menu.clear(); Objects.requireNonNull(getActivity()).getMenuInflater().inflate(R.menu.profile_dotted_menu, menu); super.onCreateOptionsMenu(menu, inflater); + } @Override @@ -139,17 +199,20 @@ public class ProfileFragment extends Fragment { int id = item.getItemId(); switch (id) { + case android.R.id.home: ((MainActivity)ctx).finish(); return true; + case R.id.profileMenu: BottomSheetProfileFragment bottomSheet = new BottomSheetProfileFragment(); bottomSheet.show(getChildFragmentManager(), "profileBottomSheet"); return true; + default: return super.onOptionsItemSelected(item); - } + } } } diff --git a/app/src/main/java/org/mian/gitnex/helpers/ColorInverter.java b/app/src/main/java/org/mian/gitnex/helpers/ColorInverter.java index 25eb53cc..4eea5dac 100644 --- a/app/src/main/java/org/mian/gitnex/helpers/ColorInverter.java +++ b/app/src/main/java/org/mian/gitnex/helpers/ColorInverter.java @@ -1,6 +1,9 @@ package org.mian.gitnex.helpers; +import android.graphics.Bitmap; import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; +import android.widget.ImageView; import androidx.annotation.ColorInt; /** @@ -16,7 +19,7 @@ public class ColorInverter { int d; if (a < 0.5) { - d = 0; // black + d = 30; // almost black } else { d = 255; // white } @@ -24,4 +27,20 @@ public class ColorInverter { return Color.rgb(d, d, d); } + @ColorInt + public int getImageViewContrastColor(ImageView imageView) { + + if(imageView != null) { + + Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); + return getContrastColor(bitmap.getPixel(bitmap.getWidth() / 2, bitmap.getHeight() / 2)); + + } + else { + + return Color.rgb(255, 255, 255); + } + + } + } diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 56415530..714e5b2a 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -1,8 +1,8 @@ - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_profile.xml b/app/src/main/res/layout/fragment_profile.xml index 0503dba7..775ca4f0 100644 --- a/app/src/main/res/layout/fragment_profile.xml +++ b/app/src/main/res/layout/fragment_profile.xml @@ -10,58 +10,89 @@ + android:layout_height="200dp" + android:gravity="top" + android:orientation="vertical"> - + android:layout_height="match_parent" + android:contentDescription="@string/generalImgContentText" + android:scaleType="centerCrop" /> - + - + - + - + - + + + + + + + + + + + + + + + + @@ -108,4 +139,4 @@ android:layout_height="wrap_content" app:layout_behavior="@string/appbar_scrolling_view_behavior" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/list_profile_followers.xml b/app/src/main/res/layout/list_profile_followers.xml index 6c6208a5..1ada0008 100644 --- a/app/src/main/res/layout/list_profile_followers.xml +++ b/app/src/main/res/layout/list_profile_followers.xml @@ -25,7 +25,6 @@ android:id="@+id/userFullName" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="5dp" android:text="@string/userName" android:textColor="?attr/primaryTextColor" android:textSize="16sp" /> @@ -34,10 +33,9 @@ android:id="@+id/userName" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="5dp" android:text="@string/userName" android:textColor="?attr/primaryTextColor" - android:textSize="16sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/list_profile_following.xml b/app/src/main/res/layout/list_profile_following.xml index 6c6208a5..1ada0008 100644 --- a/app/src/main/res/layout/list_profile_following.xml +++ b/app/src/main/res/layout/list_profile_following.xml @@ -25,7 +25,6 @@ android:id="@+id/userFullName" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="5dp" android:text="@string/userName" android:textColor="?attr/primaryTextColor" android:textSize="16sp" /> @@ -34,10 +33,9 @@ android:id="@+id/userName" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="5dp" android:text="@string/userName" android:textColor="?attr/primaryTextColor" - android:textSize="16sp" /> + android:textSize="14sp" /> diff --git a/app/src/main/res/layout/nav_header.xml b/app/src/main/res/layout/nav_header.xml index a9c78f47..5e271d21 100644 --- a/app/src/main/res/layout/nav_header.xml +++ b/app/src/main/res/layout/nav_header.xml @@ -1,62 +1,83 @@ - + android:layout_height="200dp"> - - - - + android:layout_height="match_parent" + android:contentDescription="@string/generalImgContentText" + android:scaleType="centerCrop" /> - - - - - + android:layout_height="match_parent" + app:blurOverlayColor="@color/blurColor"> - + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index a691ee7d..f3c5c924 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -11,6 +11,7 @@ #000009 #ffffff #1e88ce + #41818181 #009486 #ffffff #1d1d1d diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6f0a1c81..3b340496 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -406,7 +406,7 @@ Email address is already in use Primary Emails - \u0040\u0020%1$s + \u0040%1$s