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/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>
26 using namespace Dali::Toolkit;
28 // This example shows how to create and display animated-gradient-effect
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;
41 // const parameters for animations
42 const float CHANGE_DURATION = 0.2f;
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 );
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 );
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" );
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;
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" );
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" );
101 } // unnamed namespace
103 // This example shows how to render animated gradients
105 class CallController : public ConnectionTracker
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 ),
116 mBackgroundDurationIncoming( 0.0f ),
117 mBackgroundDurationActive( 0.0f ),
118 mButtonDuration( 0.0f ),
121 // Connect to the Application's Init signal
122 mApplication.InitSignal().Connect( this, &CallController::Create );
127 // Nothing to do here;
130 // The Init signal is received once (only) during the Application lifetime
131 void Create(Application& application)
133 // Get a handle to the stage
134 mStage = Stage::GetCurrent();
135 mStage.KeyEventSignal().Connect( this, &CallController::OnKeyEvent );
137 // Apply custom style for background and button.
138 StyleManager::Get().ApplyTheme( BACKGROUND_STYLE_JSON );
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;
147 // Note that this is heuristic value
148 FONT_SCALE = 0.25f * STAGE_SIZE.y / STAGE_SIZE.x;
150 mBackground = Control::New();
151 mBackground.SetParentOrigin( ParentOrigin::CENTER );
152 mBackground.SetAnchorPoint( AnchorPoint::CENTER );
153 mBackground.SetSize( STAGE_SIZE );
155 mStage.Add( mBackground );
164 void OnKeyEvent(const KeyEvent& event)
166 if( event.state == KeyEvent::Down )
168 if( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) )
177 // Setup const parameter values
178 void BuildParameter()
180 mDuration = CHANGE_DURATION;
189 // Create and Add to stage when visible at call incomming
190 void SetupComingActors()
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 );
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 );
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 mCallStartButton.SetProperty( Control::Property::BACKGROUND, ICON_CALL_IMAGE );
215 mCallStartButton.SetProperty( Button::Property::LABEL, "" );
217 mStage.Add( mCallStartButton );
218 mStage.Add( mButtonIconDecall );
219 mStage.Add( mButtonIconBattery );
221 mLabelIncoming = TextLabel::New( LABEL_INCOMING_STR );
222 mLabelIncoming.SetParentOrigin( ParentOrigin::CENTER );
223 mLabelIncoming.SetAnchorPoint( AnchorPoint::CENTER );
224 mLabelIncoming.SetSize( LABEL_INCOMING_SIZE * SCALED_STAGE_SIZE );
225 mLabelIncoming.SetPosition( LABEL_INCOMING_POSITION * SCALED_STAGE_SIZE_3 );
226 mLabelIncoming.SetVisible( 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" );
232 mLabelName = TextLabel::New( LABEL_NAME_STR );
233 mLabelName.SetParentOrigin( ParentOrigin::CENTER );
234 mLabelName.SetAnchorPoint( AnchorPoint::CENTER );
235 mLabelName.SetSize( LABEL_NAME_SIZE * SCALED_STAGE_SIZE );
236 mLabelName.SetPosition( LABEL_NAME_POSITION * SCALED_STAGE_SIZE_3 );
237 mLabelName.SetVisible( 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" );
243 mLabelNumber = TextLabel::New( LABEL_NUMBER_STR );
244 mLabelNumber.SetParentOrigin( ParentOrigin::CENTER );
245 mLabelNumber.SetAnchorPoint( AnchorPoint::CENTER );
246 mLabelNumber.SetSize( LABEL_NUMBER_SIZE * SCALED_STAGE_SIZE );
247 mLabelNumber.SetPosition( LABEL_NUMBER_POSITION * SCALED_STAGE_SIZE_3 );
248 mLabelNumber.SetVisible( 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" );
254 mLabelDecline = TextLabel::New( LABEL_DECLINE_STR );
255 mLabelDecline.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
256 mLabelDecline.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
257 mLabelDecline.SetSize( LABEL_DECLINE_SIZE * SCALED_STAGE_SIZE );
258 mLabelDecline.SetPosition( LABEL_DECLINE_POSITION * SCALED_WIDTH );
259 mLabelDecline.SetVisible( 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" );
265 mStage.Add( mLabelIncoming );
266 mStage.Add( mLabelName );
267 mStage.Add( mLabelNumber );
268 mStage.Add( mLabelDecline );
271 // Create and Add to stage when visible at call active
272 void SetupActiveActors()
274 mButtonClip = Control::New();
275 mButtonClip.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
276 mButtonClip.SetAnchorPoint( ParentOrigin::BOTTOM_CENTER );
277 mButtonClip.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
278 mButtonClip.SetPosition( BUTTON_DECALL_CLIP_POSITION * SCALED_WIDTH );
280 mButtonIcon = ImageView::New();
281 mButtonIcon.SetImage( BUTTON_DECALL_ICON_IMAGE );
282 mButtonIcon.SetParentOrigin( ParentOrigin::CENTER );
283 mButtonIcon.SetAnchorPoint( AnchorPoint::CENTER );
284 mButtonIcon.SetSize( BUTTON_DECALL_ICON_SIZE * SCALED_WIDTH );
285 mButtonIcon.SetPosition( BUTTON_DECALL_ICON_POSITION * SCALED_WIDTH );
287 mCallEndButton = PushButton::New();
288 mCallEndButton.SetParentOrigin( ParentOrigin::CENTER );
289 mCallEndButton.SetAnchorPoint( AnchorPoint::CENTER );
290 mCallEndButton.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
291 mCallEndButton.SetPosition( BUTTON_DECALL_POSITION * SCALED_WIDTH );
292 mCallEndButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
293 mCallEndButton.SetProperty( DevelButton::Property::SELECTED_BACKGROUND_VISUAL, "" );
294 mCallEndButton.SetProperty( DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, "" );
295 mCallEndButton.SetStyleName( DECLINE_BUTTON_STYLE_STR );
296 mCallEndButton.SetProperty( Button::Property::LABEL, "" );
298 mButtonClip.Add( mCallEndButton );
299 mButtonClip.Add( mButtonIcon );
301 mLabelTime = TextLabel::New( LABEL_TIME_STR );
302 mLabelTime.SetParentOrigin( ParentOrigin::CENTER );
303 mLabelTime.SetAnchorPoint( AnchorPoint::CENTER );
304 mLabelTime.SetSize( LABEL_TIME_SIZE * SCALED_STAGE_SIZE );
305 mLabelTime.SetPosition( LABEL_TIME_POSITION * SCALED_STAGE_SIZE_3 );
306 mLabelTime.SetVisible( 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" );
312 mStage.Add( mLabelTime );
315 void SetupAnimation()
317 mMoveFront = Animation::New( mDuration );
318 mMoveBack = Animation::New( mDuration );
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 );
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 );
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 );
336 bool OnButtonClicked(Button button)
338 if( button == mCallStartButton )
340 mBackground.SetStyleName( BACKGROUND_ACTIVE_STYLE_STR );
341 mStage.Add( mButtonClip );
344 else if( button == mCallEndButton )
346 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
347 mTempTimer = Timer::New( mDuration * 1000.0f );
348 mTempTimer.TickSignal().Connect( this, &CallController::smallTick );
356 mButtonClip.Unparent();
362 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
366 Application& mApplication;
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;
380 // Show when call active
381 PushButton mCallEndButton;
382 ImageView mButtonIcon;
383 Control mButtonBackground;
385 TextLabel mLabelTime;
389 Animation mMoveFront;
394 Vector4 mColorReduce;
396 Vector4 mButtonColorStart;
397 Vector4 mButtonColorEnd;
400 float mBackgroundDurationIncoming;
401 float mBackgroundDurationActive;
402 float mButtonDuration;
406 int main(int argc, char **argv)
408 Application application = Application::New( &argc, &argv );
410 CallController test( application );
412 application.MainLoop();