import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
-import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
+import androidx.appcompat.app.ActionBarDrawerToggle;
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.view.GravityCompat;
+import androidx.drawerlayout.widget.DrawerLayout;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import androidx.viewpager.widget.ViewPager;
+
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import net.ktnx.mobileledger.R;
import java.util.Date;
import java.util.List;
import java.util.Locale;
-import java.util.Observer;
-
-import androidx.appcompat.app.ActionBarDrawerToggle;
-import androidx.appcompat.widget.Toolbar;
-import androidx.core.view.GravityCompat;
-import androidx.drawerlayout.widget.DrawerLayout;
-import androidx.fragment.app.Fragment;
-import androidx.fragment.app.FragmentManager;
-import androidx.fragment.app.FragmentPagerAdapter;
-import androidx.recyclerview.widget.LinearLayoutManager;
-import androidx.recyclerview.widget.RecyclerView;
-import androidx.viewpager.widget.ViewPager;
import static net.ktnx.mobileledger.utils.Logger.debug;
private static final String PREF_THEME_ID = "themeId";
public AccountSummaryFragment mAccountSummaryFragment;
DrawerLayout drawer;
- private LinearLayout profileListContainer;
- private View profileListHeadArrow, profileListHeadMore, profileListHeadCancel;
- private FragmentManager fragmentManager;
+ private View profileListHeadMore, profileListHeadCancel, profileListHeadAddProfile;
private View bTransactionListCancelDownload;
- private ProgressBar progressBar;
- private LinearLayout progressLayout;
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
private FloatingActionButton fab;
- private boolean profileListExpanded = false;
private ProfilesRecyclerViewAdapter mProfileListAdapter;
private int mCurrentPage;
- private String mAccountFilter;
private boolean mBackMeansToAccountList = false;
private Toolbar mToolbar;
private DrawerLayout.SimpleDrawerListener drawerListener;
private ActionBarDrawerToggle barDrawerToggle;
private ViewPager.SimpleOnPageChangeListener pageChangeListener;
- private Observer editingProfilesObserver;
private MobileLedgerProfile profile;
@Override
protected void onStart() {
super.onStart();
- debug("flow", "MainActivity.onStart()");
mViewPager.setCurrentItem(mCurrentPage, false);
- if (mAccountFilter != null) showTransactionsFragment(mAccountFilter);
- else Data.accountFilter.setValue(null);
-
}
@Override
protected void onSaveInstanceState(@NotNull Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_CURRENT_PAGE, mViewPager.getCurrentItem());
- if (mAccountFilter != null) outState.putString(STATE_ACC_FILTER, mAccountFilter);
+ if (Data.accountFilter.getValue() != null)
+ outState.putString(STATE_ACC_FILTER, Data.accountFilter.getValue());
}
@Override
protected void onDestroy() {
barDrawerToggle = null;
if (mViewPager != null) mViewPager.removeOnPageChangeListener(pageChangeListener);
pageChangeListener = null;
- if (mProfileListAdapter != null)
- mProfileListAdapter.deleteEditingProfilesObserver(editingProfilesObserver);
- editingProfilesObserver = null;
super.onDestroy();
}
@Override
storeThemeIdInPrefs(profileColor);
}
@Override
+ protected void onResume() {
+ super.onResume();
+ fabShouldShow();
+ }
+ @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
debug("flow", "MainActivity.onCreate()");
setContentView(R.layout.activity_main);
fab = findViewById(R.id.btn_add_transaction);
- profileListContainer = findViewById(R.id.nav_profile_list_container);
- profileListHeadArrow = findViewById(R.id.nav_profiles_arrow);
profileListHeadMore = findViewById(R.id.nav_profiles_start_edit);
profileListHeadCancel = findViewById(R.id.nav_profiles_cancel_edit);
LinearLayout profileListHeadMoreAndCancel =
findViewById(R.id.nav_profile_list_head_buttons);
+ profileListHeadAddProfile = findViewById(R.id.nav_new_profile_button);
drawer = findViewById(R.id.drawer_layout);
bTransactionListCancelDownload = findViewById(R.id.transaction_list_cancel_download);
- progressBar = findViewById(R.id.transaction_list_progress_bar);
- progressLayout = findViewById(R.id.transaction_progress_layout);
- fragmentManager = getSupportFragmentManager();
- mSectionsPagerAdapter = new SectionsPagerAdapter(fragmentManager);
+ mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = findViewById(R.id.root_frame);
Bundle extra = getIntent().getBundleExtra(BUNDLE_SAVED_STATE);
e.printStackTrace();
}
- if (progressBar == null)
- throw new RuntimeException("Can't get hold on the transaction value progress bar");
- if (progressLayout == null) throw new RuntimeException(
- "Can't get hold on the transaction value progress bar layout");
-
markDrawerItemCurrent(R.id.nav_account_summary);
mViewPager.setAdapter(mSectionsPagerAdapter);
pageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
+ mCurrentPage = position;
switch (position) {
case 0:
markDrawerItemCurrent(R.id.nav_account_summary);
if (currentPage != -1) {
mCurrentPage = currentPage;
}
- mAccountFilter = savedInstanceState.getString(STATE_ACC_FILTER, null);
+ Data.accountFilter.setValue(savedInstanceState.getString(STATE_ACC_FILTER, null));
}
- else mAccountFilter = null;
Data.lastUpdateDate.observe(this, this::updateLastUpdateDisplay);
if (mProfileListAdapter == null) mProfileListAdapter = new ProfilesRecyclerViewAdapter();
root.setAdapter(mProfileListAdapter);
- if (editingProfilesObserver == null) {
- editingProfilesObserver = (o, arg) -> {
- if (mProfileListAdapter.isEditingProfiles()) {
- profileListHeadMore.setVisibility(View.GONE);
- profileListHeadMore
- .startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_out));
- profileListHeadCancel.setVisibility(View.VISIBLE);
- profileListHeadCancel
- .startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in));
+ mProfileListAdapter.editingProfiles.observe(this, newValue -> {
+ if (newValue) {
+ profileListHeadMore.setVisibility(View.GONE);
+ profileListHeadCancel.setVisibility(View.VISIBLE);
+ profileListHeadAddProfile.setVisibility(View.VISIBLE);
+ if (drawer.isDrawerOpen(GravityCompat.START)) {
+ profileListHeadMore.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_out));
+ profileListHeadCancel.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_in));
+ profileListHeadAddProfile.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_in));
}
- else {
- profileListHeadCancel.setVisibility(View.GONE);
- profileListHeadCancel
- .startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_out));
- profileListHeadMore.setVisibility(View.GONE);
- if (profileListExpanded) {
- profileListHeadMore.setVisibility(View.VISIBLE);
- profileListHeadMore
- .startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in));
- }
- else profileListHeadMore.setVisibility(View.GONE);
+ }
+ else {
+ profileListHeadCancel.setVisibility(View.GONE);
+ profileListHeadMore.setVisibility(View.VISIBLE);
+ profileListHeadAddProfile.setVisibility(View.GONE);
+ if (drawer.isDrawerOpen(GravityCompat.START)) {
+ profileListHeadCancel.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_out));
+ profileListHeadMore.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_in));
+ profileListHeadAddProfile.startAnimation(
+ AnimationUtils.loadAnimation(MainActivity.this, R.anim.fade_out));
}
- };
- mProfileListAdapter.addEditingProfilesObserver(editingProfilesObserver);
- }
+ }
+
+ mProfileListAdapter.notifyDataSetChanged();
+ });
LinearLayoutManager llm = new LinearLayoutManager(this);
profileListHeadCancel.setOnClickListener((v) -> mProfileListAdapter.flipEditingProfiles());
profileListHeadMoreAndCancel
.setOnClickListener((v) -> mProfileListAdapter.flipEditingProfiles());
-
if (drawerListener == null) {
drawerListener = new DrawerLayout.SimpleDrawerListener() {
@Override
public void onDrawerClosed(View drawerView) {
super.onDrawerClosed(drawerView);
- collapseProfileList();
+ mProfileListAdapter.setAnimationsEnabled(false);
+ mProfileListAdapter.editingProfiles.setValue(false);
+ }
+ @Override
+ public void onDrawerOpened(View drawerView) {
+ super.onDrawerOpened(drawerView);
+ mProfileListAdapter.setAnimationsEnabled(true);
}
};
drawer.addDrawerListener(drawerListener);
}
-
- findViewById(R.id.nav_profile_list_head_layout)
- .setOnClickListener(this::navProfilesHeadClicked);
- findViewById(R.id.nav_profiles_label).setOnClickListener(this::navProfilesHeadClicked);
setupProfile();
}
private void scheduleDataRetrievalIfStale(Date lastUpdate) {
}
}
private void createShortcuts(List<MobileLedgerProfile> list) {
- if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) return;
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1) return;
List<ShortcutInfo> shortcuts = new ArrayList<>();
int i = 0;
// data sets below
return;
}
- collapseProfileList();
drawer.closeDrawers();
}
else {
debug("fragments", String.format(Locale.ENGLISH, "manager stack: %d",
- fragmentManager.getBackStackEntryCount()));
+ getSupportFragmentManager().getBackStackEntryCount()));
super.onBackPressed();
}
}
public void onRetrieveDone(String error) {
Data.transactionRetrievalDone();
- progressLayout.setVisibility(View.GONE);
+ findViewById(R.id.transaction_progress_layout).setVisibility(View.GONE);
if (error == null) {
updateLastUpdateTextFromDB();
else Toast.makeText(this, error, Toast.LENGTH_LONG).show();
}
public void onRetrieveStart() {
+ ProgressBar progressBar = findViewById(R.id.transaction_list_progress_bar);
bTransactionListCancelDownload.setEnabled(true);
- progressBar.setIndeterminateTintList(ColorStateList.valueOf(Colors.primary));
- progressBar.setProgressTintList(ColorStateList.valueOf(Colors.primary));
+ ColorStateList csl = Colors.getColorStateList();
+ progressBar.setIndeterminateTintList(csl);
+ progressBar.setProgressTintList(csl);
progressBar.setIndeterminate(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) progressBar.setProgress(0, false);
else progressBar.setProgress(0);
- progressLayout.setVisibility(View.VISIBLE);
+ findViewById(R.id.transaction_progress_layout).setVisibility(View.VISIBLE);
}
public void onRetrieveProgress(RetrieveTransactionsTask.Progress progress) {
+ ProgressBar progressBar = findViewById(R.id.transaction_list_progress_bar);
if ((progress.getTotal() == RetrieveTransactionsTask.Progress.INDETERMINATE) ||
(progress.getTotal() == 0))
{
public void fabHide() {
fab.hide();
}
- public void navProfilesHeadClicked(View view) {
- if (profileListExpanded) {
- collapseProfileList();
- }
- else {
- expandProfileList();
- }
- }
- private void expandProfileList() {
- profileListExpanded = true;
-
-
- profileListContainer.setVisibility(View.VISIBLE);
- profileListContainer.startAnimation(AnimationUtils.loadAnimation(this, R.anim.slide_down));
- profileListHeadArrow.startAnimation(AnimationUtils.loadAnimation(this, R.anim.rotate_180));
- profileListHeadMore.setVisibility(View.VISIBLE);
- profileListHeadMore.startAnimation(AnimationUtils.loadAnimation(this, R.anim.fade_in));
- final ArrayList<MobileLedgerProfile> profiles = Data.profiles.getValue();
- findViewById(R.id.nav_profile_list).setMinimumHeight(
- (int) (getResources().getDimension(R.dimen.thumb_row_height) *
- (profiles != null ? profiles.size() : 0)));
- }
- private void collapseProfileList() {
- boolean wasExpanded = profileListExpanded;
- profileListExpanded = false;
-
- if (wasExpanded) {
- final Animation animation = AnimationUtils.loadAnimation(this, R.anim.slide_up);
- animation.setAnimationListener(new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
-
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- profileListContainer.setVisibility(View.GONE);
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
-
- }
- });
- mProfileListAdapter.stopEditingProfiles();
-
- profileListContainer.startAnimation(animation);
- profileListHeadArrow.setRotation(0f);
- profileListHeadArrow
- .startAnimation(AnimationUtils.loadAnimation(this, R.anim.rotate_180_back));
- final Animation moreAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_out);
- moreAnimation.setAnimationListener(new Animation.AnimationListener() {
- @Override
- public void onAnimationStart(Animation animation) {
- }
- @Override
- public void onAnimationEnd(Animation animation) {
- profileListHeadMore.setVisibility(View.GONE);
- }
- @Override
- public void onAnimationRepeat(Animation animation) {
- }
- });
- profileListHeadMore.startAnimation(moreAnimation);
- }
- else {
- profileListContainer.setVisibility(View.GONE);
- profileListHeadArrow.setRotation(0f);
- profileListHeadMore.setVisibility(View.GONE);
- }
- }
public void onAccountSummaryRowViewClicked(View view) {
ViewGroup row;
if (view.getId() == R.id.account_expander) row = (ViewGroup) view.getParent().getParent();