X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Factivity%2FMainActivity.java;h=0fe1402687540ce20327e5e82cd22fcb8cfbeec1;hp=5615a2c77fe893eec7ff0cb86f303fe1fc40738f;hb=998dd32a089d199a2569069415755eb3169b35b0;hpb=58da72a8ebdbfb80e643084e6730afafa2e06f34 diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java index 5615a2c7..0fe14026 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java @@ -1,28 +1,28 @@ /* * 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.Intent; -import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.os.Build; import android.os.Bundle; import android.support.annotation.ColorInt; +import android.support.design.widget.FloatingActionButton; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; @@ -33,36 +33,28 @@ import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; -import android.view.ContextMenu; -import android.view.MenuItem; import android.view.View; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import android.widget.Toast; import net.ktnx.mobileledger.R; +import net.ktnx.mobileledger.async.RefreshDescriptionsTask; import net.ktnx.mobileledger.async.RetrieveTransactionsTask; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerAccount; import net.ktnx.mobileledger.model.MobileLedgerProfile; -import net.ktnx.mobileledger.ui.MobileLedgerListFragment; import net.ktnx.mobileledger.ui.account_summary.AccountSummaryFragment; import net.ktnx.mobileledger.ui.transaction_list.TransactionListFragment; import net.ktnx.mobileledger.utils.MLDB; import java.lang.ref.WeakReference; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; +import java.text.DateFormat; import java.util.Date; -import java.util.Observable; -import java.util.Observer; -import java.util.UUID; public class MainActivity extends AppCompatActivity { - public MobileLedgerListFragment currentFragment = null; DrawerLayout drawer; - private AccountSummaryFragment accountSummaryFragment; - private TransactionListFragment transactionListFragment; private FragmentManager fragmentManager; private TextView tvLastUpdate; private RetrieveTransactionsTask retrieveTransactionsTask; @@ -71,6 +63,7 @@ public class MainActivity extends AppCompatActivity { private LinearLayout progressLayout; private SectionsPagerAdapter mSectionsPagerAdapter; private ViewPager mViewPager; + private FloatingActionButton fab; @Override protected void onStart() { @@ -96,41 +89,25 @@ public class MainActivity extends AppCompatActivity { setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); - - Data.profile.addObserver(new Observer() { - @Override - public void update(Observable o, Object arg) { - MobileLedgerProfile profile = Data.profile.get(); - runOnUiThread(() -> { - if (profile == null) toolbar.setSubtitle(""); - else toolbar.setSubtitle(profile.getName()); - }); - } + fab = findViewById(R.id.btn_add_transaction); + + Data.profile.addObserver((o, arg) -> { + MobileLedgerProfile profile = Data.profile.get(); + runOnUiThread(() -> { + if (profile == null) setTitle(R.string.app_name); + else setTitle(profile.getName()); + updateLastUpdateTextFromDB(); + if (profile.isPostingPermitted()) { + toolbar.setSubtitle(null); + fab.show(); + } + else { + toolbar.setSubtitle(R.string.profile_subitlte_read_only); + fab.hide(); + } + }); }); - String profileUUID = MLDB.get_option_value(MLDB.OPT_PROFILE_UUID, null); - if (profileUUID == null) { - SharedPreferences backend = getSharedPreferences("backend", MODE_PRIVATE); - Log.d("profiles", "Migrating from preferences to profiles"); - // migration to multiple profiles - profileUUID = UUID.randomUUID().toString(); - MobileLedgerProfile profile = new MobileLedgerProfile(profileUUID, "default", - backend.getString("backend_url", ""), - backend.getBoolean("backend_use_http_auth", false), - backend.getString("backend_auth_user", null), - backend.getString("backend_auth_password", null)); - profile.storeInDB(); - SharedPreferences.Editor editor = backend.edit(); - editor.clear(); - editor.apply(); - Data.profile.set(profile); - MLDB.set_option_value(MLDB.OPT_PROFILE_UUID, profileUUID); - } - else { - MobileLedgerProfile profile = MobileLedgerProfile.loadUUIDFromDB(profileUUID); - Data.profile.set(profile); - } - drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, @@ -138,7 +115,7 @@ public class MainActivity extends AppCompatActivity { drawer.addDrawerListener(toggle); toggle.syncState(); - android.widget.TextView ver = drawer.findViewById(R.id.drawer_version_text); + TextView ver = drawer.findViewById(R.id.drawer_version_text); try { PackageInfo pi = @@ -162,6 +139,8 @@ public class MainActivity extends AppCompatActivity { fragmentManager = getSupportFragmentManager(); mSectionsPagerAdapter = new SectionsPagerAdapter(fragmentManager); + markDrawerItemCurrent(R.id.nav_account_summary); + mViewPager = findViewById(R.id.root_frame); mViewPager.setAdapter(mSectionsPagerAdapter); mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @@ -182,54 +161,78 @@ public class MainActivity extends AppCompatActivity { } }); - Data.lastUpdateDate.addObserver(new Observer() { - @Override - public void update(Observable o, Object arg) { - Log.d("main", "lastUpdateDate changed"); - runOnUiThread(() -> { - Date date = Data.lastUpdateDate.get(); - if (date == null) { - tvLastUpdate.setText(R.string.transaction_last_update_never); - } - else { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - tvLastUpdate.setText(date.toInstant().atZone(ZoneId.systemDefault()) - .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); - } - else { - tvLastUpdate.setText(date.toLocaleString()); - } - } - }); - } + Data.lastUpdateDate.addObserver((o, arg) -> { + Log.d("main", "lastUpdateDate changed"); + runOnUiThread(() -> { + Date date = Data.lastUpdateDate.get(); + if (date == null) { + tvLastUpdate.setText(R.string.transaction_last_update_never); + } + else { + final String text = DateFormat.getDateTimeInstance().format(date); + tvLastUpdate.setText(text); + Log.d("despair", String.format("Date formatted: %s", text)); + } + }); }); + + findViewById(R.id.btn_no_profiles_add).setOnClickListener(v -> startAddProfileActivity()); + + findViewById(R.id.btn_add_transaction).setOnClickListener(this::fabNewTransactionClicked); + } + @Override + protected void onResume() { + super.onResume(); + setupProfile(); + } + private void startAddProfileActivity() { + Intent intent = new Intent(this, ProfileListActivity.class); + Bundle args = new Bundle(); + args.putInt(ProfileListActivity.ARG_ACTION, ProfileListActivity.ACTION_EDIT_PROFILE); + args.putInt(ProfileListActivity.ARG_PROFILE_INDEX, ProfileListActivity.PROFILE_INDEX_NONE); + intent.putExtras(args); + startActivity(intent, args); + } + private void setupProfile() { + String profileUUID = MLDB.getOption(MLDB.OPT_PROFILE_UUID, null); + MobileLedgerProfile profile; + + profile = MobileLedgerProfile.loadAllFromDB(profileUUID); + + if (Data.profiles.getList().isEmpty()) { + findViewById(R.id.no_profiles_layout).setVisibility(View.VISIBLE); + findViewById(R.id.pager_layout).setVisibility(View.GONE); + return; + } + + findViewById(R.id.pager_layout).setVisibility(View.VISIBLE); + findViewById(R.id.no_profiles_layout).setVisibility(View.GONE); + + if (profile == null) profile = Data.profiles.get(0); + + if (profile == null) throw new AssertionError("profile must have a value"); + + Data.setCurrentProfile(profile); } - public void fab_new_transaction_clicked(View view) { + public void fabNewTransactionClicked(View view) { Intent intent = new Intent(this, NewTransactionActivity.class); startActivity(intent); overridePendingTransition(R.anim.slide_in_right, R.anim.dummy); } - - public void nav_exit_clicked(View view) { - Log.w("app", "exiting"); - finish(); - } - - public void nav_settings_clicked(View view) { + public void navSettingsClicked(View view) { Intent intent = new Intent(this, SettingsActivity.class); startActivity(intent); + drawer.closeDrawers(); } public void markDrawerItemCurrent(int id) { TextView item = drawer.findViewById(id); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - item.setBackgroundColor(getResources().getColor(R.color.table_row_even_bg, getTheme())); + item.setBackgroundColor(getResources().getColor(R.color.table_row_dark_bg, getTheme())); } else { - item.setBackgroundColor(getResources().getColor(R.color.table_row_even_bg)); + item.setBackgroundColor(getResources().getColor(R.color.table_row_dark_bg)); } - setTitle(item.getText()); - @ColorInt int transparent = getResources().getColor(android.R.color.transparent); LinearLayout actions = drawer.findViewById(R.id.nav_actions); @@ -240,39 +243,6 @@ public class MainActivity extends AppCompatActivity { } } } - public void onOptionsMenuClicked(MenuItem menuItem) { - ContextMenu.ContextMenuInfo info = menuItem.getMenuInfo(); - switch (menuItem.getItemId()) { - case R.id.menu_acc_summary_cancel_selection: - if (accountSummaryFragment != null) - accountSummaryFragment.onCancelAccSelection(menuItem); - break; - case R.id.menu_acc_summary_confirm_selection: - if (accountSummaryFragment != null) - accountSummaryFragment.onConfirmAccSelection(menuItem); - break; - case R.id.menu_acc_summary_only_starred: - if (accountSummaryFragment != null) - accountSummaryFragment.onShowOnlyStarredClicked(menuItem); - break; - case R.id.menu_transaction_list_filter: - if (transactionListFragment != null) - transactionListFragment.onShowFilterClick(menuItem); - break; - default: - Log.e("menu", String.format("Menu item %d not handled", menuItem.getItemId())); - } - } - public void onViewClicked(View view) { - switch (view.getId()) { - case R.id.clearAccountNameFilter: - if (transactionListFragment != null) - transactionListFragment.onClearAccountNameClick(view); - break; - default: - Log.e("click", String.format("View %d click not handled", view.getId())); - } - } public void onAccountSummaryClicked(View view) { drawer.closeDrawers(); @@ -280,6 +250,7 @@ public class MainActivity extends AppCompatActivity { } private void showAccountSummaryFragment() { mViewPager.setCurrentItem(0, true); + TransactionListFragment.accountFilter.set(null); // FragmentTransaction ft = fragmentManager.beginTransaction(); // accountSummaryFragment = new AccountSummaryFragment(); // ft.replace(R.id.root_frame, accountSummaryFragment); @@ -295,6 +266,7 @@ public class MainActivity extends AppCompatActivity { // fragmentManager.popBackStack(0, FragmentManager.POP_BACK_STACK_INCLUSIVE); } private void showTransactionsFragment(LedgerAccount account) { + if (account != null) TransactionListFragment.accountFilter.set(account.getName()); mViewPager.setCurrentItem(1, true); // FragmentTransaction ft = fragmentManager.beginTransaction(); // if (transactionListFragment == null) { @@ -332,7 +304,9 @@ public class MainActivity extends AppCompatActivity { } public void updateLastUpdateTextFromDB() { { - long last_update = MLDB.get_option_value(MLDB.OPT_TRANSACTION_LIST_STAMP, 0L); + final MobileLedgerProfile profile = Data.profile.get(); + long last_update = + (profile != null) ? profile.getLongOption(MLDB.OPT_LAST_SCRAPE, 0L) : 0; Log.d("transactions", String.format("Last update = %d", last_update)); if (last_update == 0) { @@ -344,6 +318,8 @@ public class MainActivity extends AppCompatActivity { } } public void scheduleTransactionListRetrieval() { + if (Data.profile.get() == null) return; + retrieveTransactionsTask = new RetrieveTransactionsTask(new WeakReference<>(this)); retrieveTransactionsTask.execute(); @@ -354,9 +330,15 @@ public class MainActivity extends AppCompatActivity { if (retrieveTransactionsTask != null) retrieveTransactionsTask.cancel(false); bTransactionListCancelDownload.setEnabled(false); } - public void onRetrieveDone(boolean success) { + public void onRetrieveDone(String error) { progressLayout.setVisibility(View.GONE); - updateLastUpdateTextFromDB(); + + if (error == null) { + updateLastUpdateTextFromDB(); + + new RefreshDescriptionsTask().execute(); + } + else Toast.makeText(this, error, Toast.LENGTH_LONG).show(); } public void onRetrieveStart() { progressBar.setIndeterminate(true); @@ -382,6 +364,11 @@ public class MainActivity extends AppCompatActivity { progressBar.setIndeterminate(false); } } + public void navProfilesClicked(View view) { + drawer.closeDrawers(); + Intent intent = new Intent(this, ProfileListActivity.class); + startActivity(intent); + } public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { @@ -390,7 +377,7 @@ public class MainActivity extends AppCompatActivity { @Override public Fragment getItem(int position) { - Log.d("main", String.format("Switching to gragment %d", position)); + Log.d("main", String.format("Switching to fragment %d", position)); switch (position) { case 0: return new AccountSummaryFragment(); @@ -407,5 +394,8 @@ public class MainActivity extends AppCompatActivity { return 2; } } - + public void fabShouldShow() { + MobileLedgerProfile profile = Data.profile.get(); + if (profile.isPostingPermitted()) fab.show(); + } }