Added update account / quick setup

pull/207/head
M66B 4 years ago
parent a6681b7e51
commit 1b7f370b06

@ -220,6 +220,12 @@ public interface DaoAccount {
" AND NOT (password IS :password AND auth_type = :auth_type)") " AND NOT (password IS :password AND auth_type = :auth_type)")
int setAccountPassword(long id, String password, int auth_type); int setAccountPassword(long id, String password, int auth_type);
@Query("UPDATE account" +
" SET fingerprint = :fingerprint" +
" WHERE id = :id" +
" AND NOT (fingerprint IS :fingerprint)")
int setAccountFingerprint(long id, String fingerprint);
@Query("UPDATE account SET last_connected = :last_connected WHERE id = :id AND NOT (last_connected IS :last_connected)") @Query("UPDATE account SET last_connected = :last_connected WHERE id = :id AND NOT (last_connected IS :last_connected)")
int setAccountConnected(long id, Long last_connected); int setAccountConnected(long id, Long last_connected);

@ -120,6 +120,12 @@ public interface DaoIdentity {
" AND NOT (password IS :password AND auth_type IS :new_auth_type)") " AND NOT (password IS :password AND auth_type IS :new_auth_type)")
int setIdentityPassword(long account, String user, String password, int auth_type, int new_auth_type); int setIdentityPassword(long account, String user, String password, int auth_type, int new_auth_type);
@Query("UPDATE identity" +
" SET fingerprint = :fingerprint" +
" WHERE account = :account" +
" AND NOT (fingerprint IS :fingerprint)")
int setIdentityFingerprint(long account, String fingerprint);
@Query("UPDATE identity SET last_connected = :last_connected WHERE id = :id AND NOT (last_connected IS :last_connected)") @Query("UPDATE identity SET last_connected = :last_connected WHERE id = :id AND NOT (last_connected IS :last_connected)")
int setIdentityConnected(long id, long last_connected); int setIdentityConnected(long id, long last_connected);

@ -39,9 +39,11 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.widget.Button; import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
@ -90,6 +92,7 @@ public class FragmentQuickSetup extends FragmentBase {
private TextView tvSmtpFingerprint; private TextView tvSmtpFingerprint;
private TextView tvSmtpDnsNames; private TextView tvSmtpDnsNames;
private CheckBox cbUpdate;
private Button btnSave; private Button btnSave;
private ContentLoadingProgressBar pbSave; private ContentLoadingProgressBar pbSave;
@ -97,6 +100,7 @@ public class FragmentQuickSetup extends FragmentBase {
private Group grpCertificate; private Group grpCertificate;
private Group grpError; private Group grpError;
private boolean update;
private EmailProvider bestProvider = null; private EmailProvider bestProvider = null;
private Bundle bestArgs = null; private Bundle bestArgs = null;
@ -109,6 +113,14 @@ public class FragmentQuickSetup extends FragmentBase {
outState.putParcelable("fair:args", bestArgs); outState.putParcelable("fair:args", bestArgs);
} }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
update = args.getBoolean("update");
}
@Override @Override
@Nullable @Nullable
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@ -143,6 +155,7 @@ public class FragmentQuickSetup extends FragmentBase {
tvSmtpFingerprint = view.findViewById(R.id.tvSmtpFingerprint); tvSmtpFingerprint = view.findViewById(R.id.tvSmtpFingerprint);
tvSmtpDnsNames = view.findViewById(R.id.tvSmtpDnsNames); tvSmtpDnsNames = view.findViewById(R.id.tvSmtpDnsNames);
cbUpdate = view.findViewById(R.id.cbUpdate);
btnSave = view.findViewById(R.id.btnSave); btnSave = view.findViewById(R.id.btnSave);
pbSave = view.findViewById(R.id.pbSave); pbSave = view.findViewById(R.id.pbSave);
@ -234,6 +247,8 @@ public class FragmentQuickSetup extends FragmentBase {
tvInstructions.setVisibility(View.GONE); tvInstructions.setVisibility(View.GONE);
tvInstructions.setMovementMethod(LinkMovementMethod.getInstance()); tvInstructions.setMovementMethod(LinkMovementMethod.getInstance());
btnHelp.setVisibility(View.GONE); btnHelp.setVisibility(View.GONE);
cbUpdate.setChecked(update);
cbUpdate.setVisibility(View.GONE);
btnSave.setVisibility(View.GONE); btnSave.setVisibility(View.GONE);
grpSetup.setVisibility(View.GONE); grpSetup.setVisibility(View.GONE);
grpCertificate.setVisibility(View.GONE); grpCertificate.setVisibility(View.GONE);
@ -254,6 +269,7 @@ public class FragmentQuickSetup extends FragmentBase {
args.putString("name", etName.getText().toString().trim()); args.putString("name", etName.getText().toString().trim());
args.putString("email", etEmail.getText().toString().trim()); args.putString("email", etEmail.getText().toString().trim());
args.putString("password", tilPassword.getEditText().getText().toString()); args.putString("password", tilPassword.getEditText().getText().toString());
args.putBoolean("update", cbUpdate.isChecked());
args.putBoolean("check", check); args.putBoolean("check", check);
args.putParcelable("best", bestProvider); args.putParcelable("best", bestProvider);
@ -269,6 +285,7 @@ public class FragmentQuickSetup extends FragmentBase {
grpError.setVisibility(View.GONE); grpError.setVisibility(View.GONE);
tvInstructions.setVisibility(View.GONE); tvInstructions.setVisibility(View.GONE);
btnHelp.setVisibility(View.GONE); btnHelp.setVisibility(View.GONE);
cbUpdate.setVisibility(check ? View.GONE : View.VISIBLE);
btnSave.setVisibility(check ? View.GONE : View.VISIBLE); btnSave.setVisibility(check ? View.GONE : View.VISIBLE);
grpSetup.setVisibility(check ? View.GONE : View.VISIBLE); grpSetup.setVisibility(check ? View.GONE : View.VISIBLE);
if (check) if (check)
@ -431,89 +448,120 @@ public class FragmentQuickSetup extends FragmentBase {
return provider; return provider;
} }
EntityAccount update = null;
DB db = DB.getInstance(context); DB db = DB.getInstance(context);
try { try {
db.beginTransaction(); db.beginTransaction();
EntityAccount primary = db.account().getPrimaryAccount(); EntityAccount primary = db.account().getPrimaryAccount();
// Create account if (args.getBoolean("update")) {
EntityAccount account = new EntityAccount(); List<EntityAccount> accounts =
db.account().getAccounts(user, new int[]{AUTH_TYPE_PASSWORD});
account.host = provider.imap.host; if (accounts != null)
account.encryption = aencryption; for (EntityAccount existing : accounts)
account.port = provider.imap.port; if (existing.protocol == EntityAccount.TYPE_IMAP)
account.auth_type = AUTH_TYPE_PASSWORD; if (update == null)
account.user = user; update = existing;
account.password = password; else {
account.fingerprint = imap_fingerprint; update = null;
break;
account.name = provider.name + "/" + username; }
}
account.synchronize = true;
account.primary = (primary == null);
if (provider.keepalive > 0)
account.poll_interval = provider.keepalive;
account.partial_fetch = provider.partial;
account.created = new Date().getTime();
account.last_connected = account.created;
account.id = db.account().insertAccount(account);
args.putLong("account", account.id);
EntityLog.log(context, "Quick added account=" + account.name);
// Create folders if (update == null) {
for (EntityFolder folder : folders) { // Create account
EntityFolder existing = db.folder().getFolderByName(account.id, folder.name); EntityAccount account = new EntityAccount();
if (existing == null) {
folder.account = account.id; account.host = provider.imap.host;
folder.setSpecials(account); account.encryption = aencryption;
folder.id = db.folder().insertFolder(folder); account.port = provider.imap.port;
EntityLog.log(context, "Quick added folder=" + folder.name + " type=" + folder.type); account.auth_type = AUTH_TYPE_PASSWORD;
if (folder.synchronize) account.user = user;
EntityOperation.sync(context, folder.id, true); account.password = password;
account.fingerprint = imap_fingerprint;
account.name = provider.name + "/" + username;
account.synchronize = true;
account.primary = (primary == null);
if (provider.keepalive > 0)
account.poll_interval = provider.keepalive;
account.partial_fetch = provider.partial;
account.created = new Date().getTime();
account.last_connected = account.created;
account.id = db.account().insertAccount(account);
args.putLong("account", account.id);
EntityLog.log(context, "Quick added account=" + account.name);
// Create folders
for (EntityFolder folder : folders) {
EntityFolder existing = db.folder().getFolderByName(account.id, folder.name);
if (existing == null) {
folder.account = account.id;
folder.setSpecials(account);
folder.id = db.folder().insertFolder(folder);
EntityLog.log(context, "Quick added folder=" + folder.name + " type=" + folder.type);
if (folder.synchronize)
EntityOperation.sync(context, folder.id, true);
}
} }
}
// Set swipe left/right folder // Set swipe left/right folder
for (EntityFolder folder : folders) for (EntityFolder folder : folders)
if (EntityFolder.TRASH.equals(folder.type)) if (EntityFolder.TRASH.equals(folder.type))
account.swipe_left = folder.id; account.swipe_left = folder.id;
else if (EntityFolder.ARCHIVE.equals(folder.type)) else if (EntityFolder.ARCHIVE.equals(folder.type))
account.swipe_right = folder.id; account.swipe_right = folder.id;
db.account().updateAccount(account); db.account().updateAccount(account);
// Create identity // Create identity
EntityIdentity identity = new EntityIdentity(); EntityIdentity identity = new EntityIdentity();
identity.name = name; identity.name = name;
identity.email = email; identity.email = email;
identity.account = account.id; identity.account = account.id;
identity.host = provider.smtp.host; identity.host = provider.smtp.host;
identity.encryption = iencryption; identity.encryption = iencryption;
identity.port = provider.smtp.port; identity.port = provider.smtp.port;
identity.auth_type = AUTH_TYPE_PASSWORD; identity.auth_type = AUTH_TYPE_PASSWORD;
identity.user = user; identity.user = user;
identity.password = password; identity.password = password;
identity.fingerprint = smtp_fingerprint; identity.fingerprint = smtp_fingerprint;
identity.use_ip = provider.useip; identity.use_ip = provider.useip;
identity.synchronize = true; identity.synchronize = true;
identity.primary = true; identity.primary = true;
identity.max_size = max_size; identity.max_size = max_size;
identity.id = db.identity().insertIdentity(identity); identity.id = db.identity().insertIdentity(identity);
EntityLog.log(context, "Quick added identity=" + identity.name + " email=" + identity.email); EntityLog.log(context, "Quick added identity=" + identity.name + " email=" + identity.email);
} else {
args.putLong("account", update.id);
EntityLog.log(context, "Quick setup update account=" + update.name);
db.account().setAccountSynchronize(update.id, true);
db.account().setAccountPassword(update.id, password, AUTH_TYPE_PASSWORD);
db.account().setAccountFingerprint(update.id, imap_fingerprint);
db.identity().setIdentityPassword(update.id, update.user, password, update.auth_type, AUTH_TYPE_PASSWORD);
db.identity().setIdentityFingerprint(update.id, smtp_fingerprint);
}
db.setTransactionSuccessful(); db.setTransactionSuccessful();
} finally { } finally {
db.endTransaction(); db.endTransaction();
} }
ServiceSynchronize.eval(context, "quick setup"); if (update == null)
ServiceSynchronize.eval(context, "quick setup");
else {
args.putBoolean("updated", true);
ServiceSynchronize.reload(context, update.id, true, "quick setup");
}
return provider; return provider;
} catch (Throwable ex) { } catch (Throwable ex) {
Log.w(ex); Log.w(ex);
@ -537,10 +585,16 @@ public class FragmentQuickSetup extends FragmentBase {
bestArgs = args; bestArgs = args;
showResult(bestProvider, bestArgs); showResult(bestProvider, bestArgs);
} else { } else {
FragmentDialogAccount fragment = new FragmentDialogAccount(); boolean updated = args.getBoolean("updated");
fragment.setArguments(args); if (updated) {
fragment.setTargetFragment(FragmentQuickSetup.this, ActivitySetup.REQUEST_DONE); finish();
fragment.show(getParentFragmentManager(), "quick:review"); ToastEx.makeText(getContext(), R.string.title_setup_oauth_updated, Toast.LENGTH_LONG).show();
} else {
FragmentDialogAccount fragment = new FragmentDialogAccount();
fragment.setArguments(args);
fragment.setTargetFragment(FragmentQuickSetup.this, ActivitySetup.REQUEST_DONE);
fragment.show(getParentFragmentManager(), "quick:review");
}
} }
} }
@ -663,6 +717,7 @@ public class FragmentQuickSetup extends FragmentBase {
imap_certificate == null && smtp_certificate == null imap_certificate == null && smtp_certificate == null
? View.GONE : View.VISIBLE); ? View.GONE : View.VISIBLE);
cbUpdate.setVisibility(provider == null ? View.GONE : View.VISIBLE);
btnSave.setVisibility(provider == null ? View.GONE : View.VISIBLE); btnSave.setVisibility(provider == null ? View.GONE : View.VISIBLE);
} }

@ -352,6 +352,16 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvSmtpFingerprint" /> app:layout_constraintTop_toBottomOf="@id/tvSmtpFingerprint" />
<CheckBox
android:id="@+id/cbUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="12dp"
android:text="@string/title_setup_oauth_update"
android:textAppearance="@style/TextAppearance.AppCompat.Small"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvSmtpDnsNames" />
<Button <Button
android:id="@+id/btnSave" android:id="@+id/btnSave"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -362,7 +372,7 @@
android:tag="disable" android:tag="disable"
android:text="@string/title_save" android:text="@string/title_save"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvSmtpDnsNames" /> app:layout_constraintTop_toBottomOf="@id/cbUpdate" />
<eu.faircode.email.ContentLoadingProgressBar <eu.faircode.email.ContentLoadingProgressBar
android:id="@+id/pbSave" android:id="@+id/pbSave"

Loading…
Cancel
Save