diff --git a/application/app/src/main/java/isdp/guess_a_song/HostPlayScreen.java b/application/app/src/main/java/isdp/guess_a_song/HostPlayScreen.java index 3ac795c..32776a1 100644 --- a/application/app/src/main/java/isdp/guess_a_song/HostPlayScreen.java +++ b/application/app/src/main/java/isdp/guess_a_song/HostPlayScreen.java @@ -139,7 +139,7 @@ public void onClick(View v) { Log.d(Constants.LOGT,game.getSettings().toString()); Log.d(Constants.LOGT,"gameidstring "+game.getSettings().getGameIDString()); - client = new PubNubClient(new UserProfile(Constants.HOST_USERNAME),game.getSettings().getGameIDString()); + client = new PubNubClient(new UserProfile(Constants.HOST_USERNAME),game.getSettings().getGameIDString(),true); //listView.setAdapter(this.mPresence); diff --git a/application/app/src/main/java/isdp/guess_a_song/JoinGame.java b/application/app/src/main/java/isdp/guess_a_song/JoinGame.java index 2da7fdc..908a0e8 100644 --- a/application/app/src/main/java/isdp/guess_a_song/JoinGame.java +++ b/application/app/src/main/java/isdp/guess_a_song/JoinGame.java @@ -2,17 +2,16 @@ import android.content.DialogInterface; import android.os.Bundle; +import android.provider.Settings; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.EditText; -import com.fasterxml.jackson.databind.node.JsonNodeFactory; -import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.gson.Gson; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.pubnub.api.PNConfiguration; import com.pubnub.api.PubNub; import com.pubnub.api.callbacks.PNCallback; import com.pubnub.api.callbacks.SubscribeCallback; @@ -28,105 +27,83 @@ import android.widget.ProgressBar; import android.widget.TextView; -import org.w3c.dom.Text; - import java.util.Arrays; -import java.util.List; -import java.util.Map; import isdp.guess_a_song.model.Action; -import isdp.guess_a_song.controller.PlayerGame; import isdp.guess_a_song.controller.PubNubClient; import isdp.guess_a_song.model.UserProfile; import isdp.guess_a_song.utils.Constants; - public class JoinGame extends AppCompatActivity { private EditText gameID_field; private EditText gamePIN_field; private EditText name_field; private TextView info_field; - Button btnJoin; private ProgressBar spinner; - - private PlayerGame game; - private String gameID; private String gamePIN; private String userName; ImageView checkImg; - private PubNubClient client; + UserProfile player; + @Override protected void onCreate(Bundle savedInstanceState) { + + // INIT super.onCreate(savedInstanceState); setContentView(R.layout.activity_join_game); gameID_field= (EditText)findViewById(R.id.etGameId); gamePIN_field = (EditText) findViewById(R.id.etPin); name_field = (EditText) findViewById(R.id.etName); info_field = (TextView) findViewById(R.id.tvInfo); - btnJoin = (Button) findViewById(R.id.btJoin); - checkImg = (ImageView) findViewById(R.id.imageView); - - this.game = new PlayerGame(0,0); - spinner=(ProgressBar)findViewById(R.id.progressBar); checkImg.setVisibility(View.INVISIBLE); spinner.setVisibility(View.GONE); - + //this.game = new PlayerGame(0,0); + //Some adjustments btnJoin.setVisibility(View.VISIBLE); - info_field.setText("Please fill all fields and click Jooin"); + info_field.setText("Please fill all fields and click join"); } public void join(View view) { - - spinner.setVisibility(View.VISIBLE); - gameID = gameID_field.getText().toString(); gamePIN = gamePIN_field.getText().toString(); userName = name_field.getText().toString(); - spinner=(ProgressBar)findViewById(R.id.progressBar); + String uniqueID= Settings.Secure.getString(getApplicationContext().getContentResolver(), + Settings.Secure.ANDROID_ID); - this.client = new PubNubClient(new UserProfile(this.userName),this.gameID); - - // channel subscribed. Now waiting for players. - - if(userName==null){ - this.client.getPubnub().unsubscribeAll(); - } - -// Map r = this.client.getPresenceState(); -// -// for (Map.Entry entry : r.entrySet()) -// { -// System.out.println(entry.getKey() + "/" + entry.getValue()); -// Log.v(Constants.LOGT, "key: (" +entry.getKey() + ") value: "+entry.getValue().toString()); -// -// } + player = new UserProfile(userName,uniqueID,false,false); + //show spinner after button click + spinner.setVisibility(View.VISIBLE); + //init PubNub Client + PNConfiguration pnConfiguration = new PNConfiguration(); + this.client = new PubNubClient(player,this.gameID,false); - this.client.getRoomPlayers(); + //this.client.getRoomPlayers(); this.client.getPubnub().addListener(new SubscribeCallback() { @Override public void status(PubNub pubnub, PNStatus status) { if (status.getCategory() == PNStatusCategory.PNConnectedCategory){ - //USER CONNECTED - - //{ "action": "auth_checl", "value": "pin...","publisher": "nickname..","recipient": "THE BOSS"} - pubnub.publish().channel(gameID).message(new Action(Constants.A_LOG_IN, gamePIN, userName, Constants.HOST_USERNAME) ).async(new PNCallback() { + // USER CONNECTED + // Ask Host for authentication on connected + //{ "action": "auth_check", "value": "pin...","publisher": "nickname..","recipient": "THE BOSS"} + Action ask_auth = new Action(Constants.A_LOG_IN, gamePIN, userName, Constants.HOST_USERNAME); + pubnub.publish().channel(gameID).message( ask_auth ).async(new PNCallback() { @Override public void onResponse(PNPublishResult result, PNStatus status) { // handle publish response @@ -143,23 +120,18 @@ public void message(PubNub pubnub, PNMessageResult message) { if(action.getRecipient().equals(userName) || action.getRecipient().equals(Constants.A_FOR_ALL) ){ if (action.getAction().equals(Constants.A_AUTH_RESPONSE)) { if (action.getValue().equals(Constants.TRUE)) { - - JsonObject state = new JsonObject(); - state.addProperty("is_auth", true); - + //IF HOST sends to this user and action is authorisation and auth value is TRUE + player.setAuth(true); pubnub.setPresenceState() .channels(Arrays.asList(gameID)) //.uuid(userName) - .state(state) + .state(player.getState()) .async(new PNCallback() { @Override public void onResponse(final PNSetStateResult result, PNStatus status) { - Log.d(Constants.LOGT, "*** state updated"); + Log.d(Constants.LOGT, "set auth state true OK"); } }); - - - Log.d(Constants.LOGT, "PLAYER MESSAGE LISTENER: AUTH SUCCESS"); runOnUiThread(new Runnable() { @Override public void run() { @@ -170,14 +142,19 @@ public void run() { gameID_field.setVisibility(View.GONE); gamePIN_field.setVisibility(View.GONE); info_field.setText("Authentication Success! The Host will start soon the game"); - } }); - - game.setAuth(1); } else { - - Log.d(Constants.LOGT, "PLAYER MESSAGE LISTENER: AUTH FALSE"); + pubnub.setPresenceState() + .channels(Arrays.asList(gameID)) + //.uuid(userName) + .state(player.getState()) + .async(new PNCallback() { + @Override + public void onResponse(final PNSetStateResult result, PNStatus status) { + Log.d(Constants.LOGT, "set auth state false OK"); + } + }); client.getPubnub().unsubscribeAll(); runOnUiThread(new Runnable() { @@ -216,16 +193,13 @@ public void run() { @Override public void presence(PubNub pubnub, PNPresenceEventResult presence) { - Log.d(Constants.LOGT, "[USER PRESENCE] event "+ presence.getEvent()+ - "state:=" +presence.getState()+ " uuid:= "+ presence.getUuid()); - - - + //Log.d(Constants.LOGT, "[USER PRESENCE] event "+ presence.getEvent()+ + // "state:=" +presence.getState()+ " uuid:= "+ presence.getUuid()); } }); - this.client.subscribe(this.gameID,Constants.WITH_PRESENCE); + this.client.subscribe(this.gameID,Constants.NO_PRESENCE); //Intent for the join screen @@ -254,17 +228,12 @@ public void onClick(DialogInterface dialog, int which) { ); builder.show(); } - - - private ObjectNode createState() { - JsonNodeFactory factory = JsonNodeFactory.instance; - ObjectNode payload = factory.objectNode(); - - - payload.put("auth", 1); - payload.put("fullname", "Mindaugas"); - - - return payload; + @Override + protected void onStop() { + super.onStop(); + if(this.client.getPubnub()!=null){ + this.client.getPubnub().unsubscribeAll(); + } } + } diff --git a/application/app/src/main/java/isdp/guess_a_song/_4GameRoom.java b/application/app/src/main/java/isdp/guess_a_song/_4GameRoom.java index 84cf1ea..5604aa3 100644 --- a/application/app/src/main/java/isdp/guess_a_song/_4GameRoom.java +++ b/application/app/src/main/java/isdp/guess_a_song/_4GameRoom.java @@ -11,13 +11,17 @@ import com.google.gson.Gson; import com.pubnub.api.PubNub; +import com.pubnub.api.callbacks.PNCallback; import com.pubnub.api.callbacks.SubscribeCallback; import com.pubnub.api.enums.PNStatusCategory; import com.pubnub.api.models.consumer.PNStatus; +import com.pubnub.api.models.consumer.presence.PNSetStateResult; import com.pubnub.api.models.consumer.pubsub.PNMessageResult; import com.pubnub.api.models.consumer.pubsub.PNPresenceEventResult; import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import isdp.guess_a_song.model.Action; @@ -82,7 +86,10 @@ protected void onCreate(Bundle savedInstanceState) { this.gamePIN = Helpers.randomNumberString(Constants.RANDOM_MIN,Constants.RANDOM_MAX); //client - client = new PubNubClient(new UserProfile(Constants.HOST_USERNAME),this.gameID); + String uniqueID= android.provider.Settings.Secure.getString(getApplicationContext().getContentResolver(), + android.provider.Settings.Secure.ANDROID_ID); + final UserProfile host = new UserProfile(Constants.HOST_USERNAME,uniqueID,true,true); + client = new PubNubClient(host,this.gameID,true); @@ -91,6 +98,19 @@ protected void onCreate(Bundle savedInstanceState) { public void status(PubNub pubnub, PNStatus status) { if (status.getCategory() == PNStatusCategory.PNConnectedCategory){ + pubnub.setPresenceState() + .channels(Arrays.asList(gameID)) + //.uuid(userName) + .state(host.getState()) + .async(new PNCallback() { + @Override + public void onResponse(final PNSetStateResult result, PNStatus status) { + Log.d(Constants.LOGT, "set auth state true OK"); + } + }); + + + // pubnub.publish().channel("123456").message("status.getCategory() == PNStatusCategory.PNConnectedCategory").async(new PNCallback() { // @Override // public void onResponse(PNPublishResult result, PNStatus status) { @@ -113,9 +133,10 @@ public void message(PubNub pubnub, PNMessageResult message) { if(action.getValue().equals(gamePIN)){ Log.d(Constants.LOGT, "HOST MESSAGE LISTENER Player "+ action.getPublisher() + " auth true SUCCESS!"); - client.publish(gameID,new Action(Constants.A_AUTH_RESPONSE,Constants.TRUE,Constants.HOST_USERNAME,action.getPublisher())); + + client.publish(gameID,new Action(Constants.A_AUTH_RESPONSE,Constants.TRUE,Constants.HOST_USERNAME,action.getPublisher()),signHostMeta()); }else{ - client.publish(gameID,new Action(Constants.A_AUTH_RESPONSE,Constants.FALSE,Constants.HOST_USERNAME,action.getPublisher())); + client.publish(gameID,new Action(Constants.A_AUTH_RESPONSE,Constants.FALSE,Constants.HOST_USERNAME,action.getPublisher()),signHostMeta()); Log.d(Constants.LOGT, "HOST MESSAGE LISTENER Player "+ action.getPublisher() + " auth false (bad pin)"); } } @@ -183,7 +204,7 @@ public void startGame(View view) { players.add(new UserProfile(entry.getValue().getSender())); } } - client.publish(gameID,new Action(Constants.A_START_GAME,Constants.TRUE,Constants.HOST_USERNAME,Constants.A_FOR_ALL)); + client.publish(gameID,new Action(Constants.A_START_GAME,Constants.TRUE,Constants.HOST_USERNAME,Constants.A_FOR_ALL),signHostMeta()); // PresencePojo temp; // for (int i=0;i signHostMeta(){ + Map meta = new HashMap<>(); + meta.put("from", Constants.HOST_USERNAME); + return meta; + } } diff --git a/application/app/src/main/java/isdp/guess_a_song/controller/PubNubClient.java b/application/app/src/main/java/isdp/guess_a_song/controller/PubNubClient.java index 2a8f0f0..2dbb4a1 100644 --- a/application/app/src/main/java/isdp/guess_a_song/controller/PubNubClient.java +++ b/application/app/src/main/java/isdp/guess_a_song/controller/PubNubClient.java @@ -45,7 +45,7 @@ public class PubNubClient{ private UserProfile user; private boolean usePost; - public PubNubClient(UserProfile user,String gameID) { + public PubNubClient(UserProfile user,String gameID, boolean isHost) { this.gameID = gameID; this.user = user; @@ -54,19 +54,27 @@ public PubNubClient(UserProfile user,String gameID) { PNConfiguration config = new PNConfiguration(); config.setPublishKey(Constants.PKEY); config.setSubscribeKey(Constants.SKEY); - config.setUuid(this.user.getName()); //config.setSecure(true); + + if (isHost){ + config.setUuid(this.user.getName()); + }else{ + config.setUuid(this.user.getUuid()); + config.setFilterExpression("from == '" + Constants.HOST_USERNAME+"'"); + } + this.pubnub = new PubNub(config); Log.d(Constants.LOGT, user.getName() + " PubNub Client init"); } - public void publish(final String gameID, Action m) { + public void publish(final String gameID, Action m,Map meta) { try { pubnub.publish() .message(m) .channel(gameID) + .meta(meta) .shouldStore(true) .usePOST(this.usePost) .async(new PNCallback() { diff --git a/application/app/src/main/java/isdp/guess_a_song/model/PresencePojo.java b/application/app/src/main/java/isdp/guess_a_song/model/PresencePojo.java index 347b7e6..d616f4a 100644 --- a/application/app/src/main/java/isdp/guess_a_song/model/PresencePojo.java +++ b/application/app/src/main/java/isdp/guess_a_song/model/PresencePojo.java @@ -21,19 +21,29 @@ public class PresencePojo { private final String sender; private final String presence; private final String timestamp; + private String name; private boolean auth; public PresencePojo(@JsonProperty("sender") String sender, @JsonProperty("presence") String presence, @JsonProperty("timestamp") String timestamp) { this.sender = sender; this.presence = presence; this.timestamp = timestamp; + this.name=null; + this.auth = false; } - public PresencePojo(@JsonProperty("sender") String sender, @JsonProperty("presence") String presence, @JsonProperty("timestamp") String timestamp,@JsonProperty("auth") boolean auth) { - this.sender = sender; - this.presence = presence; - this.timestamp = timestamp; - this.auth = auth; + + public void setAuth(boolean auth) { + this.auth = auth; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; } + public String getSender() { return sender; } @@ -73,6 +83,11 @@ public int hashCode() { return Objects.hashCode(sender, presence, timestamp); } + public String getSenderOrName(){ + if (this.name !=null) + return this.name; + return this.sender; + } @Override public String toString() { return MoreObjects.toStringHelper(PresencePojo.class) diff --git a/application/app/src/main/java/isdp/guess_a_song/model/UserProfile.java b/application/app/src/main/java/isdp/guess_a_song/model/UserProfile.java index 6d6adc5..6babcc4 100644 --- a/application/app/src/main/java/isdp/guess_a_song/model/UserProfile.java +++ b/application/app/src/main/java/isdp/guess_a_song/model/UserProfile.java @@ -3,10 +3,14 @@ /** * Created on 16/10/2017, 6:11 PM */ - +import android.provider.Settings.Secure; import android.os.Parcel; import android.os.Parcelable; +import com.google.gson.JsonObject; + +import java.util.UUID; + /** * Player model * Parcelable model @@ -15,14 +19,44 @@ public class UserProfile implements Parcelable{ private String name; + private String uuid ; + private boolean auth; + private boolean isHost; + public UserProfile(String name, String id,boolean auth,boolean isHost) { + this.name = name; + this.auth = auth; + this.uuid = id; + } + + public UserProfile(String name, boolean auth) { + this.name = name; + this.auth = auth; + } public UserProfile(String name) { this.name = name; + this.auth = false; } public UserProfile() { this.name = null; + this.auth = false; + } + + public String getUuid() { + return uuid; } + public boolean isAuth() { + return auth; + } + + public void setAuth(boolean auth) { + this.auth = auth; + } + + public static Creator getCREATOR() { + return CREATOR; + } public String getName() { return name; @@ -46,7 +80,7 @@ public String toString() { public UserProfile(Parcel in){ this.name = in.readString(); - + //this.auth = in.read } @Override @@ -68,5 +102,10 @@ public UserProfile[] newArray(int size) { }; //end Parcelling - + public JsonObject getState() { + JsonObject state = new JsonObject(); + state.addProperty("is_auth", this.auth); + state.addProperty("name", this.name); + return state; + } } diff --git a/application/app/src/main/java/isdp/guess_a_song/pubsub/PresenceListAdapter.java b/application/app/src/main/java/isdp/guess_a_song/pubsub/PresenceListAdapter.java index 1b9a60e..6cf7135 100644 --- a/application/app/src/main/java/isdp/guess_a_song/pubsub/PresenceListAdapter.java +++ b/application/app/src/main/java/isdp/guess_a_song/pubsub/PresenceListAdapter.java @@ -50,7 +50,7 @@ public Map getItems(){ @Override public void add(PresencePojo message) { - if (latestPresence.containsKey(message.getSender())) { + if (latestPresence.containsKey(message.getSender()) || latestPresence.containsKey(message.getName())) { this.presenceList.remove(message.getSender()); } if(!message.getSender().equals("Console_Admin")){ @@ -89,8 +89,7 @@ public View getView(final int position, View convertView, ViewGroup parent) { } else { msgView = (PresenceMessageListRowUi) convertView.getTag(); } - - msgView.sender.setText(presenceMsg.getSender()); + msgView.sender.setText(presenceMsg.getSenderOrName()); msgView.presence.setText(presenceMsg.getPresence()); msgView.timestamp.setText(presenceMsg.getTimestamp()); msgView.auth.setText(String.valueOf(presenceMsg.isAuth())); diff --git a/application/app/src/main/java/isdp/guess_a_song/pubsub/PresencePnCallback.java b/application/app/src/main/java/isdp/guess_a_song/pubsub/PresencePnCallback.java index b2d33dd..8e88f75 100644 --- a/application/app/src/main/java/isdp/guess_a_song/pubsub/PresencePnCallback.java +++ b/application/app/src/main/java/isdp/guess_a_song/pubsub/PresencePnCallback.java @@ -45,33 +45,31 @@ public void message(PubNub pubnub, PNMessageResult message) { @Override public void presence(PubNub pubnub, PNPresenceEventResult presence) { PresencePojo pm; + String name = null; + boolean is_auth = false; try { Log.v(Constants.LOGT, "gotPresencePnCallback.java : (" +presence.toString() + ")"); String sender = presence.getUuid(); String presenceString = presence.getEvent().toString(); String timestamp = Helpers.getTimeStampUtc(); - - if (presence.getEvent().equals("state-change")) { - boolean is_auth = presence.getState() + if(presence.getState() != null){ + is_auth = presence.getState() .getAsJsonObject() .get("is_auth") .getAsBoolean(); - presenceString = "join + "+presenceString; - pm = new PresencePojo(sender, presenceString, timestamp,is_auth); - Log.d(Constants.LOGT, "HOST PRESENCE= "+pm.toString()); - }else{ - pm = new PresencePojo(sender, presenceString, timestamp); - Log.d(Constants.LOGT, "HOST PRESENCE= "+pm.toString()); + name = presence.getState().getAsJsonObject().get("name").getAsString(); } + pm = new PresencePojo(sender, presenceString, timestamp); + pm.setAuth(is_auth); + pm.setName(name); - + Log.d(Constants.LOGT, "HOST PRESENCE= " + pm.toString()); presenceListAdapter.add(pm); } catch (Exception e) { e.printStackTrace(); } - } } diff --git a/application/app/src/main/java/isdp/guess_a_song/utils/Helpers.java b/application/app/src/main/java/isdp/guess_a_song/utils/Helpers.java index 81d9a8e..4add2f0 100644 --- a/application/app/src/main/java/isdp/guess_a_song/utils/Helpers.java +++ b/application/app/src/main/java/isdp/guess_a_song/utils/Helpers.java @@ -1,5 +1,7 @@ package isdp.guess_a_song.utils; +import android.content.Context; +import android.content.SharedPreferences; import android.support.annotation.NonNull; import android.view.View; import android.view.ViewGroup; @@ -13,6 +15,7 @@ import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.UUID; /** @@ -26,6 +29,9 @@ * @Author Mindaugas Milius */ public class Helpers { + + private static String uniqueID = null; + private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID"; /** * * @param min min value for random number @@ -75,6 +81,26 @@ public static List numberToStringList(int numb){ public static List numberToStringList(String numb){ return Arrays.asList(numb); } + + + + public synchronized static String id(Context context) { + if (uniqueID == null) { + SharedPreferences sharedPrefs = context.getSharedPreferences( + PREF_UNIQUE_ID, Context.MODE_PRIVATE); + uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null); + + if (uniqueID == null) { + uniqueID = UUID.randomUUID().toString(); + SharedPreferences.Editor editor = sharedPrefs.edit(); + editor.putString(PREF_UNIQUE_ID, uniqueID); + editor.commit(); + } + } + + return uniqueID; + } + }