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/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 );
215 mStage.Add( mCallStartButton );
216 mStage.Add( mButtonIconDecall );
217 mStage.Add( mButtonIconBattery );
219 mLabelIncoming = TextLabel::New( LABEL_INCOMING_STR );
220 mLabelIncoming.SetParentOrigin( ParentOrigin::CENTER );
221 mLabelIncoming.SetAnchorPoint( AnchorPoint::CENTER );
222 mLabelIncoming.SetSize( LABEL_INCOMING_SIZE * SCALED_STAGE_SIZE );
223 mLabelIncoming.SetPosition( LABEL_INCOMING_POSITION * SCALED_STAGE_SIZE_3 );
224 mLabelIncoming.SetVisible( true );
225 mLabelIncoming.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_INCOMING_FONT_COLOR );
226 mLabelIncoming.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_INCOMING_FONT_SIZE * FONT_SCALE );
227 mLabelIncoming.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
228 mLabelIncoming.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
230 mLabelName = TextLabel::New( LABEL_NAME_STR );
231 mLabelName.SetParentOrigin( ParentOrigin::CENTER );
232 mLabelName.SetAnchorPoint( AnchorPoint::CENTER );
233 mLabelName.SetSize( LABEL_NAME_SIZE * SCALED_STAGE_SIZE );
234 mLabelName.SetPosition( LABEL_NAME_POSITION * SCALED_STAGE_SIZE_3 );
235 mLabelName.SetVisible( true );
236 mLabelName.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NAME_FONT_COLOR );
237 mLabelName.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NAME_FONT_SIZE * FONT_SCALE );
238 mLabelName.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
239 mLabelName.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
241 mLabelNumber = TextLabel::New( LABEL_NUMBER_STR );
242 mLabelNumber.SetParentOrigin( ParentOrigin::CENTER );
243 mLabelNumber.SetAnchorPoint( AnchorPoint::CENTER );
244 mLabelNumber.SetSize( LABEL_NUMBER_SIZE * SCALED_STAGE_SIZE );
245 mLabelNumber.SetPosition( LABEL_NUMBER_POSITION * SCALED_STAGE_SIZE_3 );
246 mLabelNumber.SetVisible( true );
247 mLabelNumber.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_NUMBER_FONT_COLOR );
248 mLabelNumber.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_NUMBER_FONT_SIZE * FONT_SCALE );
249 mLabelNumber.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
250 mLabelNumber.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
252 mLabelDecline = TextLabel::New( LABEL_DECLINE_STR );
253 mLabelDecline.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
254 mLabelDecline.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
255 mLabelDecline.SetSize( LABEL_DECLINE_SIZE * SCALED_STAGE_SIZE );
256 mLabelDecline.SetPosition( LABEL_DECLINE_POSITION * SCALED_WIDTH );
257 mLabelDecline.SetVisible( true );
258 mLabelDecline.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_DECLINE_FONT_COLOR );
259 mLabelDecline.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_DECLINE_FONT_SIZE * FONT_SCALE );
260 mLabelDecline.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
261 mLabelDecline.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
263 mStage.Add( mLabelIncoming );
264 mStage.Add( mLabelName );
265 mStage.Add( mLabelNumber );
266 mStage.Add( mLabelDecline );
269 // Create and Add to stage when visible at call active
270 void SetupActiveActors()
272 mButtonClip = Control::New();
273 mButtonClip.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
274 mButtonClip.SetAnchorPoint( ParentOrigin::BOTTOM_CENTER );
275 mButtonClip.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
276 mButtonClip.SetPosition( BUTTON_DECALL_CLIP_POSITION * SCALED_WIDTH );
278 mButtonIcon = ImageView::New();
279 mButtonIcon.SetImage( BUTTON_DECALL_ICON_IMAGE );
280 mButtonIcon.SetParentOrigin( ParentOrigin::CENTER );
281 mButtonIcon.SetAnchorPoint( AnchorPoint::CENTER );
282 mButtonIcon.SetSize( BUTTON_DECALL_ICON_SIZE * SCALED_WIDTH );
283 mButtonIcon.SetPosition( BUTTON_DECALL_ICON_POSITION * SCALED_WIDTH );
285 mCallEndButton = PushButton::New();
286 mCallEndButton.SetParentOrigin( ParentOrigin::CENTER );
287 mCallEndButton.SetAnchorPoint( AnchorPoint::CENTER );
288 mCallEndButton.SetSize( BUTTON_DECALL_SIZE * SCALED_WIDTH );
289 mCallEndButton.SetPosition( BUTTON_DECALL_POSITION * SCALED_WIDTH );
290 mCallEndButton.ClickedSignal().Connect( this, &CallController::OnButtonClicked );
291 mCallEndButton.SetProperty( DevelButton::Property::SELECTED_BACKGROUND_VISUAL, "" );
292 mCallEndButton.SetProperty( DevelButton::Property::UNSELECTED_BACKGROUND_VISUAL, "" );
293 mCallEndButton.SetStyleName( DECLINE_BUTTON_STYLE_STR );
295 mButtonClip.Add( mCallEndButton );
296 mButtonClip.Add( mButtonIcon );
298 mLabelTime = TextLabel::New( LABEL_TIME_STR );
299 mLabelTime.SetParentOrigin( ParentOrigin::CENTER );
300 mLabelTime.SetAnchorPoint( AnchorPoint::CENTER );
301 mLabelTime.SetSize( LABEL_TIME_SIZE * SCALED_STAGE_SIZE );
302 mLabelTime.SetPosition( LABEL_TIME_POSITION * SCALED_STAGE_SIZE_3 );
303 mLabelTime.SetVisible( false );
304 mLabelTime.SetProperty( TextLabel::Property::TEXT_COLOR, LABEL_TIME_FONT_COLOR );
305 mLabelTime.SetProperty( TextLabel::Property::POINT_SIZE, LABEL_TIME_FONT_SIZE * FONT_SCALE );
306 mLabelTime.SetProperty( TextLabel::Property::VERTICAL_ALIGNMENT, "CENTER" );
307 mLabelTime.SetProperty( TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
309 mStage.Add( mLabelTime );
312 void SetupAnimation()
314 mMoveFront = Animation::New( mDuration );
315 mMoveBack = Animation::New( mDuration );
317 mMoveFront.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), 0.0f * SCALED_HEIGHT );
318 mMoveBack.AnimateTo( Property( mButtonClip, Actor::Property::POSITION_Y ), BUTTON_DECALL_CLIP_POSITION.y * SCALED_HEIGHT );
320 mMoveFront.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), false );
321 mMoveFront.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), false );
322 mMoveBack.AnimateTo( Property( mCallStartButton, Actor::Property::VISIBLE ), true );
323 mMoveBack.AnimateTo( Property( mButtonIconDecall, Actor::Property::VISIBLE ), true );
325 mMoveFront.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), false );
326 mMoveFront.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), false );
327 mMoveFront.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), true );
328 mMoveBack.AnimateTo( Property( mLabelIncoming, Actor::Property::VISIBLE ), true );
329 mMoveBack.AnimateTo( Property( mLabelNumber, Actor::Property::VISIBLE ), true );
330 mMoveBack.AnimateTo( Property( mLabelTime, Actor::Property::VISIBLE ), false );
333 bool OnButtonClicked(Button button)
335 if( button == mCallStartButton )
337 mBackground.SetStyleName( BACKGROUND_ACTIVE_STYLE_STR );
338 mStage.Add( mButtonClip );
341 else if( button == mCallEndButton )
343 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
344 mTempTimer = Timer::New( mDuration * 1000.0f );
345 mTempTimer.TickSignal().Connect( this, &CallController::smallTick );
353 mButtonClip.Unparent();
359 mBackground.SetStyleName( BACKGROUND_INCOME_STYLE_STR );
363 Application& mApplication;
368 // Show when call incommint
369 PushButton mCallStartButton;
370 ImageView mButtonIconDecall;
371 ImageView mButtonIconBattery;
372 TextLabel mLabelIncoming;
373 TextLabel mLabelName;
374 TextLabel mLabelNumber;
375 TextLabel mLabelDecline;
377 // Show when call active
378 PushButton mCallEndButton;
379 ImageView mButtonIcon;
380 Control mButtonBackground;
382 TextLabel mLabelTime;
386 Animation mMoveFront;
391 Vector4 mColorReduce;
393 Vector4 mButtonColorStart;
394 Vector4 mButtonColorEnd;
397 float mBackgroundDurationIncoming;
398 float mBackgroundDurationActive;
399 float mButtonDuration;
403 int main(int argc, char **argv)
405 Application application = Application::New( &argc, &argv );
407 CallController test( application );
409 application.MainLoop();