180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright (C) 2014 The Android Open Source Project 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * in compliance with the License. You may obtain a copy of the License at 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software distributed under the License 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * or implied. See the License for the specific language governing permissions and limitations under 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * the License. 13 */ 14package android.support.v17.leanback.transition; 15 16import android.content.Context; 17import android.os.Build; 18import android.view.Gravity; 19import android.view.View; 20import android.view.ViewGroup; 21import android.view.Window; 22 23/** 24 * Helper for view transitions. 25 * @hide 26 */ 27public final class TransitionHelper { 28 29 public static final int FADE_IN = 0x1; 30 public static final int FADE_OUT = 0x2; 31 32 public static final int SLIDE_LEFT = Gravity.LEFT; 33 public static final int SLIDE_TOP = Gravity.TOP; 34 public static final int SLIDE_RIGHT = Gravity.RIGHT; 35 public static final int SLIDE_BOTTOM = Gravity.BOTTOM; 36 37 private final static TransitionHelper sHelper = new TransitionHelper(); 38 TransitionHelperVersionImpl mImpl; 39 40 /** 41 * Gets whether the system supports Transition animations. 42 * 43 * @return True if Transition animations are supported. 44 */ 45 public static boolean systemSupportsTransitions() { 46 if (Build.VERSION.SDK_INT >= 19) { 47 // Supported on Android 4.4 or later. 48 return true; 49 } 50 return false; 51 } 52 53 /** 54 * Returns true if system supports entrance Transition animations. 55 */ 56 public static boolean systemSupportsEntranceTransitions() { 57 return Build.VERSION.SDK_INT >= 21; 58 } 59 60 /** 61 * Interface implemented by classes that support Transition animations. 62 */ 63 static interface TransitionHelperVersionImpl { 64 65 public Object getSharedElementEnterTransition(Window window); 66 67 public Object getSharedElementReturnTransition(Window window); 68 69 public Object getSharedElementExitTransition(Window window); 70 71 public Object getSharedElementReenterTransition(Window window); 72 73 public Object getEnterTransition(Window window); 74 75 public Object getReturnTransition(Window window); 76 77 public Object getExitTransition(Window window); 78 79 public Object getReenterTransition(Window window); 80 81 public Object createScene(ViewGroup sceneRoot, Runnable r); 82 83 public Object createAutoTransition(); 84 85 public Object createSlide(int slideEdge); 86 87 public Object createScale(); 88 89 public Object createFadeTransition(int fadingMode); 90 91 public Object createChangeBounds(boolean reparent); 92 93 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay); 94 95 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay); 96 97 public void setChangeBoundsStartDelay(Object changeBounds, String className, 98 int startDelay); 99 100 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay); 101 102 public Object createTransitionSet(boolean sequential); 103 104 public void addTransition(Object transitionSet, Object transition); 105 106 public void setTransitionListener(Object transition, TransitionListener listener); 107 108 public void runTransition(Object scene, Object transition); 109 110 public void exclude(Object transition, int targetId, boolean exclude); 111 112 public void exclude(Object transition, View targetView, boolean exclude); 113 114 public void excludeChildren(Object transition, int targetId, boolean exclude); 115 116 public void excludeChildren(Object transition, View target, boolean exclude); 117 118 public void include(Object transition, int targetId); 119 120 public void include(Object transition, View targetView); 121 122 public void setStartDelay(Object transition, long startDelay); 123 124 public void setDuration(Object transition, long duration); 125 126 public void setInterpolator(Object transition, Object timeInterpolator); 127 128 public void addTarget(Object transition, View view); 129 130 public Object createDefaultInterpolator(Context context); 131 132 public Object loadTransition(Context context, int resId); 133 } 134 135 /** 136 * Interface used when we do not support Transition animations. 137 */ 138 private static final class TransitionHelperStubImpl implements TransitionHelperVersionImpl { 139 140 private static class TransitionStub { 141 TransitionListener mTransitionListener; 142 } 143 144 @Override 145 public Object getSharedElementEnterTransition(Window window) { 146 return null; 147 } 148 149 @Override 150 public Object getSharedElementReturnTransition(Window window) { 151 return null; 152 } 153 154 @Override 155 public Object getSharedElementExitTransition(Window window) { 156 return null; 157 } 158 159 @Override 160 public Object getSharedElementReenterTransition(Window window) { 161 return null; 162 } 163 164 @Override 165 public Object getEnterTransition(Window window) { 166 return null; 167 } 168 169 @Override 170 public Object getReturnTransition(Window window) { 171 return null; 172 } 173 174 @Override 175 public Object getExitTransition(Window window) { 176 return null; 177 } 178 179 @Override 180 public Object getReenterTransition(Window window) { 181 return null; 182 } 183 184 @Override 185 public Object createScene(ViewGroup sceneRoot, Runnable r) { 186 return r; 187 } 188 189 @Override 190 public Object createAutoTransition() { 191 return new TransitionStub(); 192 } 193 194 @Override 195 public Object createFadeTransition(int fadingMode) { 196 return new TransitionStub(); 197 } 198 199 @Override 200 public Object createChangeBounds(boolean reparent) { 201 return new TransitionStub(); 202 } 203 204 @Override 205 public Object createSlide(int slideEdge) { 206 return new TransitionStub(); 207 } 208 209 @Override 210 public Object createScale() { 211 return new TransitionStub(); 212 } 213 214 @Override 215 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 216 } 217 218 @Override 219 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 220 } 221 222 @Override 223 public void setChangeBoundsStartDelay(Object changeBounds, String className, 224 int startDelay) { 225 } 226 227 @Override 228 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 229 } 230 231 @Override 232 public Object createTransitionSet(boolean sequential) { 233 return new TransitionStub(); 234 } 235 236 @Override 237 public void addTransition(Object transitionSet, Object transition) { 238 } 239 240 @Override 241 public void exclude(Object transition, int targetId, boolean exclude) { 242 } 243 244 @Override 245 public void exclude(Object transition, View targetView, boolean exclude) { 246 } 247 248 @Override 249 public void excludeChildren(Object transition, int targetId, boolean exclude) { 250 } 251 252 @Override 253 public void excludeChildren(Object transition, View targetView, boolean exclude) { 254 } 255 256 @Override 257 public void include(Object transition, int targetId) { 258 } 259 260 @Override 261 public void include(Object transition, View targetView) { 262 } 263 264 @Override 265 public void setStartDelay(Object transition, long startDelay) { 266 } 267 268 @Override 269 public void setDuration(Object transition, long duration) { 270 } 271 272 @Override 273 public void setTransitionListener(Object transition, TransitionListener listener) { 274 ((TransitionStub) transition).mTransitionListener = listener; 275 } 276 277 @Override 278 public void runTransition(Object scene, Object transition) { 279 TransitionStub transitionStub = (TransitionStub) transition; 280 if (transitionStub != null && transitionStub.mTransitionListener != null) { 281 transitionStub.mTransitionListener.onTransitionStart(transition); 282 } 283 Runnable r = ((Runnable) scene); 284 if (r != null) { 285 r.run(); 286 } 287 if (transitionStub != null && transitionStub.mTransitionListener != null) { 288 transitionStub.mTransitionListener.onTransitionEnd(transition); 289 } 290 } 291 292 @Override 293 public void setInterpolator(Object transition, Object timeInterpolator) { 294 } 295 296 @Override 297 public void addTarget(Object transition, View view) { 298 } 299 300 @Override 301 public Object createDefaultInterpolator(Context context) { 302 return null; 303 } 304 305 @Override 306 public Object loadTransition(Context context, int resId) { 307 return new TransitionStub(); 308 } 309 } 310 311 /** 312 * Implementation used on KitKat (and above). 313 */ 314 private static class TransitionHelperKitkatImpl implements TransitionHelperVersionImpl { 315 316 @Override 317 public Object getSharedElementEnterTransition(Window window) { 318 return null; 319 } 320 321 @Override 322 public Object getSharedElementReturnTransition(Window window) { 323 return null; 324 } 325 326 @Override 327 public Object getSharedElementExitTransition(Window window) { 328 return null; 329 } 330 331 @Override 332 public Object getSharedElementReenterTransition(Window window) { 333 return null; 334 } 335 336 @Override 337 public Object getEnterTransition(Window window) { 338 return null; 339 } 340 341 @Override 342 public Object getReturnTransition(Window window) { 343 return null; 344 } 345 346 @Override 347 public Object getExitTransition(Window window) { 348 return null; 349 } 350 351 @Override 352 public Object getReenterTransition(Window window) { 353 return null; 354 } 355 356 @Override 357 public Object createScene(ViewGroup sceneRoot, Runnable r) { 358 return TransitionHelperKitkat.createScene(sceneRoot, r); 359 } 360 361 @Override 362 public Object createAutoTransition() { 363 return TransitionHelperKitkat.createAutoTransition(); 364 } 365 366 @Override 367 public Object createFadeTransition(int fadingMode) { 368 return TransitionHelperKitkat.createFadeTransition(fadingMode); 369 } 370 371 @Override 372 public Object createChangeBounds(boolean reparent) { 373 return TransitionHelperKitkat.createChangeBounds(reparent); 374 } 375 376 @Override 377 public Object createSlide(int slideEdge) { 378 return TransitionHelperKitkat.createSlide(slideEdge); 379 } 380 381 @Override 382 public Object createScale() { 383 return TransitionHelperKitkat.createScale(); 384 } 385 386 @Override 387 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 388 TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, view, startDelay); 389 } 390 391 @Override 392 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 393 TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, viewId, startDelay); 394 } 395 396 @Override 397 public void setChangeBoundsStartDelay(Object changeBounds, String className, 398 int startDelay) { 399 TransitionHelperKitkat.setChangeBoundsStartDelay(changeBounds, className, startDelay); 400 } 401 402 @Override 403 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 404 TransitionHelperKitkat.setChangeBoundsDefaultStartDelay(changeBounds, startDelay); 405 } 406 407 @Override 408 public Object createTransitionSet(boolean sequential) { 409 return TransitionHelperKitkat.createTransitionSet(sequential); 410 } 411 412 @Override 413 public void addTransition(Object transitionSet, Object transition) { 414 TransitionHelperKitkat.addTransition(transitionSet, transition); 415 } 416 417 @Override 418 public void exclude(Object transition, int targetId, boolean exclude) { 419 TransitionHelperKitkat.exclude(transition, targetId, exclude); 420 } 421 422 @Override 423 public void exclude(Object transition, View targetView, boolean exclude) { 424 TransitionHelperKitkat.exclude(transition, targetView, exclude); 425 } 426 427 @Override 428 public void excludeChildren(Object transition, int targetId, boolean exclude) { 429 TransitionHelperKitkat.excludeChildren(transition, targetId, exclude); 430 } 431 432 @Override 433 public void excludeChildren(Object transition, View targetView, boolean exclude) { 434 TransitionHelperKitkat.excludeChildren(transition, targetView, exclude); 435 } 436 437 @Override 438 public void include(Object transition, int targetId) { 439 TransitionHelperKitkat.include(transition, targetId); 440 } 441 442 @Override 443 public void include(Object transition, View targetView) { 444 TransitionHelperKitkat.include(transition, targetView); 445 } 446 447 @Override 448 public void setStartDelay(Object transition, long startDelay) { 449 TransitionHelperKitkat.setStartDelay(transition, startDelay); 450 } 451 452 @Override 453 public void setDuration(Object transition, long duration) { 454 TransitionHelperKitkat.setDuration(transition, duration); 455 } 456 457 @Override 458 public void setTransitionListener(Object transition, TransitionListener listener) { 459 TransitionHelperKitkat.setTransitionListener(transition, listener); 460 } 461 462 @Override 463 public void runTransition(Object scene, Object transition) { 464 TransitionHelperKitkat.runTransition(scene, transition); 465 } 466 467 @Override 468 public void setInterpolator(Object transition, Object timeInterpolator) { 469 TransitionHelperKitkat.setInterpolator(transition, timeInterpolator); 470 } 471 472 @Override 473 public void addTarget(Object transition, View view) { 474 TransitionHelperKitkat.addTarget(transition, view); 475 } 476 477 @Override 478 public Object createDefaultInterpolator(Context context) { 479 return null; 480 } 481 482 @Override 483 public Object loadTransition(Context context, int resId) { 484 return TransitionHelperKitkat.loadTransition(context, resId); 485 } 486 } 487 488 private static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl { 489 490 @Override 491 public Object getSharedElementEnterTransition(Window window) { 492 return TransitionHelperApi21.getSharedElementEnterTransition(window); 493 } 494 495 @Override 496 public Object getSharedElementReturnTransition(Window window) { 497 return TransitionHelperApi21.getSharedElementReturnTransition(window); 498 } 499 500 @Override 501 public Object getSharedElementExitTransition(Window window) { 502 return TransitionHelperApi21.getSharedElementExitTransition(window); 503 } 504 505 @Override 506 public Object getSharedElementReenterTransition(Window window) { 507 return TransitionHelperApi21.getSharedElementReenterTransition(window); 508 } 509 510 @Override 511 public Object getEnterTransition(Window window) { 512 return TransitionHelperApi21.getEnterTransition(window); 513 } 514 515 @Override 516 public Object getReturnTransition(Window window) { 517 return TransitionHelperApi21.getReturnTransition(window); 518 } 519 520 @Override 521 public Object getExitTransition(Window window) { 522 return TransitionHelperApi21.getExitTransition(window); 523 } 524 525 @Override 526 public Object getReenterTransition(Window window) { 527 return TransitionHelperApi21.getReenterTransition(window); 528 } 529 530 @Override 531 public Object createScale() { 532 return TransitionHelperApi21.createScale(); 533 } 534 535 @Override 536 public Object createDefaultInterpolator(Context context) { 537 return TransitionHelperApi21.createDefaultInterpolator(context); 538 } 539 } 540 541 /** 542 * Returns the TransitionHelper that can be used to perform Transition 543 * animations. 544 */ 545 public static TransitionHelper getInstance() { 546 return sHelper; 547 } 548 549 private TransitionHelper() { 550 if (Build.VERSION.SDK_INT >= 21) { 551 mImpl = new TransitionHelperApi21Impl(); 552 } else if (systemSupportsTransitions()) { 553 mImpl = new TransitionHelperKitkatImpl(); 554 } else { 555 mImpl = new TransitionHelperStubImpl(); 556 } 557 } 558 559 public Object getSharedElementEnterTransition(Window window) { 560 return mImpl.getSharedElementEnterTransition(window); 561 } 562 563 public Object getSharedElementReturnTransition(Window window) { 564 return mImpl.getSharedElementReturnTransition(window); 565 } 566 567 public Object getSharedElementExitTransition(Window window) { 568 return mImpl.getSharedElementExitTransition(window); 569 } 570 571 public Object getSharedElementReenterTransition(Window window) { 572 return mImpl.getSharedElementReenterTransition(window); 573 } 574 575 public Object getEnterTransition(Window window) { 576 return mImpl.getEnterTransition(window); 577 } 578 579 public Object getReturnTransition(Window window) { 580 return mImpl.getReturnTransition(window); 581 } 582 583 public Object getExitTransition(Window window) { 584 return mImpl.getExitTransition(window); 585 } 586 587 public Object getReenterTransition(Window window) { 588 return mImpl.getReenterTransition(window); 589 } 590 591 public Object createScene(ViewGroup sceneRoot, Runnable r) { 592 return mImpl.createScene(sceneRoot, r); 593 } 594 595 public Object createChangeBounds(boolean reparent) { 596 return mImpl.createChangeBounds(reparent); 597 } 598 599 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 600 mImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay); 601 } 602 603 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 604 mImpl.setChangeBoundsStartDelay(changeBounds, viewId, startDelay); 605 } 606 607 public void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) { 608 mImpl.setChangeBoundsStartDelay(changeBounds, className, startDelay); 609 } 610 611 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 612 mImpl.setChangeBoundsDefaultStartDelay(changeBounds, startDelay); 613 } 614 615 public Object createTransitionSet(boolean sequential) { 616 return mImpl.createTransitionSet(sequential); 617 } 618 619 public Object createSlide(int slideEdge) { 620 return mImpl.createSlide(slideEdge); 621 } 622 623 public Object createScale() { 624 return mImpl.createScale(); 625 } 626 627 public void addTransition(Object transitionSet, Object transition) { 628 mImpl.addTransition(transitionSet, transition); 629 } 630 631 public void exclude(Object transition, int targetId, boolean exclude) { 632 mImpl.exclude(transition, targetId, exclude); 633 } 634 635 public void exclude(Object transition, View targetView, boolean exclude) { 636 mImpl.exclude(transition, targetView, exclude); 637 } 638 639 public void excludeChildren(Object transition, int targetId, boolean exclude) { 640 mImpl.excludeChildren(transition, targetId, exclude); 641 } 642 643 public void excludeChildren(Object transition, View targetView, boolean exclude) { 644 mImpl.excludeChildren(transition, targetView, exclude); 645 } 646 647 public void include(Object transition, int targetId) { 648 mImpl.include(transition, targetId); 649 } 650 651 public void include(Object transition, View targetView) { 652 mImpl.include(transition, targetView); 653 } 654 655 public void setStartDelay(Object transition, long startDelay) { 656 mImpl.setStartDelay(transition, startDelay); 657 } 658 659 public void setDuration(Object transition, long duration) { 660 mImpl.setDuration(transition, duration); 661 } 662 663 public Object createAutoTransition() { 664 return mImpl.createAutoTransition(); 665 } 666 667 public Object createFadeTransition(int fadeMode) { 668 return mImpl.createFadeTransition(fadeMode); 669 } 670 671 public void setTransitionListener(Object transition, TransitionListener listener) { 672 mImpl.setTransitionListener(transition, listener); 673 } 674 675 public void runTransition(Object scene, Object transition) { 676 mImpl.runTransition(scene, transition); 677 } 678 679 public void setInterpolator(Object transition, Object timeInterpolator) { 680 mImpl.setInterpolator(transition, timeInterpolator); 681 } 682 683 public void addTarget(Object transition, View view) { 684 mImpl.addTarget(transition, view); 685 } 686 687 public Object createDefaultInterpolator(Context context) { 688 return mImpl.createDefaultInterpolator(context); 689 } 690 691 public Object loadTransition(Context context, int resId) { 692 return mImpl.loadTransition(context, resId); 693 } 694} 695