github.com/cyrilou242/gomobile-java@v0.0.0-20220215185836-09daef25a210/event/lifecycle/lifecycle.go (about)

     1  // Copyright 2015 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  // Package lifecycle defines an event for an app's lifecycle.
     6  //
     7  // The app lifecycle consists of moving back and forth between an ordered
     8  // sequence of stages. For example, being at a stage greater than or equal to
     9  // StageVisible means that the app is visible on the screen.
    10  //
    11  // A lifecycle event is a change from one stage to another, which crosses every
    12  // intermediate stage. For example, changing from StageAlive to StageFocused
    13  // implicitly crosses StageVisible.
    14  //
    15  // Crosses can be in a positive or negative direction. A positive crossing of
    16  // StageFocused means that the app has gained the focus. A negative crossing
    17  // means it has lost the focus.
    18  //
    19  // See the github.com/cyrilou242/gomobile-java/app package for details on the event model.
    20  package lifecycle // import "github.com/cyrilou242/gomobile-java/event/lifecycle"
    21  
    22  import (
    23  	"fmt"
    24  )
    25  
    26  // Cross is whether a lifecycle stage was crossed.
    27  type Cross uint32
    28  
    29  func (c Cross) String() string {
    30  	switch c {
    31  	case CrossOn:
    32  		return "on"
    33  	case CrossOff:
    34  		return "off"
    35  	}
    36  	return "none"
    37  }
    38  
    39  const (
    40  	CrossNone Cross = 0
    41  	CrossOn   Cross = 1
    42  	CrossOff  Cross = 2
    43  )
    44  
    45  // Event is a lifecycle change from an old stage to a new stage.
    46  type Event struct {
    47  	From, To Stage
    48  
    49  	// DrawContext is the state used for painting, if any is valid.
    50  	//
    51  	// For OpenGL apps, a non-nil DrawContext is a gl.Context.
    52  	//
    53  	// TODO: make this an App method if we move away from an event channel?
    54  	DrawContext interface{}
    55  }
    56  
    57  func (e Event) String() string {
    58  	return fmt.Sprintf("lifecycle.Event{From:%v, To:%v, DrawContext:%v}", e.From, e.To, e.DrawContext)
    59  }
    60  
    61  // Crosses reports whether the transition from From to To crosses the stage s:
    62  // 	- It returns CrossOn if it does, and the lifecycle change is positive.
    63  // 	- It returns CrossOff if it does, and the lifecycle change is negative.
    64  //	- Otherwise, it returns CrossNone.
    65  // See the documentation for Stage for more discussion of positive and negative
    66  // crosses.
    67  func (e Event) Crosses(s Stage) Cross {
    68  	switch {
    69  	case e.From < s && e.To >= s:
    70  		return CrossOn
    71  	case e.From >= s && e.To < s:
    72  		return CrossOff
    73  	}
    74  	return CrossNone
    75  }
    76  
    77  // Stage is a stage in the app's lifecycle. The values are ordered, so that a
    78  // lifecycle change from stage From to stage To implicitly crosses every stage
    79  // in the range (min, max], exclusive on the low end and inclusive on the high
    80  // end, where min is the minimum of From and To, and max is the maximum.
    81  //
    82  // The documentation for individual stages talk about positive and negative
    83  // crosses. A positive lifecycle change is one where its From stage is less
    84  // than its To stage. Similarly, a negative lifecycle change is one where From
    85  // is greater than To. Thus, a positive lifecycle change crosses every stage in
    86  // the range (From, To] in increasing order, and a negative lifecycle change
    87  // crosses every stage in the range (To, From] in decreasing order.
    88  type Stage uint32
    89  
    90  // TODO: how does iOS map to these stages? What do cross-platform mobile
    91  // abstractions do?
    92  
    93  const (
    94  	// StageDead is the zero stage. No lifecycle change crosses this stage,
    95  	// but:
    96  	//	- A positive change from this stage is the very first lifecycle change.
    97  	//	- A negative change to this stage is the very last lifecycle change.
    98  	StageDead Stage = iota
    99  
   100  	// StageAlive means that the app is alive.
   101  	//	- A positive cross means that the app has been created.
   102  	//	- A negative cross means that the app is being destroyed.
   103  	// Each cross, either from or to StageDead, will occur only once.
   104  	// On Android, these correspond to onCreate and onDestroy.
   105  	StageAlive
   106  
   107  	// StageVisible means that the app window is visible.
   108  	//	- A positive cross means that the app window has become visible.
   109  	//	- A negative cross means that the app window has become invisible.
   110  	// On Android, these correspond to onStart and onStop.
   111  	// On Desktop, an app window can become invisible if e.g. it is minimized,
   112  	// unmapped, or not on a visible workspace.
   113  	StageVisible
   114  
   115  	// StageFocused means that the app window has the focus.
   116  	//	- A positive cross means that the app window has gained the focus.
   117  	//	- A negative cross means that the app window has lost the focus.
   118  	// On Android, these correspond to onResume and onFreeze.
   119  	StageFocused
   120  )
   121  
   122  func (s Stage) String() string {
   123  	switch s {
   124  	case StageDead:
   125  		return "StageDead"
   126  	case StageAlive:
   127  		return "StageAlive"
   128  	case StageVisible:
   129  		return "StageVisible"
   130  	case StageFocused:
   131  		return "StageFocused"
   132  	default:
   133  		return fmt.Sprintf("lifecycle.Stage(%d)", s)
   134  	}
   135  }