diff --git a/client/src/main/AndroidManifest.xml b/client/src/main/AndroidManifest.xml index 3aee07f1d..744898d5c 100644 --- a/client/src/main/AndroidManifest.xml +++ b/client/src/main/AndroidManifest.xml @@ -39,11 +39,6 @@ - - - - - diff --git a/client/src/main/java/au/com/codeka/warworlds/client/DeviceIdService.java b/client/src/main/java/au/com/codeka/warworlds/client/DeviceIdService.java deleted file mode 100644 index 77352dbf5..000000000 --- a/client/src/main/java/au/com/codeka/warworlds/client/DeviceIdService.java +++ /dev/null @@ -1,22 +0,0 @@ -package au.com.codeka.warworlds.client; - -import au.com.codeka.warworlds.common.Log; -import com.google.firebase.iid.FirebaseInstanceId; -import com.google.firebase.iid.FirebaseInstanceIdService; - -/** - * Our implementation of {@link FirebaseInstanceIdService}. - */ -public class DeviceIdService extends FirebaseInstanceIdService { - private static final Log log = new Log("DeviceIdService"); - - @Override - public void onTokenRefresh() { - // Get updated InstanceID token. - String refreshedToken = FirebaseInstanceId.getInstance().getToken(); - log.debug("Refreshed token: " + refreshedToken); - - // TODO: Implement this method to send any registration to your app's servers. - - } -} diff --git a/client/src/main/java/au/com/codeka/warworlds/client/MessagingService.java b/client/src/main/java/au/com/codeka/warworlds/client/MessagingService.java index e300fafbb..741eb6061 100644 --- a/client/src/main/java/au/com/codeka/warworlds/client/MessagingService.java +++ b/client/src/main/java/au/com/codeka/warworlds/client/MessagingService.java @@ -19,4 +19,10 @@ public void onMessageReceived(RemoteMessage remoteMessage) { log.info("From: " + remoteMessage.getFrom()); log.info("Notification Message Body: " + remoteMessage.getNotification().getBody()); } + + @Override + public void onNewToken(String token) { + log.info("Firebase new token: %s", token); + // TODO: update the server. + } } diff --git a/client/src/main/java/au/com/codeka/warworlds/client/net/Server.java b/client/src/main/java/au/com/codeka/warworlds/client/net/Server.java index 47c183d3b..e7864a1d7 100644 --- a/client/src/main/java/au/com/codeka/warworlds/client/net/Server.java +++ b/client/src/main/java/au/com/codeka/warworlds/client/net/Server.java @@ -3,6 +3,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import android.os.Build; + +import com.google.firebase.iid.FirebaseInstanceId; +import com.google.firebase.messaging.FirebaseMessaging; + import au.com.codeka.warworlds.client.App; import au.com.codeka.warworlds.client.concurrency.Threads; import au.com.codeka.warworlds.client.game.world.ChatManager; @@ -14,6 +18,7 @@ import au.com.codeka.warworlds.common.net.PacketDecoder; import au.com.codeka.warworlds.common.net.PacketEncoder; import au.com.codeka.warworlds.common.proto.DeviceInfo; +import au.com.codeka.warworlds.common.proto.FcmDeviceInfo; import au.com.codeka.warworlds.common.proto.HelloPacket; import au.com.codeka.warworlds.common.proto.LoginRequest; import au.com.codeka.warworlds.common.proto.LoginResponse; @@ -234,12 +239,23 @@ private void updateState( } private static DeviceInfo populateDeviceInfo() { + String fcmToken = ""; + try { + fcmToken = FirebaseInstanceId.getInstance().getToken("wwmmo", "FCM"); + } catch (IOException e) { + log.error("Error getting FCM token.", e); + // We won't be able to message this device, I guess. + } +//FirebaseInstanceId.getInstance().getInstanceId() return new DeviceInfo.Builder() .device_build(Build.ID) .device_id(GameSettings.i.getString(GameSettings.Key.INSTANCE_ID)) .device_manufacturer(Build.MANUFACTURER) .device_model(Build.MODEL) .device_version(Build.VERSION.RELEASE) + .fcm_device_info(new FcmDeviceInfo.Builder() + .token(fcmToken) + .build()) .build(); } } diff --git a/common/src/main/proto/au/com/codeka/warworlds/common/proto/account.proto b/common/src/main/proto/au/com/codeka/warworlds/common/proto/account.proto index 1b88ce4eb..50e39bc3b 100644 --- a/common/src/main/proto/au/com/codeka/warworlds/common/proto/account.proto +++ b/common/src/main/proto/au/com/codeka/warworlds/common/proto/account.proto @@ -130,4 +130,13 @@ message DeviceInfo { // The value of android.os.Build.VERSION.RELEASE for this device (note that this can // change if you upgrade the OS without re-registering your device!) optional string device_version = 5; + + // The Firebase Cloud Messaging info about the device. + optional FcmDeviceInfo fcm_device_info = 6; +} + +// Contains details about the Firebase Cloud Messaging device. +message FcmDeviceInfo { + // A token needed to message this device. + optional string token = 1; } diff --git a/server/src/main/data/admin/tmpl/empires/details.html b/server/src/main/data/admin/tmpl/empires/details.html index ef71a7003..488b6f05a 100644 --- a/server/src/main/data/admin/tmpl/empires/details.html +++ b/server/src/main/data/admin/tmpl/empires/details.html @@ -8,6 +8,28 @@ {% block "content" %}

{{ empire.display_name }}

+

Devices

+ + + + + + + + + + {% for device in devices %} + + + + + + + + + {% end %} +
IDModelManufacturerBuildVersionFCM token
{{ device.device_id }}{{ device.device_model }}{{ device.device_manufacturer }}{{ device.device_build }}{{ device.device_version }}{{ device.fcm_device_info.token }}
+

Stars

diff --git a/server/src/main/data/admin/tmpl/empires/index.html b/server/src/main/data/admin/tmpl/empires/index.html index a58a565e9..e1998c1da 100644 --- a/server/src/main/data/admin/tmpl/empires/index.html +++ b/server/src/main/data/admin/tmpl/empires/index.html @@ -1,5 +1,5 @@ {% extends "skeleton.html" %} -{% block "title" %}Accounts{% end %} +{% block "title" %}Empires{% end %} {% block "head" %} diff --git a/server/src/main/java/au/com/codeka/warworlds/server/admin/handlers/EmpireDetailsHandler.java b/server/src/main/java/au/com/codeka/warworlds/server/admin/handlers/EmpireDetailsHandler.java index 340ef31d5..df0aaa281 100644 --- a/server/src/main/java/au/com/codeka/warworlds/server/admin/handlers/EmpireDetailsHandler.java +++ b/server/src/main/java/au/com/codeka/warworlds/server/admin/handlers/EmpireDetailsHandler.java @@ -1,5 +1,6 @@ package au.com.codeka.warworlds.server.admin.handlers; +import au.com.codeka.warworlds.common.proto.DeviceInfo; import au.com.codeka.warworlds.common.proto.Empire; import au.com.codeka.warworlds.common.proto.Star; import au.com.codeka.warworlds.server.handlers.RequestException; @@ -7,6 +8,7 @@ import au.com.codeka.warworlds.server.world.StarManager; import com.google.common.collect.ImmutableMap; import java.util.ArrayList; +import java.util.List; /** * Handler for /admin/empires/xxx which shows details about the empire with id xxx. @@ -25,9 +27,12 @@ public void get() throws RequestException { stars.add(StarManager.i.getStar(starId).get()); } + List devices = DataStore.i.empires().getDevicesForEmpire(empire.id); + render("empires/details.html", ImmutableMap.builder() .put("empire", empire) .put("stars", stars) + .put("devices", devices) .build()); } } diff --git a/server/src/main/java/au/com/codeka/warworlds/server/html/account/LoginHandler.java b/server/src/main/java/au/com/codeka/warworlds/server/html/account/LoginHandler.java index b42b7d446..78c1c3473 100644 --- a/server/src/main/java/au/com/codeka/warworlds/server/html/account/LoginHandler.java +++ b/server/src/main/java/au/com/codeka/warworlds/server/html/account/LoginHandler.java @@ -44,6 +44,7 @@ public void post() throws RequestException { return; } + DataStore.i.empires().saveDevice(empire.get(), req.device_info); DataStore.i.stats().addLoginEvent(req, account); LoginResponse.Builder resp = new LoginResponse.Builder() diff --git a/server/src/main/java/au/com/codeka/warworlds/server/store/EmpiresStore.java b/server/src/main/java/au/com/codeka/warworlds/server/store/EmpiresStore.java index c101191dd..84a1e9d88 100644 --- a/server/src/main/java/au/com/codeka/warworlds/server/store/EmpiresStore.java +++ b/server/src/main/java/au/com/codeka/warworlds/server/store/EmpiresStore.java @@ -1,6 +1,7 @@ package au.com.codeka.warworlds.server.store; import au.com.codeka.warworlds.common.Log; +import au.com.codeka.warworlds.common.proto.DeviceInfo; import au.com.codeka.warworlds.common.proto.Empire; import au.com.codeka.warworlds.server.store.base.BaseStore; import au.com.codeka.warworlds.server.store.base.QueryResult; @@ -61,6 +62,40 @@ public void put(long id, Empire empire) { } } + /** + * Saves the given device to the empire store, under the given empire. When we want to msg the + * empire, these devices are what we'll message. + */ + public void saveDevice(Empire empire, DeviceInfo deviceInfo) { + try { + newWriter() + .stmt("INSERT OR REPLACE INTO devices (empire_id, device_id, device) VALUES (?, ?, ?)") + .param(0, empire.id) + .param(1, deviceInfo.device_id) + .param(2, deviceInfo.encode()) + .execute(); + } catch(StoreException e) { + log.error("Unexpected.", e); + } + } + + public List getDevicesForEmpire(long empireId) { + ArrayList devices = new ArrayList<>(); + try ( + QueryResult res = newReader() + .stmt("SELECT device FROM devices WHERE empire_id = ?") + .param(0, empireId) + .query() + ) { + while (res.next()) { + devices.add(DeviceInfo.ADAPTER.decode(res.getBytes(0))); + } + } catch (Exception e) { + log.error("Unexpected.", e); + } + return devices; + } + @Override protected int onOpen(int diskVersion) throws StoreException { if (diskVersion == 0) { @@ -72,6 +107,19 @@ protected int onOpen(int diskVersion) throws StoreException { .execute(); diskVersion++; } + if (diskVersion == 1) { + newWriter() + .stmt( + "CREATE TABLE devices (" + + " empire_id INTEGER," + + " device_id STRING," + + " device BLOB)") + .execute(); + newWriter() + .stmt("CREATE UNIQUE INDEX IX_devices_empire_device ON devices (empire_id, device_id)") + .execute(); + diskVersion++; + } return diskVersion; }