From b90ee9f0732b38a4ca35265ff68ad69353330f05 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 17 Feb 2019 22:06:52 +0200 Subject: [PATCH] profile color control --- .../ui/activity/ProfileListActivity.java | 14 ++- .../ui/profiles/ProfileDetailFragment.java | 119 +++++++++++++++++- app/src/main/res/layout/profile_detail.xml | 21 ++++ .../main/res/layout/profile_list_content.xml | 17 ++- 4 files changed, 162 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/ProfileListActivity.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/ProfileListActivity.java index 3a4a5154..3d5fef80 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/ProfileListActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/ProfileListActivity.java @@ -19,6 +19,7 @@ package net.ktnx.mobileledger.ui.activity; import android.content.Context; import android.content.Intent; +import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.ActionBar; @@ -37,8 +38,8 @@ import android.widget.TextView; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.MobileLedgerProfile; -import net.ktnx.mobileledger.ui.profiles.ProfileDetailActivity; import net.ktnx.mobileledger.ui.profiles.ProfileDetailFragment; +import net.ktnx.mobileledger.utils.Colors; import java.util.Collections; @@ -101,7 +102,8 @@ public class ProfileListActivity extends CrashReportingActivity { int index = getIntent().getIntExtra(ARG_PROFILE_INDEX, PROFILE_INDEX_NONE); MobileLedgerProfile profile = (index >= 0) ? Data.profiles.get(index) : null; - ProfilesRecyclerViewAdapter adapter = (ProfilesRecyclerViewAdapter) recyclerView.getAdapter(); + ProfilesRecyclerViewAdapter adapter = + (ProfilesRecyclerViewAdapter) recyclerView.getAdapter(); if (adapter != null) { adapter.editProfile(recyclerView, profile); @@ -229,6 +231,11 @@ public class ProfileListActivity extends CrashReportingActivity { Log.d("profiles", String.format("pos %d: %s, current: %s", position, profile.getUuid(), (currentProfile == null) ? "" : currentProfile.getUuid())); holder.itemView.setTag(profile); + + int hue = profile.getThemeId(); + if (hue == -1) holder.mColorTag.setBackgroundColor(Color.TRANSPARENT); + else holder.mColorTag.setBackgroundColor(Colors.getPrimaryColorForHue(hue)); + holder.mTitle.setText(profile.getName()); holder.mSubTitle.setText(profile.getUrl()); holder.mRadioView.setChecked(profile.equals(currentProfile)); @@ -242,7 +249,7 @@ public class ProfileListActivity extends CrashReportingActivity { class ProfileListViewHolder extends RecyclerView.ViewHolder { final RadioButton mRadioView; final TextView mEditButton; - final TextView mTitle, mSubTitle; + final TextView mTitle, mSubTitle, mColorTag; ProfileListViewHolder(View view) { super(view); @@ -250,6 +257,7 @@ public class ProfileListActivity extends CrashReportingActivity { mEditButton = view.findViewById(R.id.profile_list_edit_button); mTitle = view.findViewById(R.id.title); mSubTitle = view.findViewById(R.id.subtitle); + mColorTag = view.findViewById(R.id.colorTag); } } } diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java b/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java index f26d2694..a4dd025c 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/profiles/ProfileDetailFragment.java @@ -18,7 +18,10 @@ package net.ktnx.mobileledger.ui.profiles; import android.app.Activity; +import android.content.Context; +import android.os.Build; import android.os.Bundle; +import android.support.annotation.ColorInt; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.design.widget.CollapsingToolbarLayout; @@ -34,14 +37,23 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.LinearLayout; +import android.widget.Spinner; import android.widget.Switch; import android.widget.TextView; import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.MobileLedgerProfile; +import net.ktnx.mobileledger.ui.activity.ProfileDetailActivity; import net.ktnx.mobileledger.ui.activity.ProfileListActivity; +import net.ktnx.mobileledger.utils.Colors; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; /** * A fragment representing a single Profile detail screen. @@ -72,6 +84,7 @@ public class ProfileDetailFragment extends Fragment { private TextView profileName; private TextInputLayout profileNameLayout; private FloatingActionButton fab; + private Spinner colorSpinner; /** * Mandatory empty constructor for the fragment manager to instantiate the @@ -131,6 +144,8 @@ public class ProfileDetailFragment extends Fragment { mProfile.setAuthEnabled(useAuthentication.isChecked()); mProfile.setAuthUserName(userName.getText()); mProfile.setAuthPassword(password.getText()); + mProfile.setThemeId(colorSpinner.getSelectedItem()); +// Log.d("profiles", String.format("Selected item is %d", mProfile.getThemeId())); mProfile.storeInDB(); Log.d("profiles", "profile stored in DB"); Data.profiles.triggerItemChangedNotification(mProfile); @@ -142,9 +157,11 @@ public class ProfileDetailFragment extends Fragment { } } else { - mProfile = new MobileLedgerProfile(profileName.getText(), postingPermitted.isChecked(), - url.getText(), useAuthentication.isChecked(), userName.getText(), - password.getText()); + mProfile = + new MobileLedgerProfile(profileName.getText(), postingPermitted.isChecked(), + url.getText(), useAuthentication.isChecked(), userName.getText(), + password.getText(), + Integer.valueOf((String) colorSpinner.getSelectedItem())); mProfile.storeInDB(); Data.profiles.add(mProfile); MobileLedgerProfile.storeProfilesOrder(); @@ -175,6 +192,48 @@ public class ProfileDetailFragment extends Fragment { userNameLayout = rootView.findViewById(R.id.auth_user_name_layout); password = rootView.findViewById(R.id.password); passwordLayout = rootView.findViewById(R.id.password_layout); + colorSpinner = rootView.findViewById(R.id.colorSpinner); + + ArrayAdapter adapter = ColorListAdapter + .createFromResource(rootView.getContext(), R.array.profile_colors, + R.layout.color_selector_item); +// Log.d("profiles", String.format("color count: %s", adapter.getCount())); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + colorSpinner.setAdapter(adapter); + colorSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onNothingSelected(AdapterView parent) { + + } + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + final int primaryColor; + final int degrees = + Integer.valueOf((String) (parent.getAdapter().getItem(position))); + if (degrees < 0) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (getActivity() != null) primaryColor = getResources() + .getColor(R.color.colorPrimary, getActivity().getTheme()); + else primaryColor = Colors.getPrimaryColorForHue(Colors.DEFAULT_HUE_DEG); + } + else { + primaryColor = getResources().getColor(R.color.colorPrimary); + } + } + else primaryColor = Colors.getPrimaryColorForHue(degrees); + + if (colorSpinner != null) { + colorSpinner.setBackgroundColor(primaryColor); +// for (int i = 0; i < colorSpinner.getChildCount(); i++) { +// View v = colorSpinner.getChildAt(i); +// +// if (v instanceof TextView) { +// ((TextView) v).setTextColor(Color.TRANSPARENT); +// } +// } + } + } + }); useAuthentication.setOnCheckedChangeListener((buttonView, isChecked) -> { Log.d("profiles", isChecked ? "auth enabled " : "auth disabled"); @@ -195,6 +254,21 @@ public class ProfileDetailFragment extends Fragment { authParams.setVisibility(mProfile.isAuthEnabled() ? View.VISIBLE : View.GONE); userName.setText(mProfile.isAuthEnabled() ? mProfile.getAuthUserName() : ""); password.setText(mProfile.isAuthEnabled() ? mProfile.getAuthPassword() : ""); + + colorSpinner.setSelection(0); + int i = 0; + int sought = mProfile.getThemeId(); +// Log.d("profiles", String.format("Looking for %d",sought)); + while (i < adapter.getCount()) { + int item = Integer.valueOf(String.valueOf(adapter.getItem(i))); +// Log.d("profiles", String.format("Item %d is %d", i, item)); + if (item == sought) { + colorSpinner.setSelection(i); + break; + } + + i++; + } } else { profileName.setText(""); @@ -204,6 +278,7 @@ public class ProfileDetailFragment extends Fragment { authParams.setVisibility(View.GONE); userName.setText(""); password.setText(""); + colorSpinner.setSelection(0); } return rootView; @@ -257,4 +332,42 @@ public class ProfileDetailFragment extends Fragment { return valid; } + private class ColorListAdapter extends ArrayAdapter { + public ColorListAdapter(@NonNull Context context, int resource) { + super(context, resource); + } + public ColorListAdapter(@NonNull Context context, int resource, int textViewResourceId) { + super(context, resource, textViewResourceId); + } + public ColorListAdapter(@NonNull Context context, int resource, @NonNull String[] objects) { + super(context, resource, objects); + } + public ColorListAdapter(@NonNull Context context, int resource, int textViewResourceId, + @NonNull String[] objects) { + super(context, resource, textViewResourceId, objects); + } + public ColorListAdapter(@NonNull Context context, int resource, + @NonNull List objects) { + super(context, resource, objects); + } + public ColorListAdapter(@NonNull Context context, int resource, int textViewResourceId, + @NonNull List objects) { + super(context, resource, textViewResourceId, objects); + } + @NotNull + @Override + public View getView(int position, View convertView, @NotNull ViewGroup parent) { + String hueStr = getItem(position); + int hue = (hueStr == null) ? -1 : Integer.valueOf(hueStr); + @ColorInt int primaryColor = Colors.getPrimaryColorForHue(hue); + + View view = convertView; + if (convertView == null) { + view = getLayoutInflater().inflate(R.layout.color_selector_item, parent); + } + + view.setBackgroundColor(primaryColor); + return view; + } + } } diff --git a/app/src/main/res/layout/profile_detail.xml b/app/src/main/res/layout/profile_detail.xml index b66a712f..b69e518a 100644 --- a/app/src/main/res/layout/profile_detail.xml +++ b/app/src/main/res/layout/profile_detail.xml @@ -118,6 +118,27 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/profile_list_content.xml b/app/src/main/res/layout/profile_list_content.xml index 77d939b2..f5b26d0c 100644 --- a/app/src/main/res/layout/profile_list_content.xml +++ b/app/src/main/res/layout/profile_list_content.xml @@ -23,8 +23,16 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" - android:foregroundGravity="center_vertical" - android:paddingVertical="@dimen/nav_header_vertical_spacing"> + android:foregroundGravity="center_vertical"> + + + app:layout_constraintTop_toTopOf="parent" + tools:ignore="HardcodedText" />