package org.gnucash.android.ui.settings.dialog; import android.content.Context; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.support.v4.app.DialogFragment; import android.support.v4.content.ContextCompat; import android.support.v7.preference.CheckBoxPreference; import android.support.v7.preference.Preference; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClientFactory; import com.owncloud.android.lib.common.OwnCloudCredentialsFactory; import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.status.GetRemoteStatusOperation; import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation; import org.gnucash.android.R; /** * A fragment for adding an ownCloud account. */ public class OwnCloudDialogFragment extends DialogFragment { /** * Dialog positive button. Ok to save and validate the data */ private Button mOkButton; /** * Cancel button */ private Button mCancelButton; /** * ownCloud vars */ private String mOC_server; private String mOC_username; private String mOC_password; private String mOC_dir; private EditText mServer; private EditText mUsername; private EditText mPassword; private EditText mDir; private TextView mServerError; private TextView mUsernameError; private TextView mDirError; private SharedPreferences mPrefs; private Context mContext; private static CheckBoxPreference ocCheckBox; /** * Use this factory method to create a new instance of * this fragment using the provided parameters. * @return A new instance of fragment OwnCloudDialogFragment. */ public static OwnCloudDialogFragment newInstance(Preference pref) { OwnCloudDialogFragment fragment = new OwnCloudDialogFragment(); ocCheckBox = pref == null ? null : (CheckBoxPreference) pref; return fragment; } public OwnCloudDialogFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setStyle(DialogFragment.STYLE_NO_TITLE, 0); mContext = getActivity(); mPrefs = mContext.getSharedPreferences(getString(R.string.owncloud_pref), Context.MODE_PRIVATE); mOC_server = mPrefs.getString(getString(R.string.key_owncloud_server), getString(R.string.owncloud_server)); mOC_username = mPrefs.getString(getString(R.string.key_owncloud_username), null); mOC_password = mPrefs.getString(getString(R.string.key_owncloud_password), null); mOC_dir = mPrefs.getString(getString(R.string.key_owncloud_dir), getString(R.string.app_name)); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.dialog_owncloud_account, container, false); mServer = (EditText) view.findViewById(R.id.owncloud_hostname); mUsername = (EditText) view.findViewById(R.id.owncloud_username); mPassword = (EditText) view.findViewById(R.id.owncloud_password); mDir = (EditText) view.findViewById(R.id.owncloud_dir); mServer.setText(mOC_server); mDir.setText(mOC_dir); mPassword.setText(mOC_password); // TODO: Remove - debugging only mUsername.setText(mOC_username); mServerError = (TextView) view.findViewById(R.id.owncloud_hostname_invalid); mUsernameError = (TextView) view.findViewById(R.id.owncloud_username_invalid); mDirError = (TextView) view.findViewById(R.id.owncloud_dir_invalid); mServerError.setVisibility(View.GONE); mUsernameError.setVisibility(View.GONE); mDirError.setVisibility(View.GONE); mCancelButton = (Button) view.findViewById(R.id.btn_cancel); mOkButton = (Button) view.findViewById(R.id.btn_save); mOkButton.setText(R.string.btn_test); return view; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); setListeners(); } private void saveButton() { if (mDirError.getText().toString().equals(getString(R.string.owncloud_dir_ok)) && mUsernameError.getText().toString().equals(getString(R.string.owncloud_user_ok)) && mServerError.getText().toString().equals(getString(R.string.owncloud_server_ok))) mOkButton.setText(R.string.btn_save); else mOkButton.setText(R.string.btn_test); } private void save() { SharedPreferences.Editor edit = mPrefs.edit(); edit.clear(); edit.putString(getString(R.string.key_owncloud_server), mOC_server); edit.putString(getString(R.string.key_owncloud_username), mOC_username); edit.putString(getString(R.string.key_owncloud_password), mOC_password); edit.putString(getString(R.string.key_owncloud_dir), mOC_dir); edit.putBoolean(getString(R.string.owncloud_sync), true); edit.apply(); if (ocCheckBox != null) ocCheckBox.setChecked(true); dismiss(); } private void checkData() { mServerError.setVisibility(View.GONE); mUsernameError.setVisibility(View.GONE); mDirError.setVisibility(View.GONE); mOC_server = mServer.getText().toString().trim(); mOC_username = mUsername.getText().toString().trim(); mOC_password = mPassword.getText().toString().trim(); mOC_dir = mDir.getText().toString().trim(); Uri serverUri = Uri.parse(mOC_server); OwnCloudClient mClient = OwnCloudClientFactory.createOwnCloudClient(serverUri, mContext, true); mClient.setCredentials( OwnCloudCredentialsFactory.newBasicCredentials(mOC_username, mOC_password) ); final Handler mHandler = new Handler(); OnRemoteOperationListener listener = new OnRemoteOperationListener() { @Override public void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result) { if (!result.isSuccess()) { Log.e("OC", result.getLogMessage(), result.getException()); if (caller instanceof GetRemoteStatusOperation) { mServerError.setTextColor(ContextCompat.getColor(getContext(), R.color.debit_red)); mServerError.setText(getString(R.string.owncloud_server_invalid)); mServerError.setVisibility(View.VISIBLE); } else if (caller instanceof GetRemoteUserNameOperation && mServerError.getText().toString().equals(getString(R.string.owncloud_server_ok))) { mUsernameError.setTextColor(ContextCompat.getColor(getContext(), R.color.debit_red)); mUsernameError.setText(getString(R.string.owncloud_user_invalid)); mUsernameError.setVisibility(View.VISIBLE); } } else { if (caller instanceof GetRemoteStatusOperation) { mServerError.setTextColor(ContextCompat.getColor(getContext(), R.color.theme_primary)); mServerError.setText(getString(R.string.owncloud_server_ok)); mServerError.setVisibility(View.VISIBLE); } else if (caller instanceof GetRemoteUserNameOperation) { mUsernameError.setTextColor(ContextCompat.getColor(getContext(), R.color.theme_primary)); mUsernameError.setText(getString(R.string.owncloud_user_ok)); mUsernameError.setVisibility(View.VISIBLE); } } saveButton(); } }; GetRemoteStatusOperation g = new GetRemoteStatusOperation(mContext); g.execute(mClient, listener, mHandler); GetRemoteUserNameOperation gu = new GetRemoteUserNameOperation(); gu.execute(mClient, listener, mHandler); if (FileUtils.isValidPath(mOC_dir, false)) { mDirError.setTextColor(ContextCompat.getColor(getContext(), R.color.theme_primary)); mDirError.setText(getString(R.string.owncloud_dir_ok)); mDirError.setVisibility(View.VISIBLE); } else { mDirError.setTextColor(ContextCompat.getColor(getContext(), R.color.debit_red)); mDirError.setText(getString(R.string.owncloud_dir_invalid)); mDirError.setVisibility(View.VISIBLE); } saveButton(); } /** * Binds click listeners for the dialog buttons */ private void setListeners(){ mCancelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismiss(); } }); mOkButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // If data didn't change if(mOkButton.getText().toString().equals(getString(R.string.btn_save)) && mOC_server.equals(mServer.getText().toString().trim()) && mOC_username.equals(mUsername.getText().toString().trim()) && mOC_password.equals(mPassword.getText().toString().trim()) && mOC_dir.equals(mDir.getText().toString().trim()) ) save(); else checkData(); } }); } }