Permalink
Browse files

use sse for push notification, #386

  • Loading branch information...
bedhub committed Jun 14, 2018
1 parent 6ac0270 commit 449c36eac5755571f4c5d28a74dfdc13c3cdc6df
Showing with 888 additions and 333 deletions.
  1. +3 −1 app-android/app/build.gradle
  2. +30 −51 app-android/app/src/main/AndroidManifest.xml
  3. +7 −6 app-android/app/src/main/java/de/tutao/tutanota/Crypto.java
  4. +4 −22 app-android/app/src/main/java/de/tutao/tutanota/MainActivity.java
  5. +12 −0 app-android/app/src/main/java/de/tutao/tutanota/Native.java
  6. +5 −0 app-android/app/src/main/java/de/tutao/tutanota/Utils.java
  7. +0 −21 app-android/app/src/main/java/de/tutao/tutanota/push/GcmListener.java
  8. +0 −47 app-android/app/src/main/java/de/tutao/tutanota/push/GcmRegistrationService.java
  9. +0 −17 app-android/app/src/main/java/de/tutao/tutanota/push/PushInstanceIdListenerService.java
  10. +199 −0 app-android/app/src/main/java/de/tutao/tutanota/push/PushNotificationService.java
  11. +120 −0 app-android/app/src/main/java/de/tutao/tutanota/push/SseStorage.java
  12. BIN app-android/app/src/main/res/drawable-hdpi/ic_status.png
  13. BIN app-android/app/src/main/res/drawable-xhdpi/ic_status.png
  14. BIN app-android/app/src/main/res/drawable-xxhdpi/ic_status.png
  15. BIN app-android/app/src/main/res/drawable-xxxhdpi/ic_status.png
  16. +15 −0 flow/api/entities/sys.js
  17. +3 −0 flow/api/types.js
  18. +4 −0 src/api/Env.js
  19. +3 −2 src/api/common/TutanotaConstants.js
  20. +1 −1 src/api/entities/sys/AccountingInfo.js
  21. +1 −1 src/api/entities/sys/AdministratedGroup.js
  22. +1 −1 src/api/entities/sys/AdministratedGroupsRef.js
  23. +1 −1 src/api/entities/sys/AuditLogEntry.js
  24. +1 −1 src/api/entities/sys/AuditLogRef.js
  25. +1 −1 src/api/entities/sys/AuthenticatedDevice.js
  26. +1 −1 src/api/entities/sys/Authentication.js
  27. +1 −1 src/api/entities/sys/AutoLoginDataDelete.js
  28. +1 −1 src/api/entities/sys/AutoLoginDataGet.js
  29. +1 −1 src/api/entities/sys/AutoLoginDataReturn.js
  30. +1 −1 src/api/entities/sys/AutoLoginPostReturn.js
  31. +1 −1 src/api/entities/sys/Booking.js
  32. +1 −1 src/api/entities/sys/BookingItem.js
  33. +1 −1 src/api/entities/sys/BookingServiceData.js
  34. +1 −1 src/api/entities/sys/BookingsRef.js
  35. +1 −1 src/api/entities/sys/BootstrapFeature.js
  36. +1 −1 src/api/entities/sys/BrandingDomainData.js
  37. +1 −1 src/api/entities/sys/BrandingDomainDeleteData.js
  38. +1 −1 src/api/entities/sys/Bucket.js
  39. +1 −1 src/api/entities/sys/BucketPermission.js
  40. +1 −1 src/api/entities/sys/Challenge.js
  41. +1 −1 src/api/entities/sys/ChangePasswordData.js
  42. +1 −1 src/api/entities/sys/Chat.js
  43. +1 −1 src/api/entities/sys/CreateCustomerServerPropertiesData.js
  44. +1 −1 src/api/entities/sys/CreateCustomerServerPropertiesReturn.js
  45. +1 −1 src/api/entities/sys/CreateGroupData.js
  46. +1 −1 src/api/entities/sys/CreateGroupListData.js
  47. +1 −1 src/api/entities/sys/CreateSessionData.js
  48. +1 −1 src/api/entities/sys/CreateSessionReturn.js
  49. +1 −1 src/api/entities/sys/CreditCard.js
  50. +1 −1 src/api/entities/sys/CustomDomainData.js
  51. +1 −1 src/api/entities/sys/CustomDomainReturn.js
  52. +1 −1 src/api/entities/sys/Customer.js
  53. +1 −1 src/api/entities/sys/CustomerData.js
  54. +1 −1 src/api/entities/sys/CustomerInfo.js
  55. +1 −1 src/api/entities/sys/CustomerInfoReturn.js
  56. +1 −1 src/api/entities/sys/CustomerProperties.js
  57. +1 −1 src/api/entities/sys/CustomerReturn.js
  58. +1 −1 src/api/entities/sys/CustomerServerProperties.js
  59. +1 −1 src/api/entities/sys/DebitServicePutData.js
  60. +1 −1 src/api/entities/sys/DeleteCustomerData.js
  61. +1 −1 src/api/entities/sys/DomainInfo.js
  62. +1 −1 src/api/entities/sys/DomainMailAddressAvailabilityData.js
  63. +1 −1 src/api/entities/sys/DomainMailAddressAvailabilityReturn.js
  64. +1 −1 src/api/entities/sys/DomainsRef.js
  65. +1 −1 src/api/entities/sys/EmailSenderListElement.js
  66. +1 −1 src/api/entities/sys/EntityEventBatch.js
  67. +1 −1 src/api/entities/sys/EntityUpdate.js
  68. +1 −1 src/api/entities/sys/Exception.js
  69. +1 −1 src/api/entities/sys/ExternalPropertiesReturn.js
  70. +1 −1 src/api/entities/sys/ExternalUserReference.js
  71. +1 −1 src/api/entities/sys/Feature.js
  72. +1 −1 src/api/entities/sys/File.js
  73. +40 −0 src/api/entities/sys/GeneratedIdWrapper.js
  74. +1 −1 src/api/entities/sys/Group.js
  75. +1 −1 src/api/entities/sys/GroupInfo.js
  76. +1 −1 src/api/entities/sys/GroupMember.js
  77. +1 −1 src/api/entities/sys/GroupMembership.js
  78. +1 −1 src/api/entities/sys/GroupRoot.js
  79. +1 −1 src/api/entities/sys/Invoice.js
  80. +1 −1 src/api/entities/sys/InvoiceInfo.js
  81. +1 −1 src/api/entities/sys/KeyPair.js
  82. +1 −1 src/api/entities/sys/LocationServiceGetReturn.js
  83. +1 −1 src/api/entities/sys/Login.js
  84. +1 −1 src/api/entities/sys/MailAddressAlias.js
  85. +1 −1 src/api/entities/sys/MailAddressAliasServiceData.js
  86. +1 −1 src/api/entities/sys/MailAddressAliasServiceDataDelete.js
  87. +1 −1 src/api/entities/sys/MailAddressAliasServiceReturn.js
  88. +1 −1 src/api/entities/sys/MailAddressAvailabilityData.js
  89. +1 −1 src/api/entities/sys/MailAddressAvailabilityReturn.js
  90. +1 −1 src/api/entities/sys/MailAddressToGroup.js
  91. +1 −1 src/api/entities/sys/MembershipAddData.js
  92. +1 −1 src/api/entities/sys/MembershipRemoveData.js
  93. +110 −5 src/api/entities/sys/OrderProcessingAgreement.js
  94. +37 −5 src/api/entities/sys/OrderProcessingAgreements.js
  95. +1 −1 src/api/entities/sys/OtpChallenge.js
  96. +1 −1 src/api/entities/sys/PaymentDataServiceGetReturn.js
  97. +1 −1 src/api/entities/sys/PaymentDataServicePutData.js
  98. +1 −1 src/api/entities/sys/PaymentDataServicePutReturn.js
  99. +1 −1 src/api/entities/sys/PdfInvoiceServiceData.js
  100. +1 −1 src/api/entities/sys/PdfInvoiceServiceReturn.js
  101. +1 −1 src/api/entities/sys/Permission.js
  102. +1 −1 src/api/entities/sys/PhoneNumber.js
  103. +1 −1 src/api/entities/sys/PremiumFeatureData.js
  104. +1 −1 src/api/entities/sys/PremiumFeatureReturn.js
  105. +1 −1 src/api/entities/sys/PriceData.js
  106. +1 −1 src/api/entities/sys/PriceItemData.js
  107. +1 −1 src/api/entities/sys/PriceRequestData.js
  108. +1 −1 src/api/entities/sys/PriceServiceData.js
  109. +1 −1 src/api/entities/sys/PriceServiceReturn.js
  110. +1 −1 src/api/entities/sys/PublicKeyData.js
  111. +1 −1 src/api/entities/sys/PublicKeyReturn.js
  112. +1 −1 src/api/entities/sys/PushIdentifier.js
  113. +1 −1 src/api/entities/sys/PushIdentifierList.js
  114. +1 −1 src/api/entities/sys/RegistrationCaptchaServiceData.js
  115. +1 −1 src/api/entities/sys/RegistrationCaptchaServiceReturn.js
  116. +1 −1 src/api/entities/sys/RegistrationConfigReturn.js
  117. +1 −1 src/api/entities/sys/RegistrationReturn.js
  118. +1 −1 src/api/entities/sys/RegistrationServiceData.js
  119. +1 −1 src/api/entities/sys/ResetPasswordData.js
  120. +1 −1 src/api/entities/sys/RootInstance.js
  121. +1 −1 src/api/entities/sys/SaltData.js
  122. +1 −1 src/api/entities/sys/SaltReturn.js
  123. +1 −1 src/api/entities/sys/SecondFactor.js
  124. +1 −1 src/api/entities/sys/SecondFactorAuthAllowedReturn.js
  125. +1 −1 src/api/entities/sys/SecondFactorAuthData.js
  126. +1 −1 src/api/entities/sys/SecondFactorAuthGetData.js
  127. +1 −1 src/api/entities/sys/SecondFactorAuthGetReturn.js
  128. +1 −1 src/api/entities/sys/SecondFactorAuthentication.js
  129. +1 −1 src/api/entities/sys/SendRegistrationCodeData.js
  130. +1 −1 src/api/entities/sys/SendRegistrationCodeReturn.js
  131. +1 −1 src/api/entities/sys/Session.js
  132. +44 −5 src/api/entities/sys/SignOrderProcessingAgreementData.js
  133. +50 −0 src/api/entities/sys/SseConnectData.js
  134. +1 −1 src/api/entities/sys/StringConfigValue.js
  135. +1 −1 src/api/entities/sys/StringWrapper.js
  136. +1 −1 src/api/entities/sys/SwitchAccountTypeData.js
  137. +1 −1 src/api/entities/sys/SystemKeysReturn.js
  138. +1 −1 src/api/entities/sys/U2fChallenge.js
  139. +1 −1 src/api/entities/sys/U2fKey.js
  140. +1 −1 src/api/entities/sys/U2fRegisteredDevice.js
  141. +1 −1 src/api/entities/sys/U2fResponseData.js
  142. +1 −1 src/api/entities/sys/UpdateAdminshipData.js
  143. +1 −1 src/api/entities/sys/UpdatePermissionKeyData.js
  144. +1 −1 src/api/entities/sys/User.js
  145. +1 −1 src/api/entities/sys/UserAreaGroups.js
  146. +1 −1 src/api/entities/sys/UserAuthentication.js
  147. +1 −1 src/api/entities/sys/UserData.js
  148. +1 −1 src/api/entities/sys/UserDataDelete.js
  149. +1 −1 src/api/entities/sys/UserExternalAuthInfo.js
  150. +1 −1 src/api/entities/sys/UserIdData.js
  151. +1 −1 src/api/entities/sys/UserIdReturn.js
  152. +1 −1 src/api/entities/sys/UserReturn.js
  153. +1 −1 src/api/entities/sys/VariableExternalAuthInfo.js
  154. +1 −1 src/api/entities/sys/VerifyRegistrationCodeData.js
  155. +1 −1 src/api/entities/sys/Version.js
  156. +1 −1 src/api/entities/sys/VersionData.js
  157. +1 −1 src/api/entities/sys/VersionInfo.js
  158. +1 −1 src/api/entities/sys/VersionReturn.js
  159. +1 −1 src/api/entities/sys/WebsocketWrapper.js
  160. +1 −1 src/api/entities/sys/WhitelabelChild.js
  161. +1 −1 src/api/entities/sys/WhitelabelChildrenRef.js
  162. +1 −1 src/api/entities/sys/WhitelabelConfig.js
  163. +1 −1 src/api/entities/sys/WhitelabelParent.js
  164. +4 −0 src/api/main/WorkerClient.js
  165. +5 −0 src/api/worker/WorkerImpl.js
  166. +54 −12 src/native/PushServiceApp.js
@@ -51,9 +51,11 @@ dependencies {
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
- implementation "com.google.android.gms:play-services-gcm:10.2.1"
implementation 'commons-io:commons-io:2.4'
implementation 'org.jdeferred:jdeferred-core:1.2.4'
+ implementation 'com.android.support:support-compat:27.1.1'
+ implementation 'com.android.support:support-core-utils:27.1.1'
+
testImplementation 'junit:junit:4.12'
testImplementation "org.robolectric:robolectric:3.3.2"
androidTestImplementation 'org.codehaus.jackson:jackson-mapper-asl:1.9.2'
@@ -1,71 +1,50 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="de.tutao.tutanota">
+ package="de.tutao.tutanota">
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.READ_CONTACTS" />
- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
- <uses-permission android:name="android.permission.VIBRATE" />
+ <uses-permission android:name="android.permission.INTERNET"/>
+ <uses-permission android:name="android.permission.READ_CONTACTS"/>
+ <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <uses-permission android:name="android.permission.VIBRATE"/>
<application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme">
+ android:allowBackup="false"
+ android:icon="@mipmap/ic_launcher"
+ android:label="@string/app_name"
+ android:supportsRtl="true"
+ android:theme="@style/AppTheme">
<activity
- android:name=".MainActivity"
- android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
- android:launchMode="singleInstance"
- android:theme="@style/SplashTheme">
+ android:name=".MainActivity"
+ android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
+ android:launchMode="singleInstance"
+ android:theme="@style/SplashTheme">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
+ <action android:name="android.intent.action.MAIN"/>
+ <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
- <action android:name="android.intent.action.SEND" />
- <action android:name="android.intent.action.SEND_MULTIPLE" />
+ <action android:name="android.intent.action.SEND"/>
+ <action android:name="android.intent.action.SEND_MULTIPLE"/>
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="*/*" />
+ <category android:name="android.intent.category.DEFAULT"/>
+ <data android:mimeType="*/*"/>
</intent-filter>
</activity>
<provider
- android:name="android.support.v4.content.FileProvider"
- android:authorities="${contentProviderAuthority}"
- android:exported="false"
- android:grantUriPermissions="true">
+ android:name="android.support.v4.content.FileProvider"
+ android:authorities="${contentProviderAuthority}"
+ android:exported="false"
+ android:grantUriPermissions="true">
<meta-data
- android:name="android.support.FILE_PROVIDER_PATHS"
- android:resource="@xml/paths" />
+ android:name="android.support.FILE_PROVIDER_PATHS"
+ android:resource="@xml/paths"/>
</provider>
- <receiver
- android:name="com.google.android.gms.gcm.GcmReceiver"
- android:exported="true"
- android:permission="com.google.android.c2dm.permission.SEND">
- <intent-filter>
- <action android:name="com.google.android.c2dm.intent.RECEIVE" />
- <category android:name="com.example.gcm" />
- </intent-filter>
- </receiver>
<service
- android:name="de.tutao.tutanota.push.GcmListener"
- android:exported="false">
- <intent-filter>
- <action android:name="com.google.android.c2dm.intent.RECEIVE" />
- </intent-filter>
- </service>
- <service
- android:name="de.tutao.tutanota.push.PushInstanceIdListenerService"
- android:exported="false">
- <intent-filter>
- <action android:name="com.google.android.gms.iid.InstanceID" />
- </intent-filter>
- </service>
- <service
- android:name="de.tutao.tutanota.push.GcmRegistrationService"
- android:exported="false" />
+ android:name=".push.PushNotificationService"
+ android:enabled="true"
+ android:exported="false"
+ android:process=":pushprocess"/>
</application>
</manifest>
@@ -3,7 +3,6 @@
import android.content.Context;
import android.net.Uri;
import android.os.Build;
-import android.util.Log;
import org.apache.commons.io.IOUtils;
import org.json.JSONException;
@@ -59,15 +58,15 @@
private static final Integer ANDROID_6_SDK_VERSION = 23;
- private final MainActivity activity;
+ private final Context context;
static {
// see: http://android-developers.blogspot.de/2013/08/some-securerandom-thoughts.html
PRNGFixes.apply();
}
- public Crypto(MainActivity activity) {
- this.activity = activity;
+ public Crypto(Context context) {
+ this.context = context;
this.randomizer = new SecureRandom();
}
@@ -176,7 +175,6 @@ public static SecretKeySpec bytesToKey(byte[] key) {
}
String aesEncryptFile(final byte[] key, final String fileUrl, final byte[] iv) throws IOException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidAlgorithmParameterException {
- Context context = activity.getWebView().getContext();
File inputFile = Utils.uriToFile(context, fileUrl);
File encryptedDir = new File(Utils.getDir(context), TEMP_DIR_ENCRYPTED);
encryptedDir.mkdirs();
@@ -213,7 +211,6 @@ private String aesDecrypt(final byte[] key, final byte[] cipherText) throws Inva
}
String aesDecryptFile(final byte[] key, final String fileUrl) throws IOException, InvalidKeyException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, NoSuchPaddingException {
- Context context = activity.getWebView().getContext();
File inputFile = Utils.uriToFile(context, fileUrl);
File decryptedDir = new File(Utils.getDir(context), TEMP_DIR_DECRYPTED);
decryptedDir.mkdirs();
@@ -244,6 +241,10 @@ public void aesDecrypt(final byte[] key, InputStream in, OutputStream out) throw
}
}
+ public SecureRandom getRandomizer() {
+ return randomizer;
+ }
+
private InputStream getCipherInputStream(InputStream in, Cipher cipher) {
if (Build.VERSION.SDK_INT < ANDROID_6_SDK_VERSION) {
// Use the tutao cipher suite implementation to increase download performance.
@@ -18,9 +18,6 @@
import android.webkit.WebView;
import android.webkit.WebViewClient;
-import com.google.android.gms.common.ConnectionResult;
-import com.google.android.gms.common.GoogleApiAvailability;
-
import org.jdeferred.Deferred;
import org.jdeferred.DoneCallback;
import org.jdeferred.Promise;
@@ -31,7 +28,7 @@
import java.io.FileNotFoundException;
import java.util.HashMap;
-import de.tutao.tutanota.push.GcmRegistrationService;
+import de.tutao.tutanota.push.PushNotificationService;
public class MainActivity extends Activity {
@@ -48,6 +45,8 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ this.setupPushNotifications();
+
webView = new WebView(this);
webView.setBackgroundColor(getResources().getColor(android.R.color.transparent));
setContentView(webView);
@@ -85,7 +84,6 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) {
});
this.webView.loadUrl(appUrl);
nativeImpl.setup();
-
}
@Override
@@ -157,23 +155,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
void setupPushNotifications() {
- if (gcmIsAvailable()) {
- // gcm registration
- Intent intent = new Intent(MainActivity.this, GcmRegistrationService.class);
- startService(intent);
- }
- }
-
- /**
- * @return true, if the GCM is available.
- */
- private boolean gcmIsAvailable() {
- GoogleApiAvailability apiAvailability = GoogleApiAvailability.getInstance();
- int resultCode = apiAvailability.isGooglePlayServicesAvailable(this);
- if (resultCode != ConnectionResult.SUCCESS) {
- return false;
- }
- return true;
+ startService(new Intent(this, PushNotificationService.class));
}
public void bringToForeground() {
@@ -23,6 +23,8 @@
import java.util.HashMap;
import java.util.Map;
+import de.tutao.tutanota.push.SseStorage;
+
/**
* Created by mpfau on 4/8/17.
*/
@@ -34,6 +36,7 @@
Crypto crypto;
FileUtil files;
Contact contact;
+ SseStorage sseStorage;
Map<String, DeferredObject<JSONObject, Exception, ?>> queue = new HashMap<>();
private final MainActivity activity;
private volatile DeferredObject<Void, Void, Void> webAppInitialized = new DeferredObject<>();
@@ -44,6 +47,7 @@
crypto = new Crypto(activity);
contact = new Contact(activity);
files = new FileUtil(activity);
+ sseStorage = new SseStorage(activity);
}
public void setup() {
@@ -219,6 +223,14 @@ private Promise invokeMethod(String method, JSONArray args) {
case "openLink":
promise.resolve(openLink(args.getString(0)));
break;
+ case "getPushIdentifier":
+ promise.resolve(sseStorage.getPushIdentifier());
+ break;
+ case "storePushIdentifierLocally":
+ sseStorage.storePushIdentifier(args.getString(0), args.getString(1),
+ args.getString(2));
+ promise.resolve(true);
+ break;
default:
throw new Exception("unsupported method: " + method);
}
@@ -26,6 +26,11 @@ public static String bytesToBase64(byte[] bytes) {
return Base64.decode(base64, Base64.NO_WRAP);
}
+ public static String base64ToBase64Url(String base64) {
+ return base64.replaceAll("\\+", "-")
+ .replaceAll("/", "_")
+ .replaceAll("=", "");
+ }
@@ -1,21 +0,0 @@
-package de.tutao.tutanota.push;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.Vibrator;
-
-import com.google.android.gms.gcm.GcmListenerService;
-
-/**
- * Created by mpfau on 4/16/17.
- */
-
-public class GcmListener extends GcmListenerService {
-
- @Override
- public void onMessageReceived(String s, Bundle data) {
- super.onMessageReceived(s, data);
- Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
- v.vibrate(300);
- }
-}
@@ -1,47 +0,0 @@
-package de.tutao.tutanota.push;
-
-import android.app.IntentService;
-import android.content.Intent;
-import android.support.annotation.Nullable;
-import android.util.Log;
-
-import com.google.android.gms.gcm.GoogleCloudMessaging;
-import com.google.android.gms.iid.InstanceID;
-
-import org.jdeferred.FailCallback;
-
-import java.io.IOException;
-
-import de.tutao.tutanota.JsRequest;
-
-
-/**
- * Created by mpfau on 4/16/17.
- */
-public class GcmRegistrationService extends IntentService {
- static String SenderId = "707517914653";
- static String TAG = "GcmRegistrationService";
-
- public GcmRegistrationService() {
- super("GcmRegistrationService");
- }
-
- @Override
- protected void onHandleIntent(@Nullable Intent intent) {
-// InstanceID instanceID = InstanceID.getInstance(this);
-// try {
-// String token = instanceID.getToken(SenderId,
-// GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
-// activity.nativeImpl.sendRequest(JsRequest.updatePushIdentifier, new Object[] { token }).fail(new FailCallback<Exception>() {
-// @Override
-// public void onFail(Exception e) {
-// Log.e(TAG, "could not retrieve token", e);
-// }
-// });
-// } catch (IOException e) {
-// Log.e(TAG, "could not retrieve token", e);
-// }
- }
-
-
-}
@@ -1,17 +0,0 @@
-package de.tutao.tutanota.push;
-
-import android.content.Intent;
-
-import com.google.android.gms.iid.InstanceIDListenerService;
-
-/**
- * Created by mpfau on 4/16/17.
- */
-
-public class PushInstanceIdListenerService extends InstanceIDListenerService {
- @Override
- public void onTokenRefresh() {
- Intent intent = new Intent(this, GcmRegistrationService.class);
- startService(intent);
- }
-}
Oops, something went wrong.

1 comment on commit 449c36e

@MartinHennrich

This comment has been minimized.

Show comment
Hide comment
@MartinHennrich

MartinHennrich Jun 16, 2018

Thanks, this commit is wonderful! 😍
Finally the push service is handled by a Tutao operated server and not on a Google machine. 👍

Thanks, this commit is wonderful! 😍
Finally the push service is handled by a Tutao operated server and not on a Google machine. 👍

Please sign in to comment.