X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Fprofiles%2FProfileDetailFragment.java;h=7ef511d00656c2badc098dcedec3ba21a78b1a52;hp=f211139375b9cd21847e3d2c0e7e111ecd7af18b;hb=a588974b72e78f9cd1ff5ec9cb0c4d0ae36a7746;hpb=94aa0aa57db3dce40f31fc0321c718998d9cb48b 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 f2111393..7ef511d0 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,12 +18,15 @@ package net.ktnx.mobileledger.ui.profiles; import android.app.Activity; -import android.content.Context; import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.support.design.widget.CollapsingToolbarLayout; import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.TextInputLayout; import android.support.v4.app.Fragment; +import android.text.Editable; +import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -56,14 +59,18 @@ public class ProfileDetailFragment extends Fragment { /** * The dummy content this fragment is presenting. */ - private MobileLedgerProfile mItem; + private MobileLedgerProfile mProfile; private TextView url; + private TextInputLayout urlLayout; private LinearLayout authParams; private Switch useAuthentication; private TextView userName; + private TextInputLayout userNameLayout; private TextView password; - private FloatingActionButton fab; + private TextInputLayout passwordLayout; private TextView profileName; + private TextInputLayout profileNameLayout; + private FloatingActionButton fab; /** * Mandatory empty constructor for the fragment manager to instantiate the @@ -76,69 +83,78 @@ public class ProfileDetailFragment extends Fragment { Log.d("profiles", "[fragment] Creating profile details options menu"); super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.profile_details, menu); - menu.findItem(R.id.menuDelete).setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - Log.d("profiles", String.format("[fragment] removing profile %s", mItem.getUuid())); - mItem.removeFromDB(); - Data.profiles.remove(mItem); - if (Data.profile.get().getUuid().equals(mItem.getUuid())) { - Data.profile.set(Data.profiles.get(0)); - } - return false; + final MenuItem menuDeleteProfile = menu.findItem(R.id.menuDelete); + menuDeleteProfile.setOnMenuItemClickListener(item -> { + Log.d("profiles", String.format("[fragment] removing profile %s", mProfile.getUuid())); + mProfile.removeFromDB(); + Data.profiles.remove(mProfile); + if (Data.profile.get().equals(mProfile)) { + Log.d("profiles", "[fragment] setting current profile to 0"); + Data.setCurrentProfile(Data.profiles.get(0)); } + return false; }); + menuDeleteProfile.setVisible((mProfile != null) && (Data.profiles.size() > 1)); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getArguments() != null) && getArguments().containsKey(ARG_ITEM_ID)) { - // Load the dummy content specified by the fragment - // arguments. In a real-world scenario, use a Loader - // to load content from a content provider. - String uuid = getArguments().getString(ARG_ITEM_ID); - if (uuid != null) - mItem = MobileLedgerProfile.loadUUIDFromDB(getArguments().getString(ARG_ITEM_ID)); + int index = getArguments().getInt(ARG_ITEM_ID, -1); + if (index != -1) mProfile = Data.profiles.get(index); Activity activity = this.getActivity(); if (activity == null) throw new AssertionError(); CollapsingToolbarLayout appBarLayout = activity.findViewById(R.id.toolbar_layout); if (appBarLayout != null) { - if (mItem != null) appBarLayout.setTitle(mItem.getName()); + if (mProfile != null) appBarLayout.setTitle(mProfile.getName()); else appBarLayout.setTitle(getResources().getString(R.string.new_profile_title)); } } } - @Override - public void onAttach(Context context) { - super.onAttach(context); - fab = ((Activity) context).findViewById(R.id.fab); - fab.setOnClickListener(v -> { - if (mItem != null) { - mItem.setName(profileName.getText()); - mItem.setUrl(url.getText()); - mItem.setAuthEnabled(useAuthentication.isChecked()); - mItem.setAuthUserName(userName.getText()); - mItem.setAuthPassword(password.getText()); - mItem.storeInDB(); + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + Activity context = getActivity(); + if (context == null) return; - - if (mItem.getUuid().equals(Data.profile.get().getUuid())) { - Data.profile.set(mItem); + fab = context.findViewById(R.id.fab); + fab.setOnClickListener(v -> { + if (!checkValidity()) return; + + if (mProfile != null) { + mProfile.setName(profileName.getText()); + mProfile.setUrl(url.getText()); + mProfile.setAuthEnabled(useAuthentication.isChecked()); + mProfile.setAuthUserName(userName.getText()); + mProfile.setAuthPassword(password.getText()); + mProfile.storeInDB(); + Log.d("profiles", "profile stored in DB"); + Data.profiles.triggerItemChangedNotification(mProfile); + + + if (mProfile.getUuid().equals(Data.profile.get().getUuid())) { + // dummy update to notify the observers of the possibly new name/URL + Data.profile.set(mProfile); } } else { - mItem = new MobileLedgerProfile(profileName.getText(), url.getText(), + mProfile = new MobileLedgerProfile(profileName.getText(), url.getText(), useAuthentication.isChecked(), userName.getText(), password.getText()); - mItem.storeInDB(); - Data.profiles.add(mItem); + mProfile.storeInDB(); + Data.profiles.add(mProfile); + MobileLedgerProfile.storeProfilesOrder(); + + // first profile ever? + if (Data.profiles.getList().size() == 1) Data.profile.set(mProfile); } Activity activity = getActivity(); if (activity != null) activity.finish(); }); + + profileName.requestFocus(); } @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, @@ -146,24 +162,34 @@ public class ProfileDetailFragment extends Fragment { View rootView = inflater.inflate(R.layout.profile_detail, container, false); profileName = rootView.findViewById(R.id.profile_name); + profileNameLayout = rootView.findViewById(R.id.profile_name_layout); url = rootView.findViewById(R.id.url); + urlLayout = rootView.findViewById(R.id.url_layout); authParams = rootView.findViewById(R.id.auth_params); useAuthentication = rootView.findViewById(R.id.enable_http_auth); userName = rootView.findViewById(R.id.auth_user_name); + userNameLayout = rootView.findViewById(R.id.auth_user_name_layout); password = rootView.findViewById(R.id.password); + passwordLayout = rootView.findViewById(R.id.password_layout); useAuthentication.setOnCheckedChangeListener((buttonView, isChecked) -> { Log.d("profiles", isChecked ? "auth enabled " : "auth disabled"); authParams.setVisibility(isChecked ? View.VISIBLE : View.GONE); + if (isChecked) userName.requestFocus(); }); - if (mItem != null) { - profileName.setText(mItem.getName()); - url.setText(mItem.getUrl()); - useAuthentication.setChecked(mItem.isAuthEnabled()); - authParams.setVisibility(mItem.isAuthEnabled() ? View.VISIBLE : View.GONE); - userName.setText(mItem.isAuthEnabled() ? mItem.getAuthUserName() : ""); - password.setText(mItem.isAuthEnabled() ? mItem.getAuthPassword() : ""); + hookClearErrorOnFocusListener(profileName, profileNameLayout); + hookClearErrorOnFocusListener(url, urlLayout); + hookClearErrorOnFocusListener(userName, userNameLayout); + hookClearErrorOnFocusListener(password, passwordLayout); + + if (mProfile != null) { + profileName.setText(mProfile.getName()); + url.setText(mProfile.getUrl()); + useAuthentication.setChecked(mProfile.isAuthEnabled()); + authParams.setVisibility(mProfile.isAuthEnabled() ? View.VISIBLE : View.GONE); + userName.setText(mProfile.isAuthEnabled() ? mProfile.getAuthUserName() : ""); + password.setText(mProfile.isAuthEnabled() ? mProfile.getAuthPassword() : ""); } else { profileName.setText(""); @@ -176,4 +202,53 @@ public class ProfileDetailFragment extends Fragment { return rootView; } + private void hookClearErrorOnFocusListener(TextView view, TextInputLayout layout) { + view.setOnFocusChangeListener((v, hasFocus) -> { + if (hasFocus) layout.setError(null); + }); + view.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + layout.setError(null); + } + @Override + public void afterTextChanged(Editable s) { + } + }); + } + boolean checkValidity() { + boolean valid = true; + + String val = String.valueOf(profileName.getText()); + if (val.trim().isEmpty()) { + valid = false; + profileNameLayout.setError(getResources().getText(R.string.err_profile_name_empty)); + } + + val = String.valueOf(url.getText()); + if (val.trim().isEmpty()) { + valid = false; + urlLayout.setError(getResources().getText(R.string.err_profile_url_empty)); + } + if (useAuthentication.isChecked()) { + val = String.valueOf(userName.getText()); + if (val.trim().isEmpty()) { + valid = false; + userNameLayout + .setError(getResources().getText(R.string.err_profile_user_name_empty)); + } + + val = String.valueOf(password.getText()); + if (val.trim().isEmpty()) { + valid = false; + passwordLayout + .setError(getResources().getText(R.string.err_profile_password_empty)); + } + } + + return valid; + } }