Fixed DGEUF-1841.
[platform/core/uifw/dali-demo.git] / examples / animated-gradient-call-active / animated-gradient-call-active.cpp
1 /*
2 * Copyright (c) 2020 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/visuals/animated-gradient-visual-properties-devel.h>
21 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
22 #include <dali/integration-api/debug.h>
23
24 using namespace Dali;
25 using namespace Dali::Toolkit;
26
27 // This example shows how to create and display animated-gradient-effect
28 //
29 namespace
30 {
31 // The value for scale-change between wearable-mobile
32 // Can be changed on App-Create time
33 Vector2 WINDOW_SIZE = Vector2( 360.0f, 360.0f );
34 Vector2 SCALED_WINDOW_SIZE = Vector2( 1.0f, 1.0f );
35 Vector3 SCALED_WINDOW_SIZE_3 = Vector3( 1.0f, 1.0f, 0.0f );
36 float SCALED_WIDTH = 1.0f;
37 float SCALED_HEIGHT = 1.0f;
38 float FONT_SCALE = 0.25f;
39
40 // const parameters for animations
41 const float CHANGE_DURATION = 0.2f;
42
43 // const parameters for icon position and size when resolution is 360x360
44 const Vector2 ICON_CALL_SIZE = Vector2( 54.0f, 54.0f );
45 const Vector3 ICON_CALL_POSITION = Vector3( 0.0f, 0.0f, 0.0f );
46 const Vector2 ICON_DECALL_SIZE = Vector2( 54.0f, 54.0f );
47 const Vector3 ICON_DECALL_POSITION = Vector3( 141.0f, 0.0f, 0.0f );
48 const Vector2 ICON_BATTERY_SIZE = Vector2( 14.0f, 23.0f );
49 const Vector3 ICON_BATTERY_POSITION = Vector3( 0.0f, 25.5f, 0.0f );
50 const Vector2 BUTTON_CALL_START_SIZE = Vector2( 54.0f, 54.0f );
51 const Vector3 BUTTON_CALL_START_POSITION = Vector3( -141.0f, 0.0f, 0.0f );
52
53 const Vector2 BUTTON_DECALL_ICON_SIZE = Vector2( 62.0f, 62.0f );
54 const Vector3 BUTTON_DECALL_ICON_POSITION = Vector3( 0.0f, 0.0f, 0.0f );
55 const Vector2 BUTTON_DECALL_SIZE = Vector2( 360.0f, 82.0f );
56 const Vector3 BUTTON_DECALL_CLIP_POSITION = Vector3( 0.0f, 82.0f, 0.0f );
57 const Vector3 BUTTON_DECALL_POSITION = Vector3( 0.0f, 0.0f, 0.0f );
58
59 // icon image name
60 const char * const ICON_CALL_IMAGE( DEMO_IMAGE_DIR "Call_Accept.png" );
61 const char * const ICON_DECALL_IMAGE( DEMO_IMAGE_DIR "Call_Decline.png" );
62 const char * const ICON_BATTERY_IMAGE( DEMO_IMAGE_DIR "Call_Battery.png" );
63 const char * const BUTTON_DECALL_ICON_IMAGE( DEMO_IMAGE_DIR "Call_Decline_wh.png" );
64
65 // const parameters for string position and size and font-size when resolution is 360x360
66 const Vector2 LABEL_INCOMING_SIZE = Vector2( 156.0f, 26.0f );
67 const Vector3 LABEL_INCOMING_POSITION = Vector3( 0.0f, -47.0f, 0.0f );
68 const Vector4 LABEL_INCOMING_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
69 const float   LABEL_INCOMING_FONT_SIZE = 21.39f;
70 const Vector2 LABEL_NAME_SIZE = Vector2( 230.0f, 45.0f );
71 const Vector3 LABEL_NAME_POSITION = Vector3( 0.0f, -2.5f, 0.0f );
72 const Vector4 LABEL_NAME_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
73 const float   LABEL_NAME_FONT_SIZE = 37.71f;
74 const Vector2 LABEL_NUMBER_SIZE = Vector2( 196.0f, 25.0f );
75 const Vector3 LABEL_NUMBER_POSITION = Vector3( 0.0f, 31.0f, 0.0f );
76 const Vector4 LABEL_NUMBER_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
77 const float   LABEL_NUMBER_FONT_SIZE = 20.55f;
78 const Vector2 LABEL_DECLINE_SIZE = Vector2( 203.0f, 25.0f );
79 const Vector3 LABEL_DECLINE_POSITION = Vector3( 0.0f, -50.5f, 0.0f );
80 const Vector4 LABEL_DECLINE_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
81 const float   LABEL_DECLINE_FONT_SIZE = 20.55f;
82 const Vector2 LABEL_TIME_SIZE = Vector2( 91.0f, 26.0f );
83 const Vector3 LABEL_TIME_POSITION = Vector3( 0.0f, -47.0f, 0.0f );
84 const Vector4 LABEL_TIME_FONT_COLOR = Vector4( 0.98f, 0.98f, 0.98f, 1.0f );
85 const float   LABEL_TIME_FONT_SIZE = 21.39f;
86
87 // string string
88 const char * const LABEL_INCOMING_STR( "Incoming Call" );
89 const char * const LABEL_NAME_STR( "Sam Smith" );
90 const char * const LABEL_NUMBER_STR( "+1 908-247-1695" );
91 const char * const LABEL_DECLINE_STR( "Decline Message" );
92 const char * const LABEL_TIME_STR( "1:03" );
93
94 // Set style from json
95 const char * const BACKGROUND_STYLE_JSON( DEMO_STYLE_DIR "animated-gradient-call-active-style.json" );
96 const char * const BACKGROUND_INCOME_STYLE_STR( "IncomeBackground" );
97 const char * const BACKGROUND_ACTIVE_STYLE_STR( "ActiveBackground" );
98 const char * const DECLINE_BUTTON_STYLE_STR( "DeclineButton" );
99
100 } // unnamed namespace
101
102 // This example shows how to render animated gradients
103 //
104 class CallController : public ConnectionTracker
105 {
106 public:
107   CallController(Application& application)
108     : mApplication( application ),
109       mColorStart( 0.0f, 0.0f, 0.0f, 0.0f ),
110       mColorEnd( 0.0f, 0.0f, 0.0f, 0.0f ),
111       mColorReduce( 0.0f, 0.0f, 0.0f, 0.0f ),
112       mButtonColorStart( 0.0f, 0.0f, 0.0f, 0.0f ),
113       mButtonColorEnd( 0.0f, 0.0f, 0.0f, 0.0f ),
114       mDuration( 0.0f ),
115       mBackgroundDurationIncoming( 0.0f ),
116       mBackgroundDurationActive( 0.0f ),
117       mButtonDuration( 0.0f ),
118       mButtonDelay( 0.0f )
119   {
120     // Connect to the Application's Init signal
121     mApplication.InitSignal().Connect( this, &CallController::Create );
122   }
123
124   ~CallController()
125   {
126     // Nothing to do here;
127   }
128
129   // The Init signal is received once (only) during the Application lifetime
130   void Create(Application& application)
131   {
132     // Get a handle to the main window
133     mWindow = application.GetWindow();
134     mWindow.KeyEventSignal().Connect( this, &CallController::OnKeyEvent );
135
136     // Apply custom style for background and button.
137     StyleManager::Get().ApplyTheme( BACKGROUND_STYLE_JSON );
138
139     // Get current device's width and height.
140     const Window::WindowSize windowSize = mWindow.GetSize();
141     WINDOW_SIZE = Vector2(windowSize.GetWidth(), windowSize.GetHeight());
142     SCALED_WINDOW_SIZE = WINDOW_SIZE / 360.0f;
143     SCALED_WINDOW_SIZE_3 = Vector3( SCALED_WINDOW_SIZE.x, SCALED_WINDOW_SIZE.y, 0.0f );
144     SCALED_WIDTH = SCALED_WINDOW_SIZE.x < SCALED_WINDOW_SIZE.y ? SCALED_WINDOW_SIZE.x : SCALED_WINDOW_SIZE.y;
145     SCALED_HEIGHT = SCALED_WIDTH;
146
147     // Note that this is heuristic value
148     FONT_SCALE = 0.25f * WINDOW_SIZE.y / WINDOW_SIZE.x;
149
150     mBackground = Control::New();
151     mBackground.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
152     mBackground.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
153     mBackground.SetProperty( Actor::Property::SIZE, WINDOW_SIZE );
154
155     mWindow.Add( mBackground );
156
157     BuildParameter();
158     SetupActors();
159     SetupAnimation();
160
161     Reset();
162   }
163
164   void OnKeyEvent(const KeyEvent& event)
165   {
166     if( event.GetState() == 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 window when visible at call incomming
190   void SetupComingActors()
191   {
192     mButtonIconDecall = ImageView::New();
193     mButtonIconDecall.SetImage( ICON_DECALL_IMAGE );
194     mButtonIconDecall.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
195     mButtonIconDecall.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
196     mButtonIconDecall.SetProperty( Actor::Property::SIZE, ICON_DECALL_SIZE * SCALED_WIDTH );
197     mButtonIconDecall.SetProperty( Actor::Property::POSITION, ICON_DECALL_POSITION * SCALED_WIDTH );
198
199     mButtonIconBattery = ImageView::New();
200     mButtonIconBattery.SetImage( ICON_BATTERY_IMAGE );
201     mButtonIconBattery.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER );
202     mButtonIconBattery.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER );
203     mButtonIconBattery.SetProperty( Actor::Property::SIZE, ICON_BATTERY_SIZE * SCALED_WIDTH );
204     mButtonIconBattery.SetProperty( Actor::Property::POSITION, ICON_BATTERY_POSITION * SCALED_WIDTH );
205
206     mCallStartButton = PushButton::New();
207     mCallStartButton.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
208     mCallStartButton.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
209     mCallStartButton.SetProperty( Actor::Property::SIZE, BUTTON_CALL_START_SIZE * SCALED_WIDTH );
210     mCallStartButton.SetProperty( Actor::Property::POSITION, BUTTON_CALL_START_POSITION * SCALED_WIDTH );
211     mCallStartButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
212     mCallStartButton.SetProperty( Button::Property::SELECTED_BACKGROUND_VISUAL, ICON_CALL_IMAGE );
213     mCallStartButton.SetProperty( Button::Property::UNSELECTED_BACKGROUND_VISUAL, ICON_CALL_IMAGE );
214     mCallStartButton.SetProperty( Control::Property::BACKGROUND, ICON_CALL_IMAGE );
215     mCallStartButton.SetProperty( Button::Property::LABEL, "" );
216
217     mWindow.Add( mCallStartButton );
218     mWindow.Add( mButtonIconDecall );
219     mWindow.Add( mButtonIconBattery );
220
221     mLabelIncoming = TextLabel::New( LABEL_INCOMING_STR );
222     mLabelIncoming.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
223     mLabelIncoming.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
224     mLabelIncoming.SetProperty( Actor::Property::SIZE, LABEL_INCOMING_SIZE * SCALED_WINDOW_SIZE );
225     mLabelIncoming.SetProperty( Actor::Property::POSITION, LABEL_INCOMING_POSITION * SCALED_WINDOW_SIZE_3 );
226     mLabelIncoming.SetProperty( Actor::Property::VISIBLE, 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.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
234     mLabelName.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
235     mLabelName.SetProperty( Actor::Property::SIZE, LABEL_NAME_SIZE * SCALED_WINDOW_SIZE );
236     mLabelName.SetProperty( Actor::Property::POSITION, LABEL_NAME_POSITION * SCALED_WINDOW_SIZE_3 );
237     mLabelName.SetProperty( Actor::Property::VISIBLE, 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.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
245     mLabelNumber.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
246     mLabelNumber.SetProperty( Actor::Property::SIZE, LABEL_NUMBER_SIZE * SCALED_WINDOW_SIZE );
247     mLabelNumber.SetProperty( Actor::Property::POSITION, LABEL_NUMBER_POSITION * SCALED_WINDOW_SIZE_3 );
248     mLabelNumber.SetProperty( Actor::Property::VISIBLE, 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.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER );
256     mLabelDecline.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::BOTTOM_CENTER );
257     mLabelDecline.SetProperty( Actor::Property::SIZE, LABEL_DECLINE_SIZE * SCALED_WINDOW_SIZE );
258     mLabelDecline.SetProperty( Actor::Property::POSITION, LABEL_DECLINE_POSITION * SCALED_WIDTH );
259     mLabelDecline.SetProperty( Actor::Property::VISIBLE, 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     mWindow.Add( mLabelIncoming );
266     mWindow.Add( mLabelName );
267     mWindow.Add( mLabelNumber );
268     mWindow.Add( mLabelDecline );
269   }
270
271   // Create and Add to window when visible at call active
272   void SetupActiveActors()
273   {
274     mButtonClip = Control::New();
275     mButtonClip.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER );
276     mButtonClip.SetProperty( Actor::Property::ANCHOR_POINT, ParentOrigin::BOTTOM_CENTER );
277     mButtonClip.SetProperty( Actor::Property::SIZE, BUTTON_DECALL_SIZE * SCALED_WIDTH );
278     mButtonClip.SetProperty( Actor::Property::POSITION, BUTTON_DECALL_CLIP_POSITION * SCALED_WIDTH );
279
280     mButtonIcon = ImageView::New();
281     mButtonIcon.SetImage( BUTTON_DECALL_ICON_IMAGE );
282     mButtonIcon.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
283     mButtonIcon.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
284     mButtonIcon.SetProperty( Actor::Property::SIZE, BUTTON_DECALL_ICON_SIZE * SCALED_WIDTH );
285     mButtonIcon.SetProperty( Actor::Property::POSITION, BUTTON_DECALL_ICON_POSITION * SCALED_WIDTH );
286
287     mCallEndButton = PushButton::New();
288     mCallEndButton.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
289     mCallEndButton.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
290     mCallEndButton.SetProperty( Actor::Property::SIZE, BUTTON_DECALL_SIZE * SCALED_WIDTH );
291     mCallEndButton.SetProperty( Actor::Property::POSITION, BUTTON_DECALL_POSITION * SCALED_WIDTH );
292     mCallEndButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
293     mCallEndButton.SetProperty( Button::Property::SELECTED_BACKGROUND_VISUAL, "" );
294     mCallEndButton.SetProperty( Button::Property::UNSELECTED_BACKGROUND_VISUAL, "" );
295     mCallEndButton.SetStyleName( DECLINE_BUTTON_STYLE_STR );
296     mCallEndButton.SetProperty( Button::Property::LABEL, "" );
297
298     mButtonClip.Add( mCallEndButton );
299     mButtonClip.Add( mButtonIcon );
300
301     mLabelTime = TextLabel::New( LABEL_TIME_STR );
302     mLabelTime.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
303     mLabelTime.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
304     mLabelTime.SetProperty( Actor::Property::SIZE, LABEL_TIME_SIZE * SCALED_WINDOW_SIZE );
305     mLabelTime.SetProperty( Actor::Property::POSITION, LABEL_TIME_POSITION * SCALED_WINDOW_SIZE_3 );
306     mLabelTime.SetProperty( Actor::Property::VISIBLE, 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     mWindow.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       mWindow.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   Window mWindow;
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 DALI_EXPORT_API 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 }