2 * Copyright (c) 2019 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_BACKGROUND_VISUAL, ICON_CALL_IMAGE );
212 mCallStartButton.SetProperty( Button::Property::UNSELECTED_BACKGROUND_VISUAL, ICON_CALL_IMAGE );
213 mCallStartButton.SetProperty( Control::Property::BACKGROUND, ICON_CALL_IMAGE );
214 mCallStartButton.SetProperty( Button::Property::LABEL, "" );
216 mStage.Add( mCallStartButton );
217 mStage.Add( mButtonIconDecall );
218 mStage.Add( mButtonIconBattery );
220 mLabelIncoming = TextLabel::New( LABEL_INCOMING_STR );
221 mLabelIncoming.SetParentOrigin( ParentOrigin::CENTER );
222 mLabelIncoming.SetAnchorPoint( AnchorPoint::CENTER );
223 mLabelIncoming.SetSize( LABEL_INCOMING_SIZE * SCALED_STAGE_SIZE );
224 mLabelIncoming.SetPosition( LABEL_INCOMING_POSITION * SCALED_STAGE_SIZE_3 );
225 mLabelIncoming.SetVisible( true );
226 mLabelIncoming.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_INCOMING_FONT_COLOR );
227 mLabelIncoming.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_INCOMING_FONT_SIZE * FONT_SCALE );
228 mLabelIncoming.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
229 mLabelIncoming.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
231 mLabelName = TextLabel::New( LABEL_NAME_STR );
232 mLabelName.SetParentOrigin( ParentOrigin::CENTER );
233 mLabelName.SetAnchorPoint( AnchorPoint::CENTER );
234 mLabelName.SetSize( LABEL_NAME_SIZE * SCALED_STAGE_SIZE );
235 mLabelName.SetPosition( LABEL_NAME_POSITION * SCALED_STAGE_SIZE_3 );
236 mLabelName.SetVisible( true );
237 mLabelName.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NAME_FONT_COLOR );
238 mLabelName.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NAME_FONT_SIZE * FONT_SCALE );
239 mLabelName.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
240 mLabelName.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
242 mLabelNumber = TextLabel::New( LABEL_NUMBER_STR );
243 mLabelNumber.SetParentOrigin( ParentOrigin::CENTER );
244 mLabelNumber.SetAnchorPoint( AnchorPoint::CENTER );
245 mLabelNumber.SetSize( LABEL_NUMBER_SIZE * SCALED_STAGE_SIZE );
246 mLabelNumber.SetPosition( LABEL_NUMBER_POSITION * SCALED_STAGE_SIZE_3 );
247 mLabelNumber.SetVisible( true );
248 mLabelNumber.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NUMBER_FONT_COLOR );
249 mLabelNumber.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NUMBER_FONT_SIZE * FONT_SCALE );
250 mLabelNumber.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
251 mLabelNumber.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
253 mLabelDecline = TextLabel::New( LABEL_DECLINE_STR );
254 mLabelDecline.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
255 mLabelDecline.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
256 mLabelDecline.SetSize( LABEL_DECLINE_SIZE * SCALED_STAGE_SIZE );
257 mLabelDecline.SetPosition( LABEL_DECLINE_POSITION * SCALED_WIDTH );
258 mLabelDecline.SetVisible( true );
259 mLabelDecline.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_DECLINE_FONT_COLOR );
260 mLabelDecline.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_DECLINE_FONT_SIZE * FONT_SCALE );
261 mLabelDecline.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
262 mLabelDecline.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
264 mStage.Add( mLabelIncoming );
265 mStage.Add( mLabelName );
266 mStage.Add( mLabelNumber );
267 mStage.Add( mLabelDecline );
270 // Create and Add to stage when visible at call active
271 void SetupActiveActors()
273 mButtonClip = Control::New();
274 mButtonClip.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
275 mButtonClip.SetAnchorPoint( ParentOrigin::BOTTOM_CENTER );
276 mButtonClip.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
277 mButtonClip.SetPosition( BUTTON_DECALL_CLIP_POSITION * SCALED_WIDTH );
279 mButtonIcon = ImageView::New();
280 mButtonIcon.SetImage( BUTTON_DECALL_ICON_IMAGE );
281 mButtonIcon.SetParentOrigin( ParentOrigin::CENTER );
282 mButtonIcon.SetAnchorPoint( AnchorPoint::CENTER );
283 mButtonIcon.SetSize( BUTTON_DECALL_ICON_SIZE * SCALED_WIDTH );
284 mButtonIcon.SetPosition( BUTTON_DECALL_ICON_POSITION * SCALED_WIDTH );
286 mCallEndButton = PushButton::New();
287 mCallEndButton.SetParentOrigin( ParentOrigin::CENTER );
288 mCallEndButton.SetAnchorPoint( AnchorPoint::CENTER );
289 mCallEndButton.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
290 mCallEndButton.SetPosition( BUTTON_DECALL_POSITION * SCALED_WIDTH );
291 mCallEndButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
292 mCallEndButton.SetProperty( Button::Property::SELECTED_BACKGROUND_VISUAL, "" );
293 mCallEndButton.SetProperty( Button::Property::UNSELECTED_BACKGROUND_VISUAL, "" );
294 mCallEndButton.SetStyleName( DECLINE_BUTTON_STYLE_STR );
295 mCallEndButton.SetProperty( Button::Property::LABEL, "" );
297 mButtonClip.Add( mCallEndButton );
298 mButtonClip.Add( mButtonIcon );
300 mLabelTime = TextLabel::New( LABEL_TIME_STR );
301 mLabelTime.SetParentOrigin( ParentOrigin::CENTER );
302 mLabelTime.SetAnchorPoint( AnchorPoint::CENTER );
303 mLabelTime.SetSize( LABEL_TIME_SIZE * SCALED_STAGE_SIZE );
304 mLabelTime.SetPosition( LABEL_TIME_POSITION * SCALED_STAGE_SIZE_3 );
305 mLabelTime.SetVisible( false );
306 mLabelTime.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_TIME_FONT_COLOR );
307 mLabelTime.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_TIME_FONT_SIZE * FONT_SCALE );
308 mLabelTime.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
309 mLabelTime.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
311 mStage.Add( mLabelTime );
314 void SetupAnimation()
316 mMoveFront = Animation::New( mDuration );
317 mMoveBack = Animation::New( mDuration );
319 mMoveFront.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), 0.0f * SCALED_HEIGHT );
320 mMoveBack.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), BUTTON_DECALL_CLIP_POSITION.y * SCALED_HEIGHT );
322 mMoveFront.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), false );
323 mMoveFront.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), false );
324 mMoveBack.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), true );
325 mMoveBack.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), true );
327 mMoveFront.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), false );
328 mMoveFront.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), false );
329 mMoveFront.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), true );
330 mMoveBack.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), true );
331 mMoveBack.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), true );
332 mMoveBack.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), false );
335 bool OnButtonClicked(Button button)
337 if( button == mCallStartButton )
339 mBackground.SetStyleName( BACKGROUND_ACTIVE_STYLE_STR );
340 mStage.Add( mButtonClip );
343 else if( button == mCallEndButton )
345 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
346 mTempTimer = Timer::New( mDuration * 1000.0f );
347 mTempTimer.TickSignal().Connect( this, &CallController::smallTick );
355 mButtonClip.Unparent();
361 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
365 Application& mApplication;
370 // Show when call incommint
371 PushButton mCallStartButton;
372 ImageView mButtonIconDecall;
373 ImageView mButtonIconBattery;
374 TextLabel mLabelIncoming;
375 TextLabel mLabelName;
376 TextLabel mLabelNumber;
377 TextLabel mLabelDecline;
379 // Show when call active
380 PushButton mCallEndButton;
381 ImageView mButtonIcon;
382 Control mButtonBackground;
384 TextLabel mLabelTime;
388 Animation mMoveFront;
393 Vector4 mColorReduce;
395 Vector4 mButtonColorStart;
396 Vector4 mButtonColorEnd;
399 float mBackgroundDurationIncoming;
400 float mBackgroundDurationActive;
401 float mButtonDuration;
405 int DALI_EXPORT_API main(int argc, char **argv)
407 Application application = Application::New( &argc, &argv );
409 CallController test( application );
411 application.MainLoop();