2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #include <dali/dali.h>
18 #include <dali-toolkit/dali-toolkit.h>
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>
25 using namespace Dali::Toolkit;
27 // This example shows how to create and display animated-gradient-effect
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;
40 // const parameters for animations
41 const float CHANGE_DURATION = 0.2f;
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 );
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 );
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" );
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;
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" );
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" );
100 } // unnamed namespace
102 // This example shows how to render animated gradients
104 class CallController : public ConnectionTracker
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 ),
115 mBackgroundDurationIncoming( 0.0f ),
116 mBackgroundDurationActive( 0.0f ),
117 mButtonDuration( 0.0f ),
120 // Connect to the Application's Init signal
121 mApplication.InitSignal().Connect( this, &CallController::Create );
126 // Nothing to do here;
129 // The Init signal is received once (only) during the Application lifetime
130 void Create(Application& application)
132 // Get a handle to the stage
133 mStage = Stage::GetCurrent();
134 mStage.KeyEventSignal().Connect( this, &CallController::OnKeyEvent );
136 // Apply custom style for background and button.
137 StyleManager::Get().ApplyTheme( BACKGROUND_STYLE_JSON );
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;
146 // Note that this is heuristic value
147 FONT_SCALE = 0.25f * STAGE_SIZE.y / STAGE_SIZE.x;
149 mBackground = Control::New();
150 mBackground.SetParentOrigin( ParentOrigin::CENTER );
151 mBackground.SetAnchorPoint( AnchorPoint::CENTER );
152 mBackground.SetSize( STAGE_SIZE );
154 mStage.Add( mBackground );
163 void OnKeyEvent(const KeyEvent& event)
165 if( event.state == KeyEvent::Down )
167 if( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) )
176 // Setup const parameter values
177 void BuildParameter()
179 mDuration = CHANGE_DURATION;
188 // Create and Add to stage when visible at call incomming
189 void SetupComingActors()
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 );
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 );
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 );
214 mStage.Add( mCallStartButton );
215 mStage.Add( mButtonIconDecall );
216 mStage.Add( mButtonIconBattery );
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" );
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" );
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" );
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" );
262 mStage.Add( mLabelIncoming );
263 mStage.Add( mLabelName );
264 mStage.Add( mLabelNumber );
265 mStage.Add( mLabelDecline );
268 // Create and Add to stage when visible at call active
269 void SetupActiveActors()
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 );
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 );
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 );
294 mButtonClip.Add( mCallEndButton );
295 mButtonClip.Add( mButtonIcon );
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" );
308 mStage.Add( mLabelTime );
311 void SetupAnimation()
313 mMoveFront = Animation::New( mDuration );
314 mMoveBack = Animation::New( mDuration );
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 );
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 );
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 );
332 bool OnButtonClicked(Button button)
334 if( button == mCallStartButton )
336 mBackground.SetStyleName( BACKGROUND_ACTIVE_STYLE_STR );
337 mStage.Add( mButtonClip );
340 else if( button == mCallEndButton )
342 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
343 mTempTimer = Timer::New( mDuration * 1000.0f );
344 mTempTimer.TickSignal().Connect( this, &CallController::smallTick );
352 mButtonClip.Unparent();
358 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
362 Application& mApplication;
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;
376 // Show when call active
377 PushButton mCallEndButton;
378 ImageView mButtonIcon;
379 Control mButtonBackground;
381 TextLabel mLabelTime;
385 Animation mMoveFront;
390 Vector4 mColorReduce;
392 Vector4 mButtonColorStart;
393 Vector4 mButtonColorEnd;
396 float mBackgroundDurationIncoming;
397 float mBackgroundDurationActive;
398 float mButtonDuration;
402 int main(int argc, char **argv)
404 Application application = Application::New( &argc, &argv );
406 CallController test( application );
408 application.MainLoop();