github.com/coming-chat/gomobile@v0.0.0-20220601074111-56995f7d7aba/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 golang.org/x/mobile/app package for details on the event model. 20 package lifecycle // import "golang.org/x/mobile/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 // 66 // See the documentation for Stage for more discussion of positive and negative 67 // crosses. 68 func (e Event) Crosses(s Stage) Cross { 69 switch { 70 case e.From < s && e.To >= s: 71 return CrossOn 72 case e.From >= s && e.To < s: 73 return CrossOff 74 } 75 return CrossNone 76 } 77 78 // Stage is a stage in the app's lifecycle. The values are ordered, so that a 79 // lifecycle change from stage From to stage To implicitly crosses every stage 80 // in the range (min, max], exclusive on the low end and inclusive on the high 81 // end, where min is the minimum of From and To, and max is the maximum. 82 // 83 // The documentation for individual stages talk about positive and negative 84 // crosses. A positive lifecycle change is one where its From stage is less 85 // than its To stage. Similarly, a negative lifecycle change is one where From 86 // is greater than To. Thus, a positive lifecycle change crosses every stage in 87 // the range (From, To] in increasing order, and a negative lifecycle change 88 // crosses every stage in the range (To, From] in decreasing order. 89 type Stage uint32 90 91 // TODO: how does iOS map to these stages? What do cross-platform mobile 92 // abstractions do? 93 94 const ( 95 // StageDead is the zero stage. No lifecycle change crosses this stage, 96 // but: 97 // - A positive change from this stage is the very first lifecycle change. 98 // - A negative change to this stage is the very last lifecycle change. 99 StageDead Stage = iota 100 101 // StageAlive means that the app is alive. 102 // - A positive cross means that the app has been created. 103 // - A negative cross means that the app is being destroyed. 104 // Each cross, either from or to StageDead, will occur only once. 105 // On Android, these correspond to onCreate and onDestroy. 106 StageAlive 107 108 // StageVisible means that the app window is visible. 109 // - A positive cross means that the app window has become visible. 110 // - A negative cross means that the app window has become invisible. 111 // On Android, these correspond to onStart and onStop. 112 // On Desktop, an app window can become invisible if e.g. it is minimized, 113 // unmapped, or not on a visible workspace. 114 StageVisible 115 116 // StageFocused means that the app window has the focus. 117 // - A positive cross means that the app window has gained the focus. 118 // - A negative cross means that the app window has lost the focus. 119 // On Android, these correspond to onResume and onFreeze. 120 StageFocused 121 ) 122 123 func (s Stage) String() string { 124 switch s { 125 case StageDead: 126 return "StageDead" 127 case StageAlive: 128 return "StageAlive" 129 case StageVisible: 130 return "StageVisible" 131 case StageFocused: 132 return "StageFocused" 133 default: 134 return fmt.Sprintf("lifecycle.Stage(%d)", s) 135 } 136 }