mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-04 23:02:02 +01:00
follow relay reg protocol change to always send relayID even if empty;
track whether current registration is good, but DON'T throw current relayID away when gcm id changes, rather, reregister with same relayID.
This commit is contained in:
parent
2e6d49303b
commit
9d722e0b13
4 changed files with 69 additions and 13 deletions
|
@ -68,8 +68,11 @@
|
|||
<string name="key_sms_phones">key_sms_phones</string>
|
||||
<string name="key_connstat_data">key_connstat_data</string>
|
||||
<string name="key_dev_id">key_dev_id</string>
|
||||
|
||||
<string name="key_gcmvers_regid">key_gcmvers_regid</string>
|
||||
<string name="key_relay_regid">key_relay_regid</string>
|
||||
<string name="key_relay_regid_ackd">key_relay_regid_ackd</string>
|
||||
|
||||
<string name="key_checked_sms">key_checked_sms</string>
|
||||
<string name="key_default_group">key_default_group</string>
|
||||
<string name="key_group_posns">key_group_posns</string>
|
||||
|
|
|
@ -53,6 +53,7 @@ public class GCMIntentService extends GCMBaseIntentService {
|
|||
{
|
||||
DbgUtils.logf( "GCMIntentService.onUnregistered(%s)", regId );
|
||||
XWPrefs.clearGCMDevID( context );
|
||||
RelayService.devIDChanged();
|
||||
notifyRelayService( false );
|
||||
}
|
||||
|
||||
|
|
|
@ -82,6 +82,7 @@ public class RelayService extends XWService
|
|||
private static HashSet<Integer> s_packetsSent = new HashSet<Integer>();
|
||||
private static int s_nextPacketID = 1;
|
||||
private static boolean s_gcmWorking = false;
|
||||
private static boolean s_registered = false;
|
||||
|
||||
private Thread m_fetchThread = null;
|
||||
private Thread m_UDPReadThread = null;
|
||||
|
@ -125,8 +126,8 @@ public class RelayService extends XWService
|
|||
if ( s_gcmWorking != confirmed ) {
|
||||
DbgUtils.logf( "RelayService.gcmConfirmed(): changing "
|
||||
+ "s_gcmWorking to %b", confirmed );
|
||||
s_gcmWorking = confirmed;
|
||||
}
|
||||
s_gcmWorking = confirmed;
|
||||
}
|
||||
|
||||
public static void startService( Context context )
|
||||
|
@ -164,6 +165,11 @@ public class RelayService extends XWService
|
|||
return result;
|
||||
}
|
||||
|
||||
public static void devIDChanged()
|
||||
{
|
||||
s_registered = false;
|
||||
}
|
||||
|
||||
// Exists to get incoming data onto the main thread
|
||||
private static void postData( Context context, long rowid, byte[] msg )
|
||||
{
|
||||
|
@ -290,7 +296,7 @@ public class RelayService extends XWService
|
|||
DbgUtils.logf( "not connecting: no network" );
|
||||
} else if ( startFetchThreadIf() ) {
|
||||
// do nothing
|
||||
} else {
|
||||
} else if ( registerWithRelayIfNot() ) {
|
||||
requestMessages();
|
||||
}
|
||||
break;
|
||||
|
@ -555,6 +561,7 @@ public class RelayService extends XWService
|
|||
str = getVLIString( dis );
|
||||
DbgUtils.logf( "bad relayID \"%s\" reported", str );
|
||||
XWPrefs.clearRelayDevID( this );
|
||||
s_registered = false;
|
||||
registerWithRelay();
|
||||
break;
|
||||
case XWPDEV_REGRSP:
|
||||
|
@ -564,6 +571,7 @@ public class RelayService extends XWService
|
|||
maxIntervalSeconds );
|
||||
setMaxIntervalSeconds( maxIntervalSeconds );
|
||||
XWPrefs.setRelayDevID( this, str );
|
||||
s_registered = true;
|
||||
break;
|
||||
case XWPDEV_HAVEMSGS:
|
||||
requestMessages();
|
||||
|
@ -610,18 +618,50 @@ public class RelayService extends XWService
|
|||
gotPacket( data, false );
|
||||
} // gotPacket
|
||||
|
||||
private boolean shouldRegister()
|
||||
{
|
||||
String relayID = XWPrefs.getRelayDevID( this );
|
||||
boolean registered = null != relayID;
|
||||
if ( registered ) {
|
||||
registered = XWPrefs
|
||||
.getPrefsBoolean( this, R.string.key_relay_regid_ackd, false );
|
||||
}
|
||||
DbgUtils.logf( "shouldRegister()=>%b", !registered );
|
||||
return !registered;
|
||||
}
|
||||
|
||||
// Register: pass both the relay-assigned relayID (or empty string
|
||||
// if none has been assigned yet) and the deviceID IFF it's
|
||||
// changed since we last registered (Otherwise just ID_TYPE_NONE
|
||||
// and no string)
|
||||
//
|
||||
// How do we know if we need to register? We keep a timestamp
|
||||
// indicating when we last got a reg-response. When the GCM id
|
||||
// changes, that timestamp is cleared.
|
||||
private void registerWithRelay()
|
||||
{
|
||||
DevIDType[] typ = new DevIDType[1];
|
||||
String devid = getDevID( typ );
|
||||
boolean ackd =
|
||||
XWPrefs.getPrefsBoolean( this, R.string.key_relay_regid_ackd,
|
||||
false );
|
||||
String relayID = XWPrefs.getRelayDevID( this );
|
||||
DevIDType[] typa = new DevIDType[1];
|
||||
String devid = getDevID( typa );
|
||||
DevIDType typ = typa[0];
|
||||
|
||||
ByteArrayOutputStream bas = new ByteArrayOutputStream();
|
||||
try {
|
||||
DataOutputStream out = new DataOutputStream( bas );
|
||||
out.writeByte( typ[0].ordinal() );
|
||||
writeVLIString( out, devid );
|
||||
|
||||
writeVLIString( out, relayID ); // may be empty
|
||||
if ( ackd && DevIDType.ID_TYPE_RELAY == typ ) { // all's well
|
||||
out.writeByte( DevIDType.ID_TYPE_NONE.ordinal() );
|
||||
} else {
|
||||
out.writeByte( typ.ordinal() );
|
||||
writeVLIString( out, devid );
|
||||
}
|
||||
|
||||
DbgUtils.logf( "registering devID \"%s\" (type=%s)", devid,
|
||||
typ[0].toString() );
|
||||
typ.toString() );
|
||||
|
||||
out.writeShort( GitVersion.CLIENT_VERS_RELAY );
|
||||
writeVLIString( out, GitVersion.VERS );
|
||||
|
@ -634,6 +674,14 @@ public class RelayService extends XWService
|
|||
}
|
||||
}
|
||||
|
||||
private boolean registerWithRelayIfNot()
|
||||
{
|
||||
if ( !s_registered && shouldRegister() ) {
|
||||
registerWithRelay();
|
||||
}
|
||||
return s_registered;
|
||||
}
|
||||
|
||||
private void requestMessagesImpl( XWRelayReg reg )
|
||||
{
|
||||
ByteArrayOutputStream bas = new ByteArrayOutputStream();
|
||||
|
@ -654,10 +702,10 @@ public class RelayService extends XWService
|
|||
requestMessagesImpl( XWRelayReg.XWPDEV_RQSTMSGS );
|
||||
}
|
||||
|
||||
private void sendKeepAlive()
|
||||
{
|
||||
requestMessagesImpl( XWRelayReg.XWPDEV_KEEPALIVE );
|
||||
}
|
||||
// private void sendKeepAlive()
|
||||
// {
|
||||
// requestMessagesImpl( XWRelayReg.XWPDEV_KEEPALIVE );
|
||||
// }
|
||||
|
||||
private void sendMessage( long rowid, byte[] msg )
|
||||
{
|
||||
|
@ -1063,6 +1111,9 @@ public class RelayService extends XWService
|
|||
private static void writeVLIString( DataOutputStream os, String str )
|
||||
throws java.io.IOException
|
||||
{
|
||||
if ( null == str ) {
|
||||
str = "";
|
||||
}
|
||||
int len = str.length();
|
||||
un2vli( len, os );
|
||||
os.writeBytes( str );
|
||||
|
|
|
@ -225,7 +225,7 @@ public class XWPrefs {
|
|||
{
|
||||
int curVers = Utils.getAppVersion( context );
|
||||
setPrefsInt( context, R.string.key_gcmvers_regid, curVers );
|
||||
clearPrefsKey( context, R.string.key_relay_regid );
|
||||
setPrefsBoolean( context, R.string.key_relay_regid_ackd, false );
|
||||
}
|
||||
|
||||
public static String getGCMDevID( Context context )
|
||||
|
@ -243,7 +243,7 @@ public class XWPrefs {
|
|||
|
||||
public static void clearGCMDevID( Context context )
|
||||
{
|
||||
clearRelayDevID( context );
|
||||
setPrefsBoolean( context, R.string.key_relay_regid_ackd, false );
|
||||
}
|
||||
|
||||
public static String getRelayDevID( Context context )
|
||||
|
@ -258,6 +258,7 @@ public class XWPrefs {
|
|||
public static void setRelayDevID( Context context, String idRelay )
|
||||
{
|
||||
setPrefsString( context, R.string.key_relay_regid, idRelay );
|
||||
setPrefsBoolean( context, R.string.key_relay_regid_ackd, true );
|
||||
}
|
||||
|
||||
public static void clearRelayDevID( Context context )
|
||||
|
|
Loading…
Reference in a new issue