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