remove a delegate's alerts when it stops

Fixing a crash when a game offers both to create a rematch and to delete
itself because its opponent has been deleted. Deleting and then hitting
rematch would crash because the rematch alert referred to a dead
game. Now onStop() for delegates removes any pending alerts. In
dual-pane mode only since when there's an activity going away the alerts
go automatically.
This commit is contained in:
Eric House 2016-08-12 18:06:11 -07:00
parent a7795dd160
commit 80e1f588d0
4 changed files with 31 additions and 2 deletions

View file

@ -92,7 +92,6 @@ public class DelegateBase implements DlgClickNotify,
protected void onCreateContextMenu( ContextMenu menu, View view,
ContextMenuInfo menuInfo ) {}
protected boolean onContextItemSelected( MenuItem item ) { return false; }
protected void onStop() {}
protected void onDestroy() {}
protected void onWindowFocusChanged( boolean hasFocus ) {}
protected boolean handleBackPressed() { return false; }
@ -142,6 +141,15 @@ public class DelegateBase implements DlgClickNotify,
XWService.setListener( null );
}
protected void onStop()
{
// Alerts disappear on their own if not in dualpane mode
if ( m_activity instanceof MainActivity
&& ((MainActivity)m_activity).inDPMode() ) {
DlgDelegate.closeAlerts( m_activity, this );
}
}
protected DelegateBase curThis()
{
DelegateBase result = null;

View file

@ -552,9 +552,11 @@ public class DictsDelegate extends ListDelegateBase
setTitleBar();
}
@Override
protected void onStop()
{
MountEventReceiver.unregister( this );
super.onStop();
}
public void onClick( View view )

View file

@ -938,6 +938,24 @@ public class DlgDelegate {
}
}
protected static void closeAlerts( Activity activity, DelegateBase base )
{
DbgUtils.assertOnUIThread();
Iterator<DlgID> iter = s_pendings.keySet().iterator();
while ( iter.hasNext() ) {
DlgID dlgID = iter.next();
DelegateBase oneBase = s_pendings.get( dlgID ).get();
if ( null == oneBase ) {
iter.remove(); // no point in keeping it
} else if ( base.equals( oneBase ) ) {
DbgUtils.logdf( "removing alert %s for %s", dlgID.toString(),
oneBase.toString() );
activity.removeDialog( dlgID.ordinal() );
iter.remove(); // no point in keeping this either
}
}
}
private String getString( int id, Object... params )
{
return m_dlgt.getString( id, params );

View file

@ -1004,6 +1004,7 @@ public class GamesListDelegate extends ListDelegateBase
return true; // handled it
}
@Override
protected void onStop()
{
// TelephonyManager mgr =
@ -1012,7 +1013,7 @@ public class GamesListDelegate extends ListDelegateBase
// m_phoneStateListener = null;
long[] positions = m_adapter.getGroupPositions();
XWPrefs.setGroupPositions( m_activity, positions );
// super.onStop();
super.onStop();
}
protected void onDestroy()