mirror of
https://github.com/TeamVanced/VancedMicroG
synced 2024-10-15 01:09:38 +02:00
gcm/iid: add request id to iid responses
was optional before but is required for firebase iid - fixes bug with riot dev version reported in #313 - might be related to comment 2 in #322
This commit is contained in:
parent
db7b721b1a
commit
b0a06e7d7d
@ -41,6 +41,7 @@ import static org.microg.gms.gcm.GcmConstants.ERROR_SERVICE_NOT_AVAILABLE;
|
|||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_APP;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_APP;
|
||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_DELETE;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_DELETE;
|
||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_ERROR;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_ERROR;
|
||||||
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_KID;
|
||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_MESSENGER;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_MESSENGER;
|
||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_PENDING_INTENT;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_PENDING_INTENT;
|
||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_REGISTRATION_ID;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_REGISTRATION_ID;
|
||||||
@ -100,15 +101,23 @@ public class PushRegisterService extends IntentService {
|
|||||||
@Override
|
@Override
|
||||||
protected void onHandleIntent(Intent intent) {
|
protected void onHandleIntent(Intent intent) {
|
||||||
Log.d(TAG, "onHandleIntent: " + intent);
|
Log.d(TAG, "onHandleIntent: " + intent);
|
||||||
Log.d(TAG, "onHandleIntent: " + intent.getExtras());
|
|
||||||
|
String requestId = null;
|
||||||
|
if (intent.hasExtra(EXTRA_KID) && intent.getStringExtra(EXTRA_KID).startsWith("|")) {
|
||||||
|
String[] kid = intent.getStringExtra(EXTRA_KID).split("\\|");
|
||||||
|
if (kid.length >= 3 && "ID".equals(kid[1])) {
|
||||||
|
requestId = kid[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (GcmPrefs.get(this).isEnabled()) {
|
if (GcmPrefs.get(this).isEnabled()) {
|
||||||
if (LastCheckinInfo.read(this).lastCheckin > 0) {
|
if (LastCheckinInfo.read(this).lastCheckin > 0) {
|
||||||
try {
|
try {
|
||||||
if (ACTION_C2DM_UNREGISTER.equals(intent.getAction()) ||
|
if (ACTION_C2DM_UNREGISTER.equals(intent.getAction()) ||
|
||||||
(ACTION_C2DM_REGISTER.equals(intent.getAction()) && "1".equals(intent.getStringExtra(EXTRA_DELETE)))) {
|
(ACTION_C2DM_REGISTER.equals(intent.getAction()) && "1".equals(intent.getStringExtra(EXTRA_DELETE)))) {
|
||||||
unregister(intent);
|
unregister(intent, requestId);
|
||||||
} else if (ACTION_C2DM_REGISTER.equals(intent.getAction())) {
|
} else if (ACTION_C2DM_REGISTER.equals(intent.getAction())) {
|
||||||
register(intent);
|
register(intent, requestId);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
Log.w(TAG, e);
|
Log.w(TAG, e);
|
||||||
@ -123,11 +132,11 @@ public class PushRegisterService extends IntentService {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// GCM is disabled, deny registration
|
// GCM is disabled, deny registration
|
||||||
replyNotAvailable(this, intent);
|
replyNotAvailable(this, intent, null, requestId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void register(final Intent intent) {
|
private void register(final Intent intent, String requestId) {
|
||||||
PendingIntent pendingIntent = intent.getParcelableExtra(EXTRA_APP);
|
PendingIntent pendingIntent = intent.getParcelableExtra(EXTRA_APP);
|
||||||
final String packageName = PackageUtils.packageFromPendingIntent(pendingIntent);
|
final String packageName = PackageUtils.packageFromPendingIntent(pendingIntent);
|
||||||
Log.d(TAG, "register[req]: " + intent.toString() + " extras=" + intent.getExtras());
|
Log.d(TAG, "register[req]: " + intent.toString() + " extras=" + intent.getExtras());
|
||||||
@ -143,20 +152,16 @@ public class PushRegisterService extends IntentService {
|
|||||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
startActivity(i);
|
startActivity(i);
|
||||||
} catch (PackageManager.NameNotFoundException e) {
|
} catch (PackageManager.NameNotFoundException e) {
|
||||||
replyNotAvailable(this, intent, packageName);
|
replyNotAvailable(this, intent, packageName, requestId);
|
||||||
}
|
}
|
||||||
} else if (app != null && !app.allowRegister) {
|
} else if (app != null && !app.allowRegister) {
|
||||||
replyNotAvailable(this, intent, packageName);
|
replyNotAvailable(this, intent, packageName, requestId);
|
||||||
} else {
|
} else {
|
||||||
registerAndReply(this, intent, packageName);
|
registerAndReply(this, intent, packageName, requestId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void replyNotAvailable(Context context, Intent intent) {
|
public static void replyNotAvailable(Context context, Intent intent, String packageName, String requestId) {
|
||||||
replyNotAvailable(context, intent, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void replyNotAvailable(Context context, Intent intent, String packageName) {
|
|
||||||
if (packageName == null) {
|
if (packageName == null) {
|
||||||
PendingIntent pendingIntent = intent.getParcelableExtra(EXTRA_APP);
|
PendingIntent pendingIntent = intent.getParcelableExtra(EXTRA_APP);
|
||||||
packageName = PackageUtils.packageFromPendingIntent(pendingIntent);
|
packageName = PackageUtils.packageFromPendingIntent(pendingIntent);
|
||||||
@ -166,20 +171,20 @@ public class PushRegisterService extends IntentService {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Intent outIntent = new Intent(ACTION_C2DM_REGISTRATION);
|
Intent outIntent = new Intent(ACTION_C2DM_REGISTRATION);
|
||||||
outIntent.putExtra(EXTRA_ERROR, ERROR_SERVICE_NOT_AVAILABLE);
|
outIntent.putExtra(EXTRA_ERROR, attachRequestId(ERROR_SERVICE_NOT_AVAILABLE, requestId));
|
||||||
Log.d(TAG, "registration not allowed");
|
Log.d(TAG, "registration not allowed");
|
||||||
sendReply(context, intent, packageName, outIntent);
|
sendReply(context, intent, packageName, outIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void registerAndReply(Context context, Intent intent, String packageName) {
|
public static void registerAndReply(Context context, Intent intent, String packageName, String requestId) {
|
||||||
Intent outIntent = new Intent(ACTION_C2DM_REGISTRATION);
|
Intent outIntent = new Intent(ACTION_C2DM_REGISTRATION);
|
||||||
String sender = intent.getStringExtra(EXTRA_SENDER);
|
String sender = intent.getStringExtra(EXTRA_SENDER);
|
||||||
String appSignature = PackageUtils.firstSignatureDigest(context, packageName);
|
String appSignature = PackageUtils.firstSignatureDigest(context, packageName);
|
||||||
String regId = register(context, packageName, appSignature, sender, null).token;
|
String regId = register(context, packageName, appSignature, sender, null).token;
|
||||||
if (regId != null) {
|
if (regId != null) {
|
||||||
outIntent.putExtra(EXTRA_REGISTRATION_ID, regId);
|
outIntent.putExtra(EXTRA_REGISTRATION_ID, attachRequestId(regId, requestId));
|
||||||
} else {
|
} else {
|
||||||
outIntent.putExtra(EXTRA_ERROR, ERROR_SERVICE_NOT_AVAILABLE);
|
outIntent.putExtra(EXTRA_ERROR, attachRequestId(ERROR_SERVICE_NOT_AVAILABLE, requestId));
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.d(TAG, "register[res]: " + outIntent + " extras=" + outIntent.getExtras());
|
Log.d(TAG, "register[res]: " + outIntent + " extras=" + outIntent.getExtras());
|
||||||
@ -187,6 +192,7 @@ public class PushRegisterService extends IntentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void sendReply(Context context, Intent intent, String packageName, Intent outIntent) {
|
private static void sendReply(Context context, Intent intent, String packageName, Intent outIntent) {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (intent.hasExtra(EXTRA_MESSENGER)) {
|
if (intent.hasExtra(EXTRA_MESSENGER)) {
|
||||||
Messenger messenger = intent.getParcelableExtra(EXTRA_MESSENGER);
|
Messenger messenger = intent.getParcelableExtra(EXTRA_MESSENGER);
|
||||||
@ -222,7 +228,7 @@ public class PushRegisterService extends IntentService {
|
|||||||
return new RegisterResponse();
|
return new RegisterResponse();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void unregister(Intent intent) {
|
private void unregister(Intent intent, String requestId) {
|
||||||
PendingIntent pendingIntent = intent.getParcelableExtra(EXTRA_APP);
|
PendingIntent pendingIntent = intent.getParcelableExtra(EXTRA_APP);
|
||||||
String packageName = PackageUtils.packageFromPendingIntent(pendingIntent);
|
String packageName = PackageUtils.packageFromPendingIntent(pendingIntent);
|
||||||
Log.d(TAG, "unregister[req]: " + intent.toString() + " extras=" + intent.getExtras());
|
Log.d(TAG, "unregister[req]: " + intent.toString() + " extras=" + intent.getExtras());
|
||||||
@ -231,21 +237,26 @@ public class PushRegisterService extends IntentService {
|
|||||||
String appSignature = PackageUtils.firstSignatureDigest(this, packageName);
|
String appSignature = PackageUtils.firstSignatureDigest(this, packageName);
|
||||||
|
|
||||||
if (database.getRegistration(packageName, appSignature) == null) {
|
if (database.getRegistration(packageName, appSignature) == null) {
|
||||||
outIntent.putExtra(EXTRA_UNREGISTERED, packageName);
|
outIntent.putExtra(EXTRA_UNREGISTERED, attachRequestId(packageName, requestId));
|
||||||
} else {
|
} else {
|
||||||
RegisterResponse response = unregister(this, packageName, appSignature, null, null);
|
RegisterResponse response = unregister(this, packageName, appSignature, null, null);
|
||||||
if (!packageName.equals(response.deleted)) {
|
if (!packageName.equals(response.deleted)) {
|
||||||
outIntent.putExtra(EXTRA_ERROR, ERROR_SERVICE_NOT_AVAILABLE);
|
outIntent.putExtra(EXTRA_ERROR, attachRequestId(ERROR_SERVICE_NOT_AVAILABLE, requestId));
|
||||||
|
|
||||||
if (response.retryAfter != null && !response.retryAfter.contains(":")) {
|
if (response.retryAfter != null && !response.retryAfter.contains(":")) {
|
||||||
outIntent.putExtra(EXTRA_RETRY_AFTER, Long.parseLong(response.retryAfter));
|
outIntent.putExtra(EXTRA_RETRY_AFTER, Long.parseLong(response.retryAfter));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
outIntent.putExtra(EXTRA_UNREGISTERED, packageName);
|
outIntent.putExtra(EXTRA_UNREGISTERED, attachRequestId(packageName, requestId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log.d(TAG, "unregister[res]: " + outIntent.toString() + " extras=" + outIntent.getExtras());
|
Log.d(TAG, "unregister[res]: " + outIntent.toString() + " extras=" + outIntent.getExtras());
|
||||||
sendReply(this, intent, packageName, outIntent);
|
sendReply(this, intent, packageName, outIntent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static String attachRequestId(String msg, String requestId) {
|
||||||
|
if (requestId == null) return msg;
|
||||||
|
return "|ID|" + requestId + "|" + msg;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,6 +15,7 @@ import org.microg.gms.gcm.GcmDatabase;
|
|||||||
import org.microg.gms.gcm.PushRegisterService;
|
import org.microg.gms.gcm.PushRegisterService;
|
||||||
|
|
||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_APP;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_APP;
|
||||||
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_KID;
|
||||||
import static org.microg.gms.gcm.GcmConstants.EXTRA_PENDING_INTENT;
|
import static org.microg.gms.gcm.GcmConstants.EXTRA_PENDING_INTENT;
|
||||||
|
|
||||||
public class AskPushPermission extends FragmentActivity {
|
public class AskPushPermission extends FragmentActivity {
|
||||||
@ -24,6 +25,7 @@ public class AskPushPermission extends FragmentActivity {
|
|||||||
private String packageName;
|
private String packageName;
|
||||||
private Intent intent;
|
private Intent intent;
|
||||||
private boolean answered;
|
private boolean answered;
|
||||||
|
private String requestId;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
@ -34,6 +36,14 @@ public class AskPushPermission extends FragmentActivity {
|
|||||||
packageName = getIntent().getStringExtra(EXTRA_APP);
|
packageName = getIntent().getStringExtra(EXTRA_APP);
|
||||||
intent = getIntent().getParcelableExtra(EXTRA_PENDING_INTENT);
|
intent = getIntent().getParcelableExtra(EXTRA_PENDING_INTENT);
|
||||||
|
|
||||||
|
requestId = null;
|
||||||
|
if (intent.hasExtra(EXTRA_KID) && intent.getStringExtra(EXTRA_KID).startsWith("|")) {
|
||||||
|
String[] kid = intent.getStringExtra(EXTRA_KID).split("\\|");
|
||||||
|
if (kid.length >= 3 && "ID".equals(kid[1])) {
|
||||||
|
requestId = kid[2];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (database.getApp(packageName) != null) {
|
if (database.getApp(packageName) != null) {
|
||||||
finish();
|
finish();
|
||||||
return;
|
return;
|
||||||
@ -56,7 +66,7 @@ public class AskPushPermission extends FragmentActivity {
|
|||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
PushRegisterService.registerAndReply(AskPushPermission.this, intent, packageName);
|
PushRegisterService.registerAndReply(AskPushPermission.this, intent, packageName, requestId);
|
||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
finish();
|
finish();
|
||||||
@ -68,7 +78,7 @@ public class AskPushPermission extends FragmentActivity {
|
|||||||
if (answered) return;
|
if (answered) return;
|
||||||
database.noteAppKnown(packageName, false);
|
database.noteAppKnown(packageName, false);
|
||||||
answered = true;
|
answered = true;
|
||||||
PushRegisterService.replyNotAvailable(AskPushPermission.this, intent, packageName);
|
PushRegisterService.replyNotAvailable(AskPushPermission.this, intent, packageName, requestId);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -81,7 +91,7 @@ public class AskPushPermission extends FragmentActivity {
|
|||||||
protected void onStop() {
|
protected void onStop() {
|
||||||
super.onStop();
|
super.onStop();
|
||||||
if (!answered) {
|
if (!answered) {
|
||||||
PushRegisterService.replyNotAvailable(AskPushPermission.this, intent, packageName);
|
PushRegisterService.replyNotAvailable(AskPushPermission.this, intent, packageName, requestId);
|
||||||
answered = true;
|
answered = true;
|
||||||
}
|
}
|
||||||
database.close();
|
database.close();
|
||||||
|
Loading…
Reference in New Issue
Block a user