Hanging timer on Venu 2?

Hi,

Just in the last few weeks a few Venu 2 users of my app have complained that when they start an activity in the app the 'start' screen freezes and they can't exit it without resetting the watch.

The only change made over the last few months was to add support for a couple of additional watch models. This was just a recompile of the app with the additional devices listed in the manifest.

The code to show the 'started' screen is a view with a 1.5 second timer attached. When the timer completes, the view pops.  The code for this is below.  It has worked just fine up until now.

I am unable to recreate in the simulator, other than (perhaps?) just once when the screen hung with no exception or error message in the console. This may have been a coincidence. The users that this is affecting report that it happens every time they start an activity.

Does anyone have any ideas what might be happening, or anything defensive I could do to try to avoid it?  There are no errors reported in ERA

using Toybox.WatchUi;
using Toybox.Timer;

class ToastView extends WatchUi.View {
    
    const TOTAL_TIME=1500;
    const START_ANGLE=90;
    const INTERVAL=250;
    const PROGRESS_WIDTH=12;
    const LINGER_TIME=250;
    
    var mHeading;
    var mMessage;
    var mDescription;
    var mToastTimer;
    var mDoAnimate=false;
    var mTextColour;
    var mArcColour;
    var mProgress=0;
    var mTotalTime;
    var mTextSize;
    
    var mCurrentAngle=89;
    
    function initialize(params){
        View.initialize();
        mHeading=params.hasKey(:heading) ? params[:heading] : null;
        mDescription=params.hasKey(:description) ? params[:description] : null;
        mTotalTime= params.hasKey(:time) ? params[:time] : TOTAL_TIME;
        mMessage=params[:message];
        mDoAnimate=params[:animation];
        mTextColour = params[:textcolour];
        mArcColour = params[:arccolour];
        mTextSize = params.hasKey(:textsize) 
                        ? params[:textsize] 
                        : [Graphics.FONT_SYSTEM_LARGE, Graphics.FONT_SYSTEM_LARGE, Graphics.FONT_SYSTEM_LARGE];
        
        mToastTimer = new Timer.Timer();
        mToastTimer.start(method(:animate), INTERVAL, true);
        
        if(!mDoAnimate){
            mCurrentAngle = 90; //full arc
        }
    }
        
    function onUpdate(dc) {
        
        dc.setColor(mTextColour, Graphics.COLOR_BLACK);
        dc.clear();
        
        if(mTextColour!=null){
            
            dc.setColor(mTextColour, Graphics.COLOR_TRANSPARENT);
            
            if(mHeading!=null){
                dc.drawText(
                    dc.getWidth() /2,                
                    dc.getHeight() /4,                     
                    (mTextSize.size()>0 ? mTextSize[0] : Graphics.FONT_SYSTEM_LARGE),  
                    mHeading,      
                    Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
                );
            }
            
            if(mMessage!=null){
                dc.drawText(
                    dc.getWidth() /2,                
                    dc.getHeight() /2,                     
                    (mTextSize.size()>1 ? mTextSize[1] : Graphics.FONT_SYSTEM_LARGE),  
                    mMessage,      
                    Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
                );
            }
        
            if(mDescription!=null){
                dc.drawText(
                    dc.getWidth() /2,                
                    3* dc.getHeight() /4,                     
                    (mTextSize.size()>2 ? mTextSize[2] : Graphics.FONT_SYSTEM_LARGE),
                    mDescription,      
                    Graphics.TEXT_JUSTIFY_CENTER | Graphics.TEXT_JUSTIFY_VCENTER
                );
            }
        }
        
               
        if(mArcColour!=null){
            dc.setColor(mArcColour, Graphics.COLOR_TRANSPARENT);
            dc.setPenWidth(PROGRESS_WIDTH);
           
            var arcSize= System.getDeviceSettings().screenShape==System.SCREEN_SHAPE_ROUND 
                            ? dc.getWidth() /2  + 1
                            : 0.4 * dc.getWidth();
 
            dc.drawArc(dc.getWidth() /2,                
                       dc.getHeight() /2,
                       arcSize,
                       Graphics.ARC_CLOCKWISE,
                       START_ANGLE,
                       mCurrentAngle);
        }
    }
    
    function animate(){
        
        mProgress++;
        if(mProgress * INTERVAL >=mTotalTime){
            mToastTimer.stop();
            WatchUi.popView(WatchUi.SLIDE_DOWN);
            return;
        }
        
        if(mDoAnimate){
            mCurrentAngle = START_ANGLE - 360 * (mProgress * INTERVAL.toFloat()/(mTotalTime.toFloat()-LINGER_TIME));
            if(mCurrentAngle < 0){
                mCurrentAngle = 360 + mCurrentAngle;
            }
            
            WatchUi.requestUpdate();
        }
    }
}

class ToastDelegate extends WatchUi.BehaviorDelegate {

    function initialize() {
        BehaviorDelegate.initialize();
    }    
    
    function onBack(){
        return false;
    }
    
    function onKey(evt) {
        return true;
    }
    
}