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=9cb045d7a00ec44d69c6617d2730ba0f400fbef6;hp=488dbeae02d537405d56089f81720949a1ea9b78;hb=889caa76c8e742031ad6cf7b8757fedfc06b52fe;hpb=7ff1c26d71d1f13fab1d7e1dc93c0d9469b64236 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 488dbeae..9cb045d7 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,29 @@ /* * 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.content.res.ColorStateList; +import android.graphics.Color; 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; @@ -30,7 +31,6 @@ import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; 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.View; @@ -45,20 +45,17 @@ 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.Colors; import net.ktnx.mobileledger.utils.MLDB; import java.lang.ref.WeakReference; import java.text.DateFormat; import java.util.Date; -public class MainActivity extends AppCompatActivity { - public MobileLedgerListFragment currentFragment = null; +public class MainActivity extends CrashReportingActivity { DrawerLayout drawer; - private AccountSummaryFragment accountSummaryFragment; - private TransactionListFragment transactionListFragment; private FragmentManager fragmentManager; private TextView tvLastUpdate; private RetrieveTransactionsTask retrieveTransactionsTask; @@ -67,6 +64,7 @@ public class MainActivity extends AppCompatActivity { private LinearLayout progressLayout; private SectionsPagerAdapter mSectionsPagerAdapter; private ViewPager mViewPager; + private FloatingActionButton fab; @Override protected void onStart() { @@ -89,20 +87,37 @@ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + 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(); + } + + int newProfileTheme = profile.getThemeId(); + if (newProfileTheme != Colors.profileThemeId) { + Log.d("profiles", String.format("profile theme %d → %d", Colors.profileThemeId, + newProfileTheme)); + profileThemeChanged(); + Colors.profileThemeId = newProfileTheme; + } }); }); - setupProfile(); - drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, @@ -110,7 +125,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 = @@ -134,6 +149,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() { @@ -168,53 +185,52 @@ public class MainActivity extends AppCompatActivity { } }); }); + + findViewById(R.id.btn_no_profiles_add).setOnClickListener(v -> startAddProfileActivity()); + + findViewById(R.id.btn_add_transaction).setOnClickListener(this::fabNewTransactionClicked); } - private void setupProfile() { - Data.profiles.setList(MobileLedgerProfile.loadAllFromDB()); - MobileLedgerProfile profile = null; + private void profileThemeChanged() { + setupProfileColors(); + // restart activity to reflect theme change + finish(); + Intent intent = new Intent(this, this.getClass()); + startActivity(intent); + } + @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); - if (profileUUID == null) { - if (Data.profiles.isEmpty()) { - Data.profiles.setList(MobileLedgerProfile.createInitialProfileList()); - profile = Data.profiles.get(0); - - SharedPreferences backend = getSharedPreferences("backend", MODE_PRIVATE); - Log.d("profiles", "Migrating from preferences to profiles"); - // migration to multiple profiles - if (profile.getUrl().isEmpty()) { - // no legacy config - Intent intent = new Intent(this, ProfileListActivity.class); - startActivity(intent); - } - profile.setUrl(backend.getString("backend_url", "")); - profile.setAuthEnabled(backend.getBoolean("backend_use_http_auth", false)); - profile.setAuthUserName(backend.getString("backend_auth_user", null)); - profile.setAuthPassword(backend.getString("backend_auth_password", null)); - profile.storeInDB(); - SharedPreferences.Editor editor = backend.edit(); - editor.clear(); - editor.apply(); - } - } - else { - profile = MobileLedgerProfile.loadUUIDFromDB(profileUUID); + 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); - - if (profile.getUrl().isEmpty()) { - 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, 0); - intent.putExtras(args); - startActivity(intent, args); - } } public void fabNewTransactionClicked(View view) { Intent intent = new Intent(this, NewTransactionActivity.class); @@ -228,20 +244,13 @@ public class MainActivity extends AppCompatActivity { } 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_dark_bg, getTheme())); - } - else { - item.setBackgroundColor(getResources().getColor(R.color.table_row_dark_bg)); - } - - @ColorInt int transparent = getResources().getColor(android.R.color.transparent); + item.setBackgroundColor(Colors.tableRowDarkBG); LinearLayout actions = drawer.findViewById(R.id.nav_actions); for (int i = 0; i < actions.getChildCount(); i++) { View view = actions.getChildAt(i); if (view.getId() != id) { - view.setBackgroundColor(transparent); + view.setBackgroundColor(Color.TRANSPARENT); } } } @@ -306,7 +315,9 @@ public class MainActivity extends AppCompatActivity { } public void updateLastUpdateTextFromDB() { { - long last_update = Data.profile.get().getLongOption(MLDB.OPT_LAST_SCRAPE, 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) { @@ -318,6 +329,8 @@ public class MainActivity extends AppCompatActivity { } } public void scheduleTransactionListRetrieval() { + if (Data.profile.get() == null) return; + retrieveTransactionsTask = new RetrieveTransactionsTask(new WeakReference<>(this)); retrieveTransactionsTask.execute(); @@ -339,6 +352,8 @@ public class MainActivity extends AppCompatActivity { else Toast.makeText(this, error, Toast.LENGTH_LONG).show(); } public void onRetrieveStart() { + progressBar.setIndeterminateTintList(ColorStateList.valueOf(Colors.primary)); + progressBar.setProgressTintList(ColorStateList.valueOf(Colors.primary)); progressBar.setIndeterminate(true); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) progressBar.setProgress(0, false); else progressBar.setProgress(0); @@ -367,6 +382,11 @@ public class MainActivity extends AppCompatActivity { Intent intent = new Intent(this, ProfileListActivity.class); startActivity(intent); } + public void fabShouldShow() { + MobileLedgerProfile profile = Data.profile.get(); + if ((profile != null) && profile.isPostingPermitted()) fab.show(); + } + public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter(FragmentManager fm) { @@ -375,7 +395,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(); @@ -392,5 +412,4 @@ public class MainActivity extends AppCompatActivity { return 2; } } - }