Merge pull request #1219 from deltachat/provider-db

implement provider-db
This commit is contained in:
bjoern
2020-01-30 23:57:22 +01:00
committed by GitHub
6 changed files with 112 additions and 89 deletions
+3 -30
View File
@@ -854,19 +854,10 @@ JNIEXPORT void Java_com_b44t_messenger_DcContext_deleteAllLocations(JNIEnv *env,
}
JNIEXPORT jlong Java_com_b44t_messenger_DcContext_getProviderFromDomainCPtr(JNIEnv *env, jobject obj, jstring domain)
{
CHAR_REF(domain);
jlong ret = (jlong)dc_provider_new_from_domain(domainPtr);
CHAR_UNREF(domain);
return ret;
}
JNIEXPORT jlong Java_com_b44t_messenger_DcContext_getProviderFromEmailCPtr(JNIEnv *env, jobject obj, jstring email)
{
CHAR_REF(email);
jlong ret = (jlong)dc_provider_new_from_email(emailPtr);
jlong ret = (jlong)dc_provider_new_from_email(get_dc_context(env, obj), emailPtr);
CHAR_UNREF(email);
return ret;
}
@@ -1602,33 +1593,15 @@ JNIEXPORT void Java_com_b44t_messenger_DcProvider_unrefProviderCPtr(JNIEnv *env,
}
JNIEXPORT jstring Java_com_b44t_messenger_DcProvider_getName(JNIEnv *env, jobject obj)
{
char* temp = dc_provider_get_name(get_dc_provider(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jint Java_com_b44t_messenger_DcProvider_getStatus(JNIEnv *env, jobject obj)
{
return (jint)dc_provider_get_status(get_dc_provider(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_DcProvider_getStatusDate(JNIEnv *env, jobject obj)
JNIEXPORT jstring Java_com_b44t_messenger_DcProvider_getBeforeLoginHint(JNIEnv *env, jobject obj)
{
char* temp = dc_provider_get_status_date(get_dc_provider(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
}
JNIEXPORT jstring Java_com_b44t_messenger_DcProvider_getMarkdown(JNIEnv *env, jobject obj)
{
char* temp = dc_provider_get_markdown(get_dc_provider(env, obj));
char* temp = dc_provider_get_before_login_hint(get_dc_provider(env, obj));
jstring ret = JSTRING_NEW(temp);
dc_str_unref(temp);
return ret;
+33 -1
View File
@@ -74,6 +74,38 @@
</com.google.android.material.textfield.TextInputLayout>
<LinearLayout
android:id="@+id/provider_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="12dp"
android:orientation="vertical"
android:visibility="gone"
app:layout_constraintTop_toBottomOf="@id/password"
>
<TextView
android:id="@+id/provider_hint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="12dp"
android:textSize="16sp"/>
<TextView
android:id="@+id/provider_link"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:paddingBottom="12dp"
android:textSize="16sp"
android:text="@string/more_info_desktop"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:id="@+id/no_servers_hint"
android:layout_width="0dp"
@@ -82,7 +114,7 @@
android:padding="16dp"
android:text="@string/login_no_servers_hint"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/password" />
app:layout_constraintTop_toBottomOf="@id/provider_layout" />
<androidx.constraintlayout.widget.Group
android:id="@+id/advanced_group"
+4
View File
@@ -59,5 +59,9 @@
<color name="trackTintColor">#552090ea</color>
<color name="trackHighlightTintColor">#ff2090ea</color>
<color name="provider_prep_bg">#fffdf7b2</color>
<color name="provider_prep_fg">#ff101010</color>
<color name="provider_broken_bg">#fffd0b00</color>
<color name="provider_broken_fg">#ffffffff</color>
</resources>
+1 -3
View File
@@ -166,7 +166,6 @@ public class DcContext {
public native boolean isSendingLocationsToChat(int chat_id);
public @NonNull DcArray getLocations (int chat_id, int contact_id, long timestamp_start, long timestamp_end) { return new DcArray(getLocationsCPtr(chat_id, contact_id, timestamp_start, timestamp_end)); }
public native void deleteAllLocations ();
public @Nullable DcProvider getProviderFromDomain(String email) { long cptr = getProviderFromDomainCPtr(email); return cptr!=0 ? new DcProvider(cptr) : null; }
public @Nullable DcProvider getProviderFromEmail (String email) { long cptr = getProviderFromEmailCPtr(email); return cptr!=0 ? new DcProvider(cptr) : null; }
/**
@@ -195,6 +194,5 @@ public class DcContext {
private native long getContactCPtr (int id);
private native long getLocationsCPtr (int chat_id, int contact_id, long timestamp_start, long timestamp_end);
private native long checkQrCPtr (String qr);
private native long getProviderFromDomainCPtr (String qr);
private native long getProviderFromEmailCPtr (String qr);
private native long getProviderFromEmailCPtr (String addr);
}
+3 -5
View File
@@ -16,11 +16,9 @@ public class DcProvider {
providerCPtr = 0;
}
public native String getName ();
public native int getStatus ();
public native String getStatusDate ();
public native String getMarkdown ();
public native String getOverviewPage();
public native int getStatus ();
public native String getBeforeLoginHint ();
public native String getOverviewPage ();
// working with raw c-data
private long providerCPtr; // CAVE: the name is referenced in the JNI
@@ -1,16 +1,22 @@
package org.thoughtcrime.securesms;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.Group;
import com.b44t.messenger.DcProvider;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import android.text.TextUtils;
import android.util.Patterns;
import android.view.Menu;
@@ -45,6 +51,7 @@ import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_PASSWORD;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_PORT;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_SERVER;
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SEND_USER;
import static org.thoughtcrime.securesms.connect.DcHelper.getContext;
public class RegistrationActivity extends BaseActionBarActivity implements DcEventCenter.DcEventDelegate {
@@ -58,6 +65,12 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
private TextInputEditText emailInput;
private TextInputEditText passwordInput;
private View providerLayout;
private TextView providerHint;
private TextView providerLink;
private @Nullable DcProvider provider;
private Group advancedGroup;
private ImageView advancedIcon;
private ProgressDialog progressDialog;
@@ -78,6 +91,12 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
emailInput = findViewById(R.id.email_text);
passwordInput = findViewById(R.id.password_text);
providerLayout = findViewById(R.id.provider_layout);
providerHint = findViewById(R.id.provider_hint);
providerLink = findViewById(R.id.provider_link);
providerLink.setOnClickListener(l -> onProviderLink());
advancedGroup = findViewById(R.id.advanced_group);
advancedIcon = findViewById(R.id.advanced_icon);
TextView advancedTextView = findViewById(R.id.advanced_text);
@@ -253,9 +272,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
.setTitle(R.string.login_info_oauth2_title)
.setMessage(R.string.login_info_oauth2_text)
.setNegativeButton(R.string.cancel, (dialog, which)->{
if(isGmail(email)) {
showGmailNoOauth2Hint();
}
updateProviderInfo();
oauth2started.set(false);
})
.setPositiveButton(R.string.perm_continue, (dialog, which)-> {
@@ -266,24 +283,64 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
})
.setCancelable(false)
.show();
} else if (isGmail(email)) {
showGmailNoOauth2Hint();
oauth2started.set(false);
} else if (isOutlook(email)) {
showOutlookHint();
oauth2started.set(false);
}
else {
} else {
updateProviderInfo();
oauth2started.set(false);
}
}
else {
updateProviderInfo();
oauth2started.set(false);
}
return oauth2started;
}
private void updateProviderInfo() {
provider = getContext(this).getProviderFromEmail(emailInput.getText().toString());
if (provider!=null) {
Resources res = getResources();
providerHint.setText(provider.getBeforeLoginHint());
switch (provider.getStatus()) {
case DcProvider.DC_PROVIDER_STATUS_PREPARATION:
providerHint.setTextColor(res.getColor(R.color.provider_prep_fg));
providerLink.setTextColor(res.getColor(R.color.provider_prep_fg));
providerLayout.setBackgroundColor(res.getColor(R.color.provider_prep_bg));
providerLayout.setVisibility(View.VISIBLE);
break;
case DcProvider.DC_PROVIDER_STATUS_BROKEN:
providerHint.setTextColor(res.getColor(R.color.provider_broken_fg));
providerLink.setTextColor(res.getColor(R.color.provider_broken_fg));
providerLayout.setBackgroundColor(getResources().getColor(R.color.provider_broken_bg));
providerLayout.setVisibility(View.VISIBLE);
break;
default:
providerLayout.setVisibility(View.GONE);
break;
}
} else {
providerLayout.setVisibility(View.GONE);
}
}
private void onProviderLink() {
if (provider!=null) {
String url = provider.getOverviewPage();
if(!url.isEmpty()) {
try {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
} catch (ActivityNotFoundException e) {
Toast.makeText(this, R.string.no_browser_installed, Toast.LENGTH_LONG).show();
}
} else {
// this should normally not happen
Toast.makeText(this, "ErrProviderWithoutUrl", Toast.LENGTH_LONG).show();
}
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
@@ -309,45 +366,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve
return !TextUtils.isEmpty(email) && Patterns.EMAIL_ADDRESS.matcher(email).matches();
}
private boolean isGmail(String email) {
return email != null && (email.toLowerCase().contains("@gmail.") || email.toLowerCase().contains("@googlemail."));
}
private void showGmailNoOauth2Hint()
{
if(!gmailDialogShown) {
gmailDialogShown = true;
new AlertDialog.Builder(this)
.setMessage(R.string.login_info_gmail_text)
.setPositiveButton(R.string.ok, null)
.show();
}
}
private boolean isOutlook(String email) {
return email != null
&& (email.toLowerCase().contains("@outlook.") || email.toLowerCase().contains("@hotmail."));
}
private boolean outlookDialogShown;
private void showOutlookHint()
{
if(!outlookDialogShown) {
outlookDialogShown = true;
new AlertDialog.Builder(this)
.setMessage(
"Outlook- and Hotmail-e-mail-addresses "
+ "may currently not work as expected "
+ "as these servers may remove some important transport information."
+ "\n\n"
+ "Hopefully sooner or later there will be a fix; "
+ "for now, we suggest to use another e-mail-address "
+ "or try Delta Chat again when the issue is fixed.")
.setPositiveButton(R.string.ok, null)
.show();
}
}
private void verifyEmail(TextInputEditText view) {
String error = getString(R.string.login_error_mail);
String email = view.getText().toString();