mirror of
git://xwords.git.sourceforge.net/gitroot/xwords/xwords
synced 2025-01-02 06:20:14 +01:00
format status timestamps in terms of how long ago (using
getRelativeDateTimeString); save and restore serialized timestamps.
This commit is contained in:
parent
52e70bff3d
commit
9b9aec45da
7 changed files with 101 additions and 24 deletions
|
@ -64,6 +64,7 @@
|
|||
<string name="key_bt_names">key_bt_names</string>
|
||||
<string name="key_bt_addrs">key_bt_addrs</string>
|
||||
<string name="key_sms_phones">key_sms_phones</string>
|
||||
<string name="key_connstat_data">key_connstat_data</string>
|
||||
|
||||
<string name="key_notagain_sync">key_notagain_sync</string>
|
||||
<string name="key_notagain_chat">key_notagain_chat</string>
|
||||
|
|
|
@ -882,7 +882,7 @@ public class BoardActivity extends XWActivity
|
|||
// m_jniThread.handle( JNICmd.CMD_DRAW_BT_STATUS, accepted );
|
||||
// }
|
||||
ConnStatusHandler.
|
||||
updateStatusIn(CommsAddrRec.CommsConnType.COMMS_CONN_BT,
|
||||
updateStatusIn(this, CommsAddrRec.CommsConnType.COMMS_CONN_BT,
|
||||
MultiService.MultiEvent.MESSAGE_ACCEPTED == event);
|
||||
break;
|
||||
case MESSAGE_NOGAME:
|
||||
|
|
|
@ -217,7 +217,7 @@ public class BoardView extends View implements DrawCtx, BoardHandler,
|
|||
break;
|
||||
case MotionEvent.ACTION_UP:
|
||||
if ( ConnStatusHandler.handleUp( xx, yy ) ) {
|
||||
String msg = ConnStatusHandler.getStatusText();
|
||||
String msg = ConnStatusHandler.getStatusText(m_context);
|
||||
m_parent.showOKOnlyDialog( msg );
|
||||
} else {
|
||||
m_jniThread.handle( JNIThread.JNICmd.CMD_PEN_UP, xx, yy );
|
||||
|
|
|
@ -407,18 +407,22 @@ public class CommsTransport implements TransportProcs,
|
|||
case COMMS_RELAYSTATE_UNCONNECTED:
|
||||
case COMMS_RELAYSTATE_DENIED:
|
||||
case COMMS_RELAYSTATE_CONNECT_PENDING:
|
||||
ConnStatusHandler.updateStatusOut( CommsConnType.COMMS_CONN_RELAY,
|
||||
ConnStatusHandler.updateStatusOut( m_context,
|
||||
CommsConnType.COMMS_CONN_RELAY,
|
||||
false );
|
||||
ConnStatusHandler.updateStatusIn( CommsConnType.COMMS_CONN_RELAY,
|
||||
ConnStatusHandler.updateStatusIn( m_context,
|
||||
CommsConnType.COMMS_CONN_RELAY,
|
||||
false );
|
||||
break;
|
||||
case COMMS_RELAYSTATE_CONNECTED:
|
||||
case COMMS_RELAYSTATE_RECONNECTED:
|
||||
ConnStatusHandler.updateStatusOut( CommsConnType.COMMS_CONN_RELAY,
|
||||
ConnStatusHandler.updateStatusOut( m_context,
|
||||
CommsConnType.COMMS_CONN_RELAY,
|
||||
true );
|
||||
break;
|
||||
case COMMS_RELAYSTATE_ALLCONNECTED:
|
||||
ConnStatusHandler.updateStatusIn( CommsConnType.COMMS_CONN_RELAY,
|
||||
ConnStatusHandler.updateStatusIn( m_context,
|
||||
CommsConnType.COMMS_CONN_RELAY,
|
||||
true );
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
|
||||
package org.eehouse.android.xw4;
|
||||
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.res.Resources;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Paint;
|
||||
|
@ -27,11 +29,18 @@ import android.graphics.Rect;
|
|||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Handler;
|
||||
import android.os.Message;
|
||||
import android.text.format.DateUtils;
|
||||
import android.text.format.Time;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.ObjectInputStream;
|
||||
import java.io.ObjectOutputStream;
|
||||
import java.util.HashMap;
|
||||
import junit.framework.Assert;
|
||||
|
||||
import org.eehouse.android.xw4.jni.CommonPrefs;
|
||||
import org.eehouse.android.xw4.jni.CommsAddrRec.CommsConnType;
|
||||
import org.eehouse.android.xw4.jni.XwJNI;
|
||||
|
||||
public class ConnStatusHandler {
|
||||
// private static final int GREEN = 0x7F00FF00;
|
||||
|
@ -45,9 +54,9 @@ public class ConnStatusHandler {
|
|||
private static Handler s_handler;
|
||||
private static Paint s_fillPaint = new Paint( Paint.ANTI_ALIAS_FLAG );
|
||||
|
||||
private static class SuccessRecord {
|
||||
private static class SuccessRecord implements java.io.Serializable {
|
||||
// man strftime for these
|
||||
private static final String TIME_FMT = "%X %x";
|
||||
// private static final String TIME_FMT = "%X %x";
|
||||
private static final Time s_zero = new Time();
|
||||
public Time lastSuccess;
|
||||
public Time lastFailure;
|
||||
|
@ -70,16 +79,17 @@ public class ConnStatusHandler {
|
|||
return lastSuccess.after( s_zero );
|
||||
}
|
||||
|
||||
public String newerStr()
|
||||
public String newerStr( Context context )
|
||||
{
|
||||
Time which = successNewer? lastSuccess : lastFailure;
|
||||
return which.format( TIME_FMT );
|
||||
return format( context, which );
|
||||
// return which.format( TIME_FMT );
|
||||
}
|
||||
|
||||
public String olderStr()
|
||||
public String olderStr( Context context )
|
||||
{
|
||||
Time which = successNewer? lastFailure : lastSuccess;
|
||||
return which.format( TIME_FMT );
|
||||
return format( context, which );
|
||||
}
|
||||
|
||||
public void update( boolean success )
|
||||
|
@ -88,10 +98,22 @@ public class ConnStatusHandler {
|
|||
last.setToNow();
|
||||
successNewer = success;
|
||||
}
|
||||
|
||||
private String format( Context context, Time time )
|
||||
{
|
||||
CharSequence seq =
|
||||
DateUtils.getRelativeDateTimeString( context,
|
||||
time.toMillis(true),
|
||||
DateUtils.MINUTE_IN_MILLIS,
|
||||
DateUtils.WEEK_IN_MILLIS,
|
||||
0 );
|
||||
return seq.toString();
|
||||
}
|
||||
}
|
||||
|
||||
private static HashMap<CommsConnType,SuccessRecord[]> s_records =
|
||||
new HashMap<CommsConnType,SuccessRecord[]>();
|
||||
private static Object s_lockObj = new Object();
|
||||
|
||||
public static void setRect( int left, int top, int right, int bottom )
|
||||
{
|
||||
|
@ -126,20 +148,20 @@ public class ConnStatusHandler {
|
|||
return s_downOnMe && s_rect.contains( xx, yy );
|
||||
}
|
||||
|
||||
public static String getStatusText()
|
||||
public static String getStatusText( Context context )
|
||||
{
|
||||
String msg;
|
||||
if ( CommsConnType.COMMS_CONN_NONE == s_connType ) {
|
||||
msg = "This is a standalone game. There is no network status.";
|
||||
} else {
|
||||
synchronized( s_records ) {
|
||||
synchronized( s_lockObj ) {
|
||||
msg = "Network status for game connected via " + connType2Str();
|
||||
msg += ":\n\n";
|
||||
SuccessRecord record = recordFor( s_connType, false );
|
||||
msg +=
|
||||
String.format( "Last send was %s (at %s)\n",
|
||||
record.successNewer? "successful":"unsuccessful",
|
||||
record.newerStr() );
|
||||
record.newerStr( context ) );
|
||||
|
||||
String fmt = null;
|
||||
if ( record.successNewer ) {
|
||||
|
@ -152,7 +174,7 @@ public class ConnStatusHandler {
|
|||
}
|
||||
}
|
||||
if ( null != fmt ) {
|
||||
msg += String.format( fmt, record.olderStr() );
|
||||
msg += String.format( fmt, record.olderStr( context ) );
|
||||
}
|
||||
msg += "\n";
|
||||
|
||||
|
@ -160,7 +182,7 @@ public class ConnStatusHandler {
|
|||
if ( record.haveSuccess() ) {
|
||||
msg +=
|
||||
String.format( "Last receipt was at %s",
|
||||
record.newerStr() );
|
||||
record.newerStr( context ) );
|
||||
} else {
|
||||
msg += "No messages have been received.";
|
||||
}
|
||||
|
@ -176,28 +198,32 @@ public class ConnStatusHandler {
|
|||
}
|
||||
}
|
||||
|
||||
public static void updateStatusIn( CommsConnType connType, boolean success )
|
||||
public static void updateStatusIn( Context context,
|
||||
CommsConnType connType, boolean success )
|
||||
{
|
||||
synchronized( s_records ) {
|
||||
synchronized( s_lockObj ) {
|
||||
SuccessRecord record = recordFor( connType, true );
|
||||
record.update( success );
|
||||
}
|
||||
invalidateParent();
|
||||
saveState( context );
|
||||
}
|
||||
|
||||
public static void updateStatusOut( CommsConnType connType, boolean success )
|
||||
public static void updateStatusOut( Context context,
|
||||
CommsConnType connType, boolean success )
|
||||
{
|
||||
synchronized( s_records ) {
|
||||
synchronized( s_lockObj ) {
|
||||
SuccessRecord record = recordFor( connType, false );
|
||||
record.update( success );
|
||||
}
|
||||
invalidateParent();
|
||||
saveState( context );
|
||||
}
|
||||
|
||||
public static void draw( Canvas canvas, Resources res,
|
||||
int offsetX, int offsetY )
|
||||
{
|
||||
synchronized( s_records ) {
|
||||
synchronized( s_lockObj ) {
|
||||
if ( null != s_rect ) {
|
||||
int iconID;
|
||||
switch( s_connType ) {
|
||||
|
@ -254,6 +280,51 @@ public class ConnStatusHandler {
|
|||
}
|
||||
}
|
||||
|
||||
public static void loadState( Context context )
|
||||
{
|
||||
synchronized( s_lockObj ) {
|
||||
String as64 = CommonPrefs.getPrefsString( context,
|
||||
R.string.key_connstat_data );
|
||||
if ( null != as64 && 0 < as64.length() ) {
|
||||
byte[] bytes = XwJNI.base64Decode( as64 );
|
||||
try {
|
||||
ObjectInputStream ois =
|
||||
new ObjectInputStream( new ByteArrayInputStream(bytes) );
|
||||
s_records =
|
||||
(HashMap<CommsConnType,SuccessRecord[]>)ois.readObject();
|
||||
// } catch ( java.io.StreamCorruptedException sce ) {
|
||||
// DbgUtils.logf( "loadState: %s", sce.toString() );
|
||||
// } catch ( java.io.OptionalDataException ode ) {
|
||||
// DbgUtils.logf( "loadState: %s", ode.toString() );
|
||||
// } catch ( java.io.IOException ioe ) {
|
||||
// DbgUtils.logf( "loadState: %s", ioe.toString() );
|
||||
// } catch ( java.lang.ClassNotFoundException cnfe ) {
|
||||
// DbgUtils.logf( "loadState: %s", cnfe.toString() );
|
||||
} catch ( Exception ex ) {
|
||||
DbgUtils.logf( "loadState: %s", ex.toString() );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void saveState( Context context )
|
||||
{
|
||||
DbgUtils.logf( "saveState called; need to coalesce these!!!" );
|
||||
synchronized( s_lockObj ) {
|
||||
ByteArrayOutputStream bas = new ByteArrayOutputStream();
|
||||
try {
|
||||
ObjectOutputStream out = new ObjectOutputStream( bas );
|
||||
out.writeObject(s_records);
|
||||
out.flush();
|
||||
String as64 = XwJNI.base64Encode( bas.toByteArray() );
|
||||
CommonPrefs.setPrefsString( context,
|
||||
R.string.key_connstat_data, as64 );
|
||||
} catch ( java.io.IOException ioe ) {
|
||||
DbgUtils.logf( "loadState: %s", ioe.toString() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void drawIn( Canvas canvas, Resources res, int id, Rect rect )
|
||||
{
|
||||
Drawable icon = res.getDrawable( id );
|
||||
|
|
|
@ -240,7 +240,7 @@ public class SMSService extends Service {
|
|||
case HANDLE:
|
||||
++m_nReceived;
|
||||
ConnStatusHandler.
|
||||
updateStatusIn( CommsConnType.COMMS_CONN_SMS,
|
||||
updateStatusIn( this, CommsConnType.COMMS_CONN_SMS,
|
||||
true );
|
||||
if ( s_showToasts ) {
|
||||
DbgUtils.showf( this, "got %dth msg", m_nReceived );
|
||||
|
@ -544,7 +544,7 @@ public class SMSService extends Service {
|
|||
ee.toString() );
|
||||
}
|
||||
|
||||
ConnStatusHandler.updateStatusOut( CommsConnType.COMMS_CONN_SMS,
|
||||
ConnStatusHandler.updateStatusOut( this, CommsConnType.COMMS_CONN_SMS,
|
||||
success );
|
||||
return success;
|
||||
}
|
||||
|
|
|
@ -50,6 +50,7 @@ public class XWApp extends Application {
|
|||
|
||||
RelayReceiver.RestartTimer( this );
|
||||
BTService.startService( this );
|
||||
ConnStatusHandler.loadState( this );
|
||||
}
|
||||
|
||||
public static UUID getAppUUID()
|
||||
|
|
Loading…
Reference in a new issue