X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Factivity%2FProfileListActivity.java;h=2fde36402e6dc9303b213638b2642de0015c0931;hp=03088b473a1abd6f463bca9966b40e100ee8c88e;hb=09e26d2279484b4dfe0de218b05f075362fff4b5;hpb=64de9b485d42fee572e012a61601fa8c316fc64d 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 03088b47..2fde3640 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 @@ -1,51 +1,47 @@ /* * Copyright © 2019 Damyan Ivanov. - * This file is part of Mobile-Ledger. - * Mobile-Ledger is free software: you can distribute it and/or modify it + * This file is part of MoLe. + * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your opinion), any later version. * - * Mobile-Ledger is distributed in the hope that it will be useful, + * MoLe is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License terms for details. * * You should have received a copy of the GNU General Public License - * along with Mobile-Ledger. If not, see . + * along with MoLe. If not, see . */ 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.design.widget.FloatingActionButton; -import android.support.v7.app.AppCompatActivity; -import android.support.v7.widget.DividerItemDecoration; -import android.support.v7.widget.RecyclerView; -import android.support.v7.widget.Toolbar; -import android.support.v7.widget.helper.ItemTouchHelper; +import androidx.annotation.NonNull; +import androidx.appcompat.app.ActionBar; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.RecyclerView; +import androidx.appcompat.widget.Toolbar; +import androidx.recyclerview.widget.ItemTouchHelper; import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; import android.view.View; import android.view.ViewGroup; -import android.widget.CompoundButton; import android.widget.RadioButton; 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.MLDB; +import net.ktnx.mobileledger.utils.Colors; import java.util.Collections; -import java.util.List; -import java.util.Observable; -import java.util.Observer; /** * An activity representing a list of Profiles. This activity @@ -55,10 +51,11 @@ import java.util.Observer; * item details. On tablets, the activity presents the list of items and * item details side-by-side using two vertical panes. */ -public class ProfileListActivity extends AppCompatActivity { +public class ProfileListActivity extends CrashReportingActivity { public static final String ARG_ACTION = "action"; - public static final String ARG_PROFILE_INDEX = "profile_uuid"; + public static final String ARG_PROFILE_INDEX = "profile_index"; + public static final int PROFILE_INDEX_NONE = -1; public static final int ACTION_EDIT_PROFILE = 1; public static final int ACTION_INVALID = -1; /** @@ -66,7 +63,13 @@ public class ProfileListActivity extends AppCompatActivity { * device. */ private boolean mTwoPane; + private RecyclerView recyclerView; + @Override + public boolean onSupportNavigateUp() { + onBackPressed(); + return super.onSupportNavigateUp(); + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -75,21 +78,16 @@ public class ProfileListActivity extends AppCompatActivity { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setTitle(getTitle()); + final ActionBar supportActionBar = getSupportActionBar(); + if (supportActionBar != null) { + supportActionBar.setDisplayHomeAsUpEnabled(true); + supportActionBar.setDisplayShowHomeEnabled(true); + } - RecyclerView recyclerView = findViewById(R.id.profile_list); + recyclerView = findViewById(R.id.profile_list); if (recyclerView == null) throw new AssertionError(); setupRecyclerView(recyclerView); - FloatingActionButton fab = findViewById(R.id.fab); - fab.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - ProfilesRecyclerViewAdapter adapter = - (ProfilesRecyclerViewAdapter) recyclerView.getAdapter(); - if (adapter != null) adapter.editProfile(recyclerView, null); - } - }); - if (findViewById(R.id.profile_detail_container) != null) { // The detail container view will be present only in the // large-screen layouts (res/values-w900dp). @@ -101,18 +99,25 @@ public class ProfileListActivity extends AppCompatActivity { int action = getIntent().getIntExtra(ARG_ACTION, ACTION_INVALID); if (action == ACTION_EDIT_PROFILE) { Log.d("profiles", "got edit profile action"); - int index = getIntent().getIntExtra(ARG_PROFILE_INDEX, -1); - if (index >= 0) { - List list = MobileLedgerProfile.loadAllFromDB(); - if (index < list.size()) { - ProfilesRecyclerViewAdapter adapter = - (ProfilesRecyclerViewAdapter) recyclerView.getAdapter(); - if (adapter != null) adapter.editProfile(recyclerView, list.get(index)); - } + int index = getIntent().getIntExtra(ARG_PROFILE_INDEX, PROFILE_INDEX_NONE); + + MobileLedgerProfile profile = (index >= 0) ? Data.profiles.get(index) : null; + ProfilesRecyclerViewAdapter adapter = + (ProfilesRecyclerViewAdapter) recyclerView.getAdapter(); + if (adapter != null) { + adapter.editProfile(recyclerView, profile); + + // if invoked from the initial screen, get out so that when the new profile + // activity finishes the user i navigated to the main activity + if ((profile == null) && Data.profiles.getList().isEmpty()) finish(); } } } - + void launchNewProfileActivity() { + ProfilesRecyclerViewAdapter adapter = + (ProfilesRecyclerViewAdapter) recyclerView.getAdapter(); + if (adapter != null) adapter.editProfile(recyclerView, null); + } private void setupRecyclerView(@NonNull RecyclerView recyclerView) { final ProfilesRecyclerViewAdapter adapter = new ProfilesRecyclerViewAdapter(this, mTwoPane); recyclerView.setAdapter(adapter); @@ -142,31 +147,38 @@ public class ProfileListActivity extends AppCompatActivity { recyclerView.addItemDecoration(new DividerItemDecoration(recyclerView.getContext(), DividerItemDecoration.VERTICAL)); } - + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.profile_list, menu); + menu.findItem(R.id.menu_add_profile).setOnMenuItemClickListener(item -> { + launchNewProfileActivity(); + return true; + }); + return super.onCreateOptionsMenu(menu); + } public static class ProfilesRecyclerViewAdapter extends RecyclerView.Adapter { private final ProfileListActivity mParentActivity; private final boolean mTwoPane; - private final View.OnClickListener mOnClickListener = new View.OnClickListener() { - @Override - public void onClick(View view) { - MobileLedgerProfile item = (MobileLedgerProfile) ((View) view.getParent()).getTag(); - editProfile(view, item); - } + private final View.OnClickListener mOnClickListener = view -> { + MobileLedgerProfile profile = (MobileLedgerProfile) ((View) view.getParent()).getTag(); + editProfile(view, profile); }; ProfilesRecyclerViewAdapter(ProfileListActivity parent, boolean twoPane) { mParentActivity = parent; mTwoPane = twoPane; Data.profiles.addObserver((o, arg) -> { Log.d("profiles", "profile list changed"); - notifyDataSetChanged(); + if (arg == null) notifyDataSetChanged(); + else notifyItemChanged((int) arg); }); } - private void editProfile(View view, MobileLedgerProfile item) { + private void editProfile(View view, MobileLedgerProfile profile) { + int index = Data.profiles.indexOf(profile); if (mTwoPane) { Bundle arguments = new Bundle(); - arguments.putString(ProfileDetailFragment.ARG_ITEM_ID, item.getUuid()); + arguments.putInt(ProfileDetailFragment.ARG_ITEM_ID, index); ProfileDetailFragment fragment = new ProfileDetailFragment(); fragment.setArguments(arguments); mParentActivity.getSupportFragmentManager().beginTransaction() @@ -175,8 +187,8 @@ public class ProfileListActivity extends AppCompatActivity { else { Context context = view.getContext(); Intent intent = new Intent(context, ProfileDetailActivity.class); - intent.putExtra(ProfileDetailFragment.ARG_ITEM_ID, - (item == null) ? null : item.getUuid()); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_USER_ACTION); + if (index != -1) intent.putExtra(ProfileDetailFragment.ARG_ITEM_ID, index); context.startActivity(intent); } @@ -187,13 +199,27 @@ public class ProfileListActivity extends AppCompatActivity { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.profile_list_content, parent, false); ProfileListViewHolder holder = new ProfileListViewHolder(view); - Data.profile.addObserver(new Observer() { - @Override - public void update(Observable o, Object arg) { - MobileLedgerProfile newProfile = Data.profile.get(); - MobileLedgerProfile profile = (MobileLedgerProfile) holder.itemView.getTag(); - holder.mRadioView.setChecked( - newProfile != null && newProfile.getUuid().equals(profile.getUuid())); + + holder.mRadioView.setOnCheckedChangeListener((buttonView, isChecked) -> { + if (!isChecked) return; + Log.d("profiles", + String.format("Item %d got checked", holder.getAdapterPosition())); + MobileLedgerProfile profile = (MobileLedgerProfile) holder.itemView.getTag(); + if (profile != null) { + Log.d("profiles", + String.format("Setting current profile to %s", profile.getUuid())); + Data.setCurrentProfile(profile); + } + }); + View.OnClickListener profileSelector = v -> holder.mRadioView.setChecked(true); + holder.mTitle.setOnClickListener(profileSelector); + holder.mSubTitle.setOnClickListener(profileSelector); + Data.profile.addObserver((o, arg) -> { + MobileLedgerProfile myProfile = (MobileLedgerProfile) holder.itemView.getTag(); + final MobileLedgerProfile currentProfile = Data.profile.get(); + final boolean sameProfile = currentProfile.equals(myProfile); + if (holder.mRadioView.isChecked() != sameProfile) { + holder.mRadioView.setChecked(sameProfile); } }); return holder; @@ -203,26 +229,18 @@ public class ProfileListActivity extends AppCompatActivity { final MobileLedgerProfile profile = Data.profiles.get(position); final MobileLedgerProfile currentProfile = Data.profile.get(); Log.d("profiles", String.format("pos %d: %s, current: %s", position, profile.getUuid(), - currentProfile.getUuid())); - View.OnClickListener profileSelector = v -> holder.mRadioView.setChecked(true); + (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.mTitle.setOnClickListener(profileSelector); holder.mSubTitle.setText(profile.getUrl()); - holder.mSubTitle.setOnClickListener(profileSelector); - holder.mRadioView.setChecked(profile.getUuid().equals(currentProfile.getUuid())); - holder.mRadioView - .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (!isChecked) return; - MLDB.set_option_value(MLDB.OPT_PROFILE_UUID, profile.getUuid()); - Data.profile.set(profile); - } - }); + holder.mRadioView.setChecked(profile.equals(currentProfile)); - holder.itemView.setTag(profile); holder.mEditButton.setOnClickListener(mOnClickListener); - } @Override public int getItemCount() { @@ -231,7 +249,7 @@ public class ProfileListActivity extends AppCompatActivity { 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); @@ -239,6 +257,7 @@ public class ProfileListActivity extends AppCompatActivity { 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); } } }