Merge "Add focus transition in the layout animation demo." into devel/master
[platform/core/uifw/dali-demo.git] / examples / animated-gradient-call-active / animated-gradient-call-active.cpp
1 /*
2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 */
17 #include <dali/dali.h>
18 #include <dali-toolkit/dali-toolkit.h>
19 #include <iostream>
20 #include <dali-toolkit/devel-api/controls/buttons/button-devel.h>
21 #include <dali-toolkit/devel-api/visuals/animated-gradient-visual-properties-devel.h>
22 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
23 #include <dali/integration-api/debug.h>
24
25 using namespace Dali;
26 using namespace Dali::Toolkit;
27
28 // This example shows how to create and display animated-gradient-effect
29 //
30 namespace
31 {
32 // The value for scale-change between wearable-mobile
33 // Can be changed on App-Create time
34 Vector2 STAGE_SIZE = Vector2( 360.0f, 360.0f );
35 Vector2 SCALED_STAGE_SIZE = Vector2( 1.0f, 1.0f );
36 Vector3 SCALED_STAGE_SIZE_3 = Vector3( 1.0f, 1.0f, 0.0f );
37 float SCALED_WIDTH = 1.0f;
38 float SCALED_HEIGHT = 1.0f;
39 float FONT_SCALE = 0.25f;
40
41 // const parameters for animations
42 const float CHANGE_DURATION = 0.2f;
43
44 // const parameters for icon position and size when resolution is 360x360
45 const Vector2 ICON_CALL_SIZE = Vector2( 54.0f, 54.0f );
46 const Vector3 ICON_CALL_POSITION = Vector3( 0.0f, 0.0f, 0.0f );
47 const Vector2 ICON_DECALL_SIZE = Vector2( 54.0f, 54.0f );
48 const Vector3 ICON_DECALL_POSITION = Vector3( 141.0f, 0.0f, 0.0f );
49 const Vector2 ICON_BATTERY_SIZE = Vector2( 14.0f, 23.0f );
50 const Vector3 ICON_BATTERY_POSITION = Vector3( 0.0f, 25.5f, 0.0f );
51 const Vector2 BUTTON_CALL_START_SIZE = Vector2( 54.0f, 54.0f );
52 const Vector3 BUTTON_CALL_START_POSITION = Vector3( -141.0f, 0.0f, 0.0f );
53
54 const Vector2 BUTTON_DECALL_ICON_SIZE = Vector2( 62.0f, 62.0f );
55 const Vector3 BUTTON_DECALL_ICON_POSITION = Vector3( 0.0f, 0.0f, 0.0f );
56 const Vector2 BUTTON_DECALL_SIZE = Vector2( 360.0f, 82.0f );
57 const Vector3 BUTTON_DECALL_CLIP_POSITION = Vector3( 0.0f, 82.0f, 0.0f );
58 const Vector3 BUTTON_DECALL_POSITION = Vector3( 0.0f, 0.0f, 0.0f );
59
60 // icon image name
61 const char * const ICON_CALL_IMAGE( DEMO_IMAGE_DIR "Call_Accept.png" );
62 const char * const ICON_DECALL_IMAGE( DEMO_IMAGE_DIR "Call_Decline.png" );
63 const char * const ICON_BATTERY_IMAGE( DEMO_IMAGE_DIR "Call_Battery.png" );
64 const char * const BUTTON_DECALL_ICON_IMAGE( DEMO_IMAGE_DIR "Call_Decline_wh.png" );
65
66 // const parameters for string position and size and font-size when resolution is 360x360
67 const Vector2 LABEL_INCOMING_SIZE = Vector2( 156.0f, 26.0f );
68 const Vector3 LABEL_INCOMING_POSITION = Vector3( 0.0f, -47.0f, 0.0f );
69 const Vector4 LABEL_INCOMING_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
70 const float   LABEL_INCOMING_FONT_SIZE = 21.39f;
71 const Vector2 LABEL_NAME_SIZE = Vector2( 230.0f, 45.0f );
72 const Vector3 LABEL_NAME_POSITION = Vector3( 0.0f, -2.5f, 0.0f );
73 const Vector4 LABEL_NAME_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
74 const float   LABEL_NAME_FONT_SIZE = 37.71f;
75 const Vector2 LABEL_NUMBER_SIZE = Vector2( 196.0f, 25.0f );
76 const Vector3 LABEL_NUMBER_POSITION = Vector3( 0.0f, 31.0f, 0.0f );
77 const Vector4 LABEL_NUMBER_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
78 const float   LABEL_NUMBER_FONT_SIZE = 20.55f;
79 const Vector2 LABEL_DECLINE_SIZE = Vector2( 203.0f, 25.0f );
80 const Vector3 LABEL_DECLINE_POSITION = Vector3( 0.0f, -50.5f, 0.0f );
81 const Vector4 LABEL_DECLINE_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
82 const float   LABEL_DECLINE_FONT_SIZE = 20.55f;
83 const Vector2 LABEL_TIME_SIZE = Vector2( 91.0f, 26.0f );
84 const Vector3 LABEL_TIME_POSITION = Vector3( 0.0f, -47.0f, 0.0f );
85 const Vector4 LABEL_TIME_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
86 const float   LABEL_TIME_FONT_SIZE = 21.39f;
87
88 // string string
89 const char * const LABEL_INCOMING_STR( "Incoming Call" );
90 const char * const LABEL_NAME_STR( "Sam Smith" );
91 const char * const LABEL_NUMBER_STR( "+1 908-247-1695" );
92 const char * const LABEL_DECLINE_STR( "Decline Message" );
93 const char * const LABEL_TIME_STR( "1:03" );
94
95 // Set style from json
96 const char * const BACKGROUND_STYLE_JSON( DEMO_STYLE_DIR "animated-gradient-call-active-style.json" );
97 const char * const BACKGROUND_INCOME_STYLE_STR( "IncomeBackground" );
98 const char * const BACKGROUND_ACTIVE_STYLE_STR( "ActiveBackground" );
99 const char * const DECLINE_BUTTON_STYLE_STR( "DeclineButton" );
100
101 } // unnamed namespace
102
103 // This example shows how to render animated gradients
104 //
105 class CallController : public ConnectionTracker
106 {
107 public:
108   CallController(Application& application)
109     : mApplication( application ),
110       mColorStart( 0.0f, 0.0f, 0.0f, 0.0f ),
111       mColorEnd( 0.0f, 0.0f, 0.0f, 0.0f ),
112       mColorReduce( 0.0f, 0.0f, 0.0f, 0.0f ),
113       mButtonColorStart( 0.0f, 0.0f, 0.0f, 0.0f ),
114       mButtonColorEnd( 0.0f, 0.0f, 0.0f, 0.0f ),
115       mDuration( 0.0f ),
116       mBackgroundDurationIncoming( 0.0f ),
117       mBackgroundDurationActive( 0.0f ),
118       mButtonDuration( 0.0f ),
119       mButtonDelay( 0.0f )
120   {
121     // Connect to the Application's Init signal
122     mApplication.InitSignal().Connect( this, &CallController::Create );
123   }
124
125   ~CallController()
126   {
127     // Nothing to do here;
128   }
129
130   // The Init signal is received once (only) during the Application lifetime
131   void Create(Application& application)
132   {
133     // Get a handle to the stage
134     mStage = Stage::GetCurrent();
135     mStage.KeyEventSignal().Connect( this, &CallController::OnKeyEvent );
136
137     // Apply custom style for background and button.
138     StyleManager::Get().ApplyTheme( BACKGROUND_STYLE_JSON );
139
140     // Get current device's width and height.
141     STAGE_SIZE = mStage.GetSize();
142     SCALED_STAGE_SIZE = STAGE_SIZE / 360.0f;
143     SCALED_STAGE_SIZE_3 = Vector3( SCALED_STAGE_SIZE.x, SCALED_STAGE_SIZE.y, 0.0f );
144     SCALED_WIDTH = SCALED_STAGE_SIZE.x < SCALED_STAGE_SIZE.y ? SCALED_STAGE_SIZE.x : SCALED_STAGE_SIZE.y;
145     SCALED_HEIGHT = SCALED_WIDTH;
146
147     // Note that this is heuristic value
148     FONT_SCALE = 0.25f * STAGE_SIZE.y / STAGE_SIZE.x;
149
150     mBackground = Control::New();
151     mBackground.SetParentOrigin( ParentOrigin::CENTER );
152     mBackground.SetAnchorPoint( AnchorPoint::CENTER );
153     mBackground.SetSize( STAGE_SIZE );
154
155     mStage.Add( mBackground );
156
157     BuildParameter();
158     SetupActors();
159     SetupAnimation();
160
161     Reset();
162   }
163
164   void OnKeyEvent(const KeyEvent& event)
165   {
166     if( event.state == KeyEvent::Down )
167     {
168       if( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) )
169       {
170         mApplication.Quit();
171       }
172     }
173   }
174
175 private:
176
177   // Setup const parameter values
178   void BuildParameter()
179   {
180     mDuration = CHANGE_DURATION;
181   }
182
183   void SetupActors()
184   {
185     SetupComingActors();
186     SetupActiveActors();
187   }
188
189   // Create and Add to stage when visible at call incomming
190   void SetupComingActors()
191   {
192     mButtonIconDecall = ImageView::New();
193     mButtonIconDecall.SetImage( ICON_DECALL_IMAGE );
194     mButtonIconDecall.SetParentOrigin( ParentOrigin::CENTER );
195     mButtonIconDecall.SetAnchorPoint( AnchorPoint::CENTER );
196     mButtonIconDecall.SetSize( ICON_DECALL_SIZE * SCALED_WIDTH );
197     mButtonIconDecall.SetPosition( ICON_DECALL_POSITION * SCALED_WIDTH );
198
199     mButtonIconBattery = ImageView::New();
200     mButtonIconBattery.SetImage( ICON_BATTERY_IMAGE );
201     mButtonIconBattery.SetParentOrigin( ParentOrigin::TOP_CENTER );
202     mButtonIconBattery.SetAnchorPoint( AnchorPoint::TOP_CENTER );
203     mButtonIconBattery.SetSize( ICON_BATTERY_SIZE * SCALED_WIDTH );
204     mButtonIconBattery.SetPosition( ICON_BATTERY_POSITION * SCALED_WIDTH );
205
206     mCallStartButton = PushButton::New();
207     mCallStartButton.SetParentOrigin( ParentOrigin::CENTER );
208     mCallStartButton.SetAnchorPoint( AnchorPoint::CENTER );
209     mCallStartButton.SetSize( BUTTON_CALL_START_SIZE * SCALED_WIDTH );
210     mCallStartButton.SetPosition( BUTTON_CALL_START_POSITION * SCALED_WIDTH );
211     mCallStartButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
212     mCallStartButton.SetProperty( DevelButton::Property::SELECTED_BACKGROUND_VISUAL, ICON_CALL_IMAGE );
213     mCallStartButton.SetProperty( DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, ICON_CALL_IMAGE );
214     mCallStartButton.SetProperty( Control::Property::BACKGROUND, ICON_CALL_IMAGE );
215     mCallStartButton.SetLabelText("");
216
217     mStage.Add( mCallStartButton );
218     mStage.Add( mButtonIconDecall );
219     mStage.Add( mButtonIconBattery );
220
221     mLabelIncoming = TextLabel::New( LABEL_INCOMING_STR );
222     mLabelIncoming.SetParentOrigin( ParentOrigin::CENTER );
223     mLabelIncoming.SetAnchorPoint( AnchorPoint::CENTER );
224     mLabelIncoming.SetSize( LABEL_INCOMING_SIZE * SCALED_STAGE_SIZE );
225     mLabelIncoming.SetPosition( LABEL_INCOMING_POSITION * SCALED_STAGE_SIZE_3 );
226     mLabelIncoming.SetVisible( true );
227     mLabelIncoming.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_INCOMING_FONT_COLOR );
228     mLabelIncoming.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_INCOMING_FONT_SIZE * FONT_SCALE );
229     mLabelIncoming.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
230     mLabelIncoming.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
231
232     mLabelName = TextLabel::New( LABEL_NAME_STR );
233     mLabelName.SetParentOrigin( ParentOrigin::CENTER );
234     mLabelName.SetAnchorPoint( AnchorPoint::CENTER );
235     mLabelName.SetSize( LABEL_NAME_SIZE * SCALED_STAGE_SIZE );
236     mLabelName.SetPosition( LABEL_NAME_POSITION * SCALED_STAGE_SIZE_3 );
237     mLabelName.SetVisible( true );
238     mLabelName.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NAME_FONT_COLOR );
239     mLabelName.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NAME_FONT_SIZE * FONT_SCALE );
240     mLabelName.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
241     mLabelName.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
242
243     mLabelNumber = TextLabel::New( LABEL_NUMBER_STR );
244     mLabelNumber.SetParentOrigin( ParentOrigin::CENTER );
245     mLabelNumber.SetAnchorPoint( AnchorPoint::CENTER );
246     mLabelNumber.SetSize( LABEL_NUMBER_SIZE * SCALED_STAGE_SIZE );
247     mLabelNumber.SetPosition( LABEL_NUMBER_POSITION * SCALED_STAGE_SIZE_3 );
248     mLabelNumber.SetVisible( true );
249     mLabelNumber.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NUMBER_FONT_COLOR );
250     mLabelNumber.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NUMBER_FONT_SIZE * FONT_SCALE );
251     mLabelNumber.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
252     mLabelNumber.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
253
254     mLabelDecline = TextLabel::New( LABEL_DECLINE_STR );
255     mLabelDecline.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
256     mLabelDecline.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
257     mLabelDecline.SetSize( LABEL_DECLINE_SIZE * SCALED_STAGE_SIZE );
258     mLabelDecline.SetPosition( LABEL_DECLINE_POSITION * SCALED_WIDTH );
259     mLabelDecline.SetVisible( true );
260     mLabelDecline.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_DECLINE_FONT_COLOR );
261     mLabelDecline.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_DECLINE_FONT_SIZE * FONT_SCALE );
262     mLabelDecline.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
263     mLabelDecline.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
264
265     mStage.Add( mLabelIncoming );
266     mStage.Add( mLabelName );
267     mStage.Add( mLabelNumber );
268     mStage.Add( mLabelDecline );
269   }
270
271   // Create and Add to stage when visible at call active
272   void SetupActiveActors()
273   {
274     mButtonClip = Control::New();
275     mButtonClip.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
276     mButtonClip.SetAnchorPoint( ParentOrigin::BOTTOM_CENTER );
277     mButtonClip.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
278     mButtonClip.SetPosition( BUTTON_DECALL_CLIP_POSITION * SCALED_WIDTH );
279
280     mButtonIcon = ImageView::New();
281     mButtonIcon.SetImage( BUTTON_DECALL_ICON_IMAGE );
282     mButtonIcon.SetParentOrigin( ParentOrigin::CENTER );
283     mButtonIcon.SetAnchorPoint( AnchorPoint::CENTER );
284     mButtonIcon.SetSize( BUTTON_DECALL_ICON_SIZE * SCALED_WIDTH );
285     mButtonIcon.SetPosition( BUTTON_DECALL_ICON_POSITION * SCALED_WIDTH );
286
287     mCallEndButton = PushButton::New();
288     mCallEndButton.SetParentOrigin( ParentOrigin::CENTER );
289     mCallEndButton.SetAnchorPoint( AnchorPoint::CENTER );
290     mCallEndButton.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
291     mCallEndButton.SetPosition( BUTTON_DECALL_POSITION * SCALED_WIDTH );
292     mCallEndButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
293     mCallEndButton.SetProperty( DevelButton::Property::SELECTED_BACKGROUND_VISUAL, "" );
294     mCallEndButton.SetProperty( DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, "" );
295     mCallEndButton.SetStyleName( DECLINE_BUTTON_STYLE_STR );
296     mCallEndButton.SetLabelText("");
297
298     mButtonClip.Add( mCallEndButton );
299     mButtonClip.Add( mButtonIcon );
300
301     mLabelTime = TextLabel::New( LABEL_TIME_STR );
302     mLabelTime.SetParentOrigin( ParentOrigin::CENTER );
303     mLabelTime.SetAnchorPoint( AnchorPoint::CENTER );
304     mLabelTime.SetSize( LABEL_TIME_SIZE * SCALED_STAGE_SIZE );
305     mLabelTime.SetPosition( LABEL_TIME_POSITION * SCALED_STAGE_SIZE_3 );
306     mLabelTime.SetVisible( false );
307     mLabelTime.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_TIME_FONT_COLOR );
308     mLabelTime.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_TIME_FONT_SIZE * FONT_SCALE );
309     mLabelTime.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
310     mLabelTime.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
311
312     mStage.Add( mLabelTime );
313   }
314
315   void SetupAnimation()
316   {
317     mMoveFront = Animation::New( mDuration );
318     mMoveBack = Animation::New( mDuration );
319
320     mMoveFront.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), 0.0f * SCALED_HEIGHT );
321     mMoveBack.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), BUTTON_DECALL_CLIP_POSITION.y * SCALED_HEIGHT );
322
323     mMoveFront.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), false );
324     mMoveFront.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), false );
325     mMoveBack.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), true );
326     mMoveBack.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), true );
327
328     mMoveFront.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), false );
329     mMoveFront.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), false );
330     mMoveFront.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), true );
331     mMoveBack.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), true );
332     mMoveBack.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), true );
333     mMoveBack.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), false );
334   }
335
336   bool OnButtonClicked(Button button)
337   {
338     if( button == mCallStartButton )
339     {
340       mBackground.SetStyleName( BACKGROUND_ACTIVE_STYLE_STR );
341       mStage.Add( mButtonClip );
342       mMoveFront.Play();
343     }
344     else if( button == mCallEndButton )
345     {
346       mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
347       mTempTimer = Timer::New( mDuration * 1000.0f );
348       mTempTimer.TickSignal().Connect( this, &CallController::smallTick );
349       mTempTimer.Start();
350       mMoveBack.Play();
351     }
352     return true;
353   }
354   bool smallTick()
355   {
356     mButtonClip.Unparent();
357     return false;
358   }
359
360   void Reset()
361   {
362     mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
363   }
364
365 private:
366   Application&  mApplication;
367   Stage mStage;
368
369   Control mBackground;
370
371   // Show when call incommint
372   PushButton mCallStartButton;
373   ImageView mButtonIconDecall;
374   ImageView mButtonIconBattery;
375   TextLabel mLabelIncoming;
376   TextLabel mLabelName;
377   TextLabel mLabelNumber;
378   TextLabel mLabelDecline;
379
380   // Show when call active
381   PushButton mCallEndButton;
382   ImageView mButtonIcon;
383   Control   mButtonBackground;
384   Control   mButtonClip;
385   TextLabel mLabelTime;
386
387   Timer mTempTimer;
388
389   Animation mMoveFront;
390   Animation mMoveBack;
391
392   Vector4 mColorStart;
393   Vector4 mColorEnd;
394   Vector4 mColorReduce;
395
396   Vector4 mButtonColorStart;
397   Vector4 mButtonColorEnd;
398
399   float mDuration;
400   float mBackgroundDurationIncoming;
401   float mBackgroundDurationActive;
402   float mButtonDuration;
403   float mButtonDelay;
404 };
405
406 int main(int argc, char **argv)
407 {
408   Application application = Application::New( &argc, &argv );
409
410   CallController test( application );
411
412   application.MainLoop();
413   return 0;
414 }