6df6e249e8feccdb3a1d19af1028980d4b0104d4
[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
215     mStage.Add( mCallStartButton );
216     mStage.Add( mButtonIconDecall );
217     mStage.Add( mButtonIconBattery );
218
219     mLabelIncoming = TextLabel::New( LABEL_INCOMING_STR );
220     mLabelIncoming.SetParentOrigin( ParentOrigin::CENTER );
221     mLabelIncoming.SetAnchorPoint( AnchorPoint::CENTER );
222     mLabelIncoming.SetSize( LABEL_INCOMING_SIZE * SCALED_STAGE_SIZE );
223     mLabelIncoming.SetPosition( LABEL_INCOMING_POSITION * SCALED_STAGE_SIZE_3 );
224     mLabelIncoming.SetVisible( true );
225     mLabelIncoming.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_INCOMING_FONT_COLOR );
226     mLabelIncoming.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_INCOMING_FONT_SIZE * FONT_SCALE );
227     mLabelIncoming.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
228     mLabelIncoming.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
229
230     mLabelName = TextLabel::New( LABEL_NAME_STR );
231     mLabelName.SetParentOrigin( ParentOrigin::CENTER );
232     mLabelName.SetAnchorPoint( AnchorPoint::CENTER );
233     mLabelName.SetSize( LABEL_NAME_SIZE * SCALED_STAGE_SIZE );
234     mLabelName.SetPosition( LABEL_NAME_POSITION * SCALED_STAGE_SIZE_3 );
235     mLabelName.SetVisible( true );
236     mLabelName.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NAME_FONT_COLOR );
237     mLabelName.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NAME_FONT_SIZE * FONT_SCALE );
238     mLabelName.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
239     mLabelName.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
240
241     mLabelNumber = TextLabel::New( LABEL_NUMBER_STR );
242     mLabelNumber.SetParentOrigin( ParentOrigin::CENTER );
243     mLabelNumber.SetAnchorPoint( AnchorPoint::CENTER );
244     mLabelNumber.SetSize( LABEL_NUMBER_SIZE * SCALED_STAGE_SIZE );
245     mLabelNumber.SetPosition( LABEL_NUMBER_POSITION * SCALED_STAGE_SIZE_3 );
246     mLabelNumber.SetVisible( true );
247     mLabelNumber.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NUMBER_FONT_COLOR );
248     mLabelNumber.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NUMBER_FONT_SIZE * FONT_SCALE );
249     mLabelNumber.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
250     mLabelNumber.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
251
252     mLabelDecline = TextLabel::New( LABEL_DECLINE_STR );
253     mLabelDecline.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
254     mLabelDecline.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
255     mLabelDecline.SetSize( LABEL_DECLINE_SIZE * SCALED_STAGE_SIZE );
256     mLabelDecline.SetPosition( LABEL_DECLINE_POSITION * SCALED_WIDTH );
257     mLabelDecline.SetVisible( true );
258     mLabelDecline.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_DECLINE_FONT_COLOR );
259     mLabelDecline.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_DECLINE_FONT_SIZE * FONT_SCALE );
260     mLabelDecline.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
261     mLabelDecline.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
262
263     mStage.Add( mLabelIncoming );
264     mStage.Add( mLabelName );
265     mStage.Add( mLabelNumber );
266     mStage.Add( mLabelDecline );
267   }
268
269   // Create and Add to stage when visible at call active
270   void SetupActiveActors()
271   {
272     mButtonClip = Control::New();
273     mButtonClip.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
274     mButtonClip.SetAnchorPoint( ParentOrigin::BOTTOM_CENTER );
275     mButtonClip.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
276     mButtonClip.SetPosition( BUTTON_DECALL_CLIP_POSITION * SCALED_WIDTH );
277
278     mButtonIcon = ImageView::New();
279     mButtonIcon.SetImage( BUTTON_DECALL_ICON_IMAGE );
280     mButtonIcon.SetParentOrigin( ParentOrigin::CENTER );
281     mButtonIcon.SetAnchorPoint( AnchorPoint::CENTER );
282     mButtonIcon.SetSize( BUTTON_DECALL_ICON_SIZE * SCALED_WIDTH );
283     mButtonIcon.SetPosition( BUTTON_DECALL_ICON_POSITION * SCALED_WIDTH );
284
285     mCallEndButton = PushButton::New();
286     mCallEndButton.SetParentOrigin( ParentOrigin::CENTER );
287     mCallEndButton.SetAnchorPoint( AnchorPoint::CENTER );
288     mCallEndButton.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
289     mCallEndButton.SetPosition( BUTTON_DECALL_POSITION * SCALED_WIDTH );
290     mCallEndButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
291     mCallEndButton.SetProperty( DevelButton::Property::SELECTED_BACKGROUND_VISUAL, "" );
292     mCallEndButton.SetProperty( DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, "" );
293     mCallEndButton.SetStyleName( DECLINE_BUTTON_STYLE_STR );
294
295     mButtonClip.Add( mCallEndButton );
296     mButtonClip.Add( mButtonIcon );
297
298     mLabelTime = TextLabel::New( LABEL_TIME_STR );
299     mLabelTime.SetParentOrigin( ParentOrigin::CENTER );
300     mLabelTime.SetAnchorPoint( AnchorPoint::CENTER );
301     mLabelTime.SetSize( LABEL_TIME_SIZE * SCALED_STAGE_SIZE );
302     mLabelTime.SetPosition( LABEL_TIME_POSITION * SCALED_STAGE_SIZE_3 );
303     mLabelTime.SetVisible( false );
304     mLabelTime.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_TIME_FONT_COLOR );
305     mLabelTime.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_TIME_FONT_SIZE * FONT_SCALE );
306     mLabelTime.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
307     mLabelTime.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
308
309     mStage.Add( mLabelTime );
310   }
311
312   void SetupAnimation()
313   {
314     mMoveFront = Animation::New( mDuration );
315     mMoveBack = Animation::New( mDuration );
316
317     mMoveFront.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), 0.0f * SCALED_HEIGHT );
318     mMoveBack.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), BUTTON_DECALL_CLIP_POSITION.y * SCALED_HEIGHT );
319
320     mMoveFront.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), false );
321     mMoveFront.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), false );
322     mMoveBack.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), true );
323     mMoveBack.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), true );
324
325     mMoveFront.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), false );
326     mMoveFront.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), false );
327     mMoveFront.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), true );
328     mMoveBack.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), true );
329     mMoveBack.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), true );
330     mMoveBack.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), false );
331   }
332
333   bool OnButtonClicked(Button button)
334   {
335     if( button == mCallStartButton )
336     {
337       mBackground.SetStyleName( BACKGROUND_ACTIVE_STYLE_STR );
338       mStage.Add( mButtonClip );
339       mMoveFront.Play();
340     }
341     else if( button == mCallEndButton )
342     {
343       mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
344       mTempTimer = Timer::New( mDuration * 1000.0f );
345       mTempTimer.TickSignal().Connect( this, &CallController::smallTick );
346       mTempTimer.Start();
347       mMoveBack.Play();
348     }
349     return true;
350   }
351   bool smallTick()
352   {
353     mButtonClip.Unparent();
354     return false;
355   }
356
357   void Reset()
358   {
359     mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
360   }
361
362 private:
363   Application&  mApplication;
364   Stage mStage;
365
366   Control mBackground;
367
368   // Show when call incommint
369   PushButton mCallStartButton;
370   ImageView mButtonIconDecall;
371   ImageView mButtonIconBattery;
372   TextLabel mLabelIncoming;
373   TextLabel mLabelName;
374   TextLabel mLabelNumber;
375   TextLabel mLabelDecline;
376
377   // Show when call active
378   PushButton mCallEndButton;
379   ImageView mButtonIcon;
380   Control   mButtonBackground;
381   Control   mButtonClip;
382   TextLabel mLabelTime;
383
384   Timer mTempTimer;
385
386   Animation mMoveFront;
387   Animation mMoveBack;
388
389   Vector4 mColorStart;
390   Vector4 mColorEnd;
391   Vector4 mColorReduce;
392
393   Vector4 mButtonColorStart;
394   Vector4 mButtonColorEnd;
395
396   float mDuration;
397   float mBackgroundDurationIncoming;
398   float mBackgroundDurationActive;
399   float mButtonDuration;
400   float mButtonDelay;
401 };
402
403 int main(int argc, char **argv)
404 {
405   Application application = Application::New( &argc, &argv );
406
407   CallController test( application );
408
409   application.MainLoop();
410   return 0;
411 }