Add Sample Apps for Animated Gradient Visual
[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/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 STAGE_SIZE = Vector2( 360.0f, 360.0f );
34 Vector2 SCALED_STAGE_SIZE = Vector2( 1.0f, 1.0f );
35 Vector3 SCALED_STAGE_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 stage
133     mStage = Stage::GetCurrent();
134     mStage.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     STAGE_SIZE = mStage.GetSize();
141     SCALED_STAGE_SIZE = STAGE_SIZE / 360.0f;
142     SCALED_STAGE_SIZE_3 = Vector3( SCALED_STAGE_SIZE.x, SCALED_STAGE_SIZE.y, 0.0f );
143     SCALED_WIDTH = SCALED_STAGE_SIZE.x < SCALED_STAGE_SIZE.y ? SCALED_STAGE_SIZE.x : SCALED_STAGE_SIZE.y;
144     SCALED_HEIGHT = SCALED_WIDTH;
145
146     // Note that this is heuristic value
147     FONT_SCALE = 0.25f * STAGE_SIZE.y / STAGE_SIZE.x;
148
149     mBackground = Control::New();
150     mBackground.SetParentOrigin( ParentOrigin::CENTER );
151     mBackground.SetAnchorPoint( AnchorPoint::CENTER );
152     mBackground.SetSize( STAGE_SIZE );
153
154     mStage.Add( mBackground );
155
156     BuildParameter();
157     SetupActors();
158     SetupAnimation();
159
160     Reset();
161   }
162
163   void OnKeyEvent(const KeyEvent& event)
164   {
165     if( event.state == KeyEvent::Down )
166     {
167       if( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) )
168       {
169         mApplication.Quit();
170       }
171     }
172   }
173
174 private:
175
176   // Setup const parameter values
177   void BuildParameter()
178   {
179     mDuration = CHANGE_DURATION;
180   }
181
182   void SetupActors()
183   {
184     SetupComingActors();
185     SetupActiveActors();
186   }
187
188   // Create and Add to stage when visible at call incomming
189   void SetupComingActors()
190   {
191     mButtonIconDecall = ImageView::New();
192     mButtonIconDecall.SetImage( ICON_DECALL_IMAGE );
193     mButtonIconDecall.SetParentOrigin( ParentOrigin::CENTER );
194     mButtonIconDecall.SetAnchorPoint( AnchorPoint::CENTER );
195     mButtonIconDecall.SetSize( ICON_DECALL_SIZE * SCALED_WIDTH );
196     mButtonIconDecall.SetPosition( ICON_DECALL_POSITION * SCALED_WIDTH );
197
198     mButtonIconBattery = ImageView::New();
199     mButtonIconBattery.SetImage( ICON_BATTERY_IMAGE );
200     mButtonIconBattery.SetParentOrigin( ParentOrigin::TOP_CENTER );
201     mButtonIconBattery.SetAnchorPoint( AnchorPoint::TOP_CENTER );
202     mButtonIconBattery.SetSize( ICON_BATTERY_SIZE * SCALED_WIDTH );
203     mButtonIconBattery.SetPosition( ICON_BATTERY_POSITION * SCALED_WIDTH );
204
205     mCallStartButton = PushButton::New();
206     mCallStartButton.SetParentOrigin( ParentOrigin::CENTER );
207     mCallStartButton.SetAnchorPoint( AnchorPoint::CENTER );
208     mCallStartButton.SetSize( BUTTON_CALL_START_SIZE * SCALED_WIDTH );
209     mCallStartButton.SetPosition( BUTTON_CALL_START_POSITION * SCALED_WIDTH );
210     mCallStartButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
211     mCallStartButton.SetProperty( Button::Property::SELECTED_STATE_IMAGE, ICON_CALL_IMAGE );
212     mCallStartButton.SetProperty( Button::Property::UNSELECTED_STATE_IMAGE, ICON_CALL_IMAGE );
213
214     mStage.Add( mCallStartButton );
215     mStage.Add( mButtonIconDecall );
216     mStage.Add( mButtonIconBattery );
217
218     mLabelIncoming = TextLabel::New( LABEL_INCOMING_STR );
219     mLabelIncoming.SetParentOrigin( ParentOrigin::CENTER );
220     mLabelIncoming.SetAnchorPoint( AnchorPoint::CENTER );
221     mLabelIncoming.SetSize( LABEL_INCOMING_SIZE * SCALED_STAGE_SIZE );
222     mLabelIncoming.SetPosition( LABEL_INCOMING_POSITION * SCALED_STAGE_SIZE_3 );
223     mLabelIncoming.SetVisible( true );
224     mLabelIncoming.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_INCOMING_FONT_COLOR );
225     mLabelIncoming.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_INCOMING_FONT_SIZE * FONT_SCALE );
226     mLabelIncoming.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
227     mLabelIncoming.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
228
229     mLabelName = TextLabel::New( LABEL_NAME_STR );
230     mLabelName.SetParentOrigin( ParentOrigin::CENTER );
231     mLabelName.SetAnchorPoint( AnchorPoint::CENTER );
232     mLabelName.SetSize( LABEL_NAME_SIZE * SCALED_STAGE_SIZE );
233     mLabelName.SetPosition( LABEL_NAME_POSITION * SCALED_STAGE_SIZE_3 );
234     mLabelName.SetVisible( true );
235     mLabelName.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NAME_FONT_COLOR );
236     mLabelName.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NAME_FONT_SIZE * FONT_SCALE );
237     mLabelName.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
238     mLabelName.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
239
240     mLabelNumber = TextLabel::New( LABEL_NUMBER_STR );
241     mLabelNumber.SetParentOrigin( ParentOrigin::CENTER );
242     mLabelNumber.SetAnchorPoint( AnchorPoint::CENTER );
243     mLabelNumber.SetSize( LABEL_NUMBER_SIZE * SCALED_STAGE_SIZE );
244     mLabelNumber.SetPosition( LABEL_NUMBER_POSITION * SCALED_STAGE_SIZE_3 );
245     mLabelNumber.SetVisible( true );
246     mLabelNumber.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NUMBER_FONT_COLOR );
247     mLabelNumber.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NUMBER_FONT_SIZE * FONT_SCALE );
248     mLabelNumber.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
249     mLabelNumber.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
250
251     mLabelDecline = TextLabel::New( LABEL_DECLINE_STR );
252     mLabelDecline.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
253     mLabelDecline.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
254     mLabelDecline.SetSize( LABEL_DECLINE_SIZE * SCALED_STAGE_SIZE );
255     mLabelDecline.SetPosition( LABEL_DECLINE_POSITION * SCALED_WIDTH );
256     mLabelDecline.SetVisible( true );
257     mLabelDecline.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_DECLINE_FONT_COLOR );
258     mLabelDecline.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_DECLINE_FONT_SIZE * FONT_SCALE );
259     mLabelDecline.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
260     mLabelDecline.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
261
262     mStage.Add( mLabelIncoming );
263     mStage.Add( mLabelName );
264     mStage.Add( mLabelNumber );
265     mStage.Add( mLabelDecline );
266   }
267
268   // Create and Add to stage when visible at call active
269   void SetupActiveActors()
270   {
271     mButtonClip = Control::New();
272     mButtonClip.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
273     mButtonClip.SetAnchorPoint( ParentOrigin::BOTTOM_CENTER );
274     mButtonClip.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
275     mButtonClip.SetPosition( BUTTON_DECALL_CLIP_POSITION * SCALED_WIDTH );
276
277     mButtonIcon = ImageView::New();
278     mButtonIcon.SetImage( BUTTON_DECALL_ICON_IMAGE );
279     mButtonIcon.SetParentOrigin( ParentOrigin::CENTER );
280     mButtonIcon.SetAnchorPoint( AnchorPoint::CENTER );
281     mButtonIcon.SetSize( BUTTON_DECALL_ICON_SIZE * SCALED_WIDTH );
282     mButtonIcon.SetPosition( BUTTON_DECALL_ICON_POSITION * SCALED_WIDTH );
283
284     mCallEndButton = PushButton::New();
285     mCallEndButton.SetParentOrigin( ParentOrigin::CENTER );
286     mCallEndButton.SetAnchorPoint( AnchorPoint::CENTER );
287     mCallEndButton.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
288     mCallEndButton.SetPosition( BUTTON_DECALL_POSITION * SCALED_WIDTH );
289     mCallEndButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
290     mCallEndButton.SetProperty( Button::Property::SELECTED_STATE_IMAGE, "" );
291     mCallEndButton.SetProperty( Button::Property::UNSELECTED_STATE_IMAGE, "" );
292     mCallEndButton.SetStyleName( DECLINE_BUTTON_STYLE_STR );
293
294     mButtonClip.Add( mCallEndButton );
295     mButtonClip.Add( mButtonIcon );
296
297     mLabelTime = TextLabel::New( LABEL_TIME_STR );
298     mLabelTime.SetParentOrigin( ParentOrigin::CENTER );
299     mLabelTime.SetAnchorPoint( AnchorPoint::CENTER );
300     mLabelTime.SetSize( LABEL_TIME_SIZE * SCALED_STAGE_SIZE );
301     mLabelTime.SetPosition( LABEL_TIME_POSITION * SCALED_STAGE_SIZE_3 );
302     mLabelTime.SetVisible( false );
303     mLabelTime.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_TIME_FONT_COLOR );
304     mLabelTime.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_TIME_FONT_SIZE * FONT_SCALE );
305     mLabelTime.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
306     mLabelTime.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
307
308     mStage.Add( mLabelTime );
309   }
310
311   void SetupAnimation()
312   {
313     mMoveFront = Animation::New( mDuration );
314     mMoveBack = Animation::New( mDuration );
315
316     mMoveFront.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), 0.0f * SCALED_HEIGHT );
317     mMoveBack.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), BUTTON_DECALL_CLIP_POSITION.y * SCALED_HEIGHT );
318
319     mMoveFront.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), false );
320     mMoveFront.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), false );
321     mMoveBack.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), true );
322     mMoveBack.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), true );
323
324     mMoveFront.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), false );
325     mMoveFront.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), false );
326     mMoveFront.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), true );
327     mMoveBack.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), true );
328     mMoveBack.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), true );
329     mMoveBack.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), false );
330   }
331
332   bool OnButtonClicked(Button button)
333   {
334     if( button == mCallStartButton )
335     {
336       mBackground.SetStyleName( BACKGROUND_ACTIVE_STYLE_STR );
337       mStage.Add( mButtonClip );
338       mMoveFront.Play();
339     }
340     else if( button == mCallEndButton )
341     {
342       mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
343       mTempTimer = Timer::New( mDuration * 1000.0f );
344       mTempTimer.TickSignal().Connect( this, &CallController::smallTick );
345       mTempTimer.Start();
346       mMoveBack.Play();
347     }
348     return true;
349   }
350   bool smallTick()
351   {
352     mButtonClip.Unparent();
353     return false;
354   }
355
356   void Reset()
357   {
358     mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
359   }
360
361 private:
362   Application&  mApplication;
363   Stage mStage;
364
365   Control mBackground;
366
367   // Show when call incommint
368   PushButton mCallStartButton;
369   ImageView mButtonIconDecall;
370   ImageView mButtonIconBattery;
371   TextLabel mLabelIncoming;
372   TextLabel mLabelName;
373   TextLabel mLabelNumber;
374   TextLabel mLabelDecline;
375
376   // Show when call active
377   PushButton mCallEndButton;
378   ImageView mButtonIcon;
379   Control   mButtonBackground;
380   Control   mButtonClip;
381   TextLabel mLabelTime;
382
383   Timer mTempTimer;
384
385   Animation mMoveFront;
386   Animation mMoveBack;
387
388   Vector4 mColorStart;
389   Vector4 mColorEnd;
390   Vector4 mColorReduce;
391
392   Vector4 mButtonColorStart;
393   Vector4 mButtonColorEnd;
394
395   float mDuration;
396   float mBackgroundDurationIncoming;
397   float mBackgroundDurationActive;
398   float mButtonDuration;
399   float mButtonDelay;
400 };
401
402 int main(int argc, char **argv)
403 {
404   Application application = Application::New( &argc, &argv );
405
406   CallController test( application );
407
408   application.MainLoop();
409   return 0;
410 }