TransitionHelper.java revision 95400e6d31a1ac09e48cb8944a79b7250484aa4c
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 createFadeTransition(int fadingMode); 79 80 public Object createChangeBounds(boolean reparent); 81 82 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay); 83 84 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay); 85 86 public void setChangeBoundsStartDelay(Object changeBounds, String className, 87 int startDelay); 88 89 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay); 90 91 public Object createTransitionSet(boolean sequential); 92 93 public void addTransition(Object transitionSet, Object transition); 94 95 public void setTransitionListener(Object transition, TransitionListener listener); 96 97 public void runTransition(Object scene, Object transition); 98 99 public void exclude(Object transition, int targetId, boolean exclude); 100 101 public void exclude(Object transition, View targetView, boolean exclude); 102 103 public void excludeChildren(Object transition, int targetId, boolean exclude); 104 105 public void excludeChildren(Object transition, View target, boolean exclude); 106 107 public void include(Object transition, int targetId); 108 109 public void include(Object transition, View targetView); 110 111 public void setStartDelay(Object transition, long startDelay); 112 113 public void setDuration(Object transition, long duration); 114 115 public void setInterpolator(Object transition, Object timeInterpolator); 116 117 } 118 119 /** 120 * Interface used when we do not support Transition animations. 121 */ 122 private static final class TransitionHelperStubImpl implements TransitionHelperVersionImpl { 123 124 private static class TransitionStub { 125 TransitionListener mTransitionListener; 126 } 127 128 @Override 129 public Object getSharedElementEnterTransition(Window window) { 130 return null; 131 } 132 133 @Override 134 public Object getSharedElementReturnTransition(Window window) { 135 return null; 136 } 137 138 @Override 139 public Object getSharedElementExitTransition(Window window) { 140 return null; 141 } 142 143 @Override 144 public Object getSharedElementReenterTransition(Window window) { 145 return null; 146 } 147 148 @Override 149 public Object getEnterTransition(Window window) { 150 return null; 151 } 152 153 @Override 154 public Object getReturnTransition(Window window) { 155 return null; 156 } 157 158 @Override 159 public Object getExitTransition(Window window) { 160 return null; 161 } 162 163 @Override 164 public Object getReenterTransition(Window window) { 165 return null; 166 } 167 168 @Override 169 public Object createScene(ViewGroup sceneRoot, Runnable r) { 170 return r; 171 } 172 173 @Override 174 public Object createAutoTransition() { 175 return new TransitionStub(); 176 } 177 178 @Override 179 public Object createFadeTransition(int fadingMode) { 180 return new TransitionStub(); 181 } 182 183 @Override 184 public Object createChangeBounds(boolean reparent) { 185 return new TransitionStub(); 186 } 187 188 @Override 189 public Object createSlide(SlideCallback callback) { 190 return new TransitionStub(); 191 } 192 193 @Override 194 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 195 } 196 197 @Override 198 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 199 } 200 201 @Override 202 public void setChangeBoundsStartDelay(Object changeBounds, String className, 203 int startDelay) { 204 } 205 206 @Override 207 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 208 } 209 210 @Override 211 public Object createTransitionSet(boolean sequential) { 212 return new TransitionStub(); 213 } 214 215 @Override 216 public void addTransition(Object transitionSet, Object transition) { 217 } 218 219 @Override 220 public void exclude(Object transition, int targetId, boolean exclude) { 221 } 222 223 @Override 224 public void exclude(Object transition, View targetView, boolean exclude) { 225 } 226 227 @Override 228 public void excludeChildren(Object transition, int targetId, boolean exclude) { 229 } 230 231 @Override 232 public void excludeChildren(Object transition, View targetView, boolean exclude) { 233 } 234 235 @Override 236 public void include(Object transition, int targetId) { 237 } 238 239 @Override 240 public void include(Object transition, View targetView) { 241 } 242 243 @Override 244 public void setStartDelay(Object transition, long startDelay) { 245 } 246 247 @Override 248 public void setDuration(Object transition, long duration) { 249 } 250 251 @Override 252 public void setTransitionListener(Object transition, TransitionListener listener) { 253 ((TransitionStub) transition).mTransitionListener = listener; 254 } 255 256 @Override 257 public void runTransition(Object scene, Object transition) { 258 TransitionStub transitionStub = (TransitionStub) transition; 259 if (transitionStub != null && transitionStub.mTransitionListener != null) { 260 transitionStub.mTransitionListener.onTransitionStart(transition); 261 } 262 Runnable r = ((Runnable) scene); 263 if (r != null) { 264 r.run(); 265 } 266 if (transitionStub != null && transitionStub.mTransitionListener != null) { 267 transitionStub.mTransitionListener.onTransitionEnd(transition); 268 } 269 } 270 271 @Override 272 public void setInterpolator(Object transition, Object timeInterpolator) { 273 } 274 } 275 276 /** 277 * Implementation used on KitKat (and above). 278 */ 279 private static class TransitionHelperKitkatImpl implements TransitionHelperVersionImpl { 280 private final TransitionHelperKitkat mTransitionHelper; 281 282 TransitionHelperKitkatImpl() { 283 mTransitionHelper = new TransitionHelperKitkat(); 284 } 285 286 @Override 287 public Object getSharedElementEnterTransition(Window window) { 288 return null; 289 } 290 291 @Override 292 public Object getSharedElementReturnTransition(Window window) { 293 return null; 294 } 295 296 @Override 297 public Object getSharedElementExitTransition(Window window) { 298 return null; 299 } 300 301 @Override 302 public Object getSharedElementReenterTransition(Window window) { 303 return null; 304 } 305 306 @Override 307 public Object getEnterTransition(Window window) { 308 return null; 309 } 310 311 @Override 312 public Object getReturnTransition(Window window) { 313 return null; 314 } 315 316 @Override 317 public Object getExitTransition(Window window) { 318 return null; 319 } 320 321 @Override 322 public Object getReenterTransition(Window window) { 323 return null; 324 } 325 326 @Override 327 public Object createScene(ViewGroup sceneRoot, Runnable r) { 328 return mTransitionHelper.createScene(sceneRoot, r); 329 } 330 331 @Override 332 public Object createAutoTransition() { 333 return mTransitionHelper.createAutoTransition(); 334 } 335 336 @Override 337 public Object createFadeTransition(int fadingMode) { 338 return mTransitionHelper.createFadeTransition(fadingMode); 339 } 340 341 @Override 342 public Object createChangeBounds(boolean reparent) { 343 return mTransitionHelper.createChangeBounds(reparent); 344 } 345 346 @Override 347 public Object createSlide(SlideCallback callback) { 348 return mTransitionHelper.createSlide(callback); 349 } 350 351 @Override 352 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 353 mTransitionHelper.setChangeBoundsStartDelay(changeBounds, view, startDelay); 354 } 355 356 @Override 357 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 358 mTransitionHelper.setChangeBoundsStartDelay(changeBounds, viewId, startDelay); 359 } 360 361 @Override 362 public void setChangeBoundsStartDelay(Object changeBounds, String className, 363 int startDelay) { 364 mTransitionHelper.setChangeBoundsStartDelay(changeBounds, className, startDelay); 365 } 366 367 @Override 368 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 369 mTransitionHelper.setChangeBoundsDefaultStartDelay(changeBounds, startDelay); 370 } 371 372 @Override 373 public Object createTransitionSet(boolean sequential) { 374 return mTransitionHelper.createTransitionSet(sequential); 375 } 376 377 @Override 378 public void addTransition(Object transitionSet, Object transition) { 379 mTransitionHelper.addTransition(transitionSet, transition); 380 } 381 382 @Override 383 public void exclude(Object transition, int targetId, boolean exclude) { 384 mTransitionHelper.exclude(transition, targetId, exclude); 385 } 386 387 @Override 388 public void exclude(Object transition, View targetView, boolean exclude) { 389 mTransitionHelper.exclude(transition, targetView, exclude); 390 } 391 392 @Override 393 public void excludeChildren(Object transition, int targetId, boolean exclude) { 394 mTransitionHelper.excludeChildren(transition, targetId, exclude); 395 } 396 397 @Override 398 public void excludeChildren(Object transition, View targetView, boolean exclude) { 399 mTransitionHelper.excludeChildren(transition, targetView, exclude); 400 } 401 402 @Override 403 public void include(Object transition, int targetId) { 404 mTransitionHelper.include(transition, targetId); 405 } 406 407 @Override 408 public void include(Object transition, View targetView) { 409 mTransitionHelper.include(transition, targetView); 410 } 411 412 @Override 413 public void setStartDelay(Object transition, long startDelay) { 414 mTransitionHelper.setStartDelay(transition, startDelay); 415 } 416 417 @Override 418 public void setDuration(Object transition, long duration) { 419 mTransitionHelper.setDuration(transition, duration); 420 } 421 422 @Override 423 public void setTransitionListener(Object transition, TransitionListener listener) { 424 mTransitionHelper.setTransitionListener(transition, listener); 425 } 426 427 @Override 428 public void runTransition(Object scene, Object transition) { 429 mTransitionHelper.runTransition(scene, transition); 430 } 431 432 @Override 433 public void setInterpolator(Object transition, Object timeInterpolator) { 434 mTransitionHelper.setInterpolator(transition, timeInterpolator); 435 } 436 } 437 438 private static final class TransitionHelperApi21Impl extends TransitionHelperKitkatImpl { 439 private final TransitionHelperApi21 mTransitionHelper; 440 441 TransitionHelperApi21Impl() { 442 mTransitionHelper = new TransitionHelperApi21(); 443 } 444 445 @Override 446 public Object getSharedElementEnterTransition(Window window) { 447 return mTransitionHelper.getSharedElementEnterTransition(window); 448 } 449 450 @Override 451 public Object getSharedElementReturnTransition(Window window) { 452 return mTransitionHelper.getSharedElementReturnTransition(window); 453 } 454 455 @Override 456 public Object getSharedElementExitTransition(Window window) { 457 return mTransitionHelper.getSharedElementExitTransition(window); 458 } 459 460 @Override 461 public Object getSharedElementReenterTransition(Window window) { 462 return mTransitionHelper.getSharedElementReenterTransition(window); 463 } 464 465 @Override 466 public Object getEnterTransition(Window window) { 467 return mTransitionHelper.getEnterTransition(window); 468 } 469 470 @Override 471 public Object getReturnTransition(Window window) { 472 return mTransitionHelper.getReturnTransition(window); 473 } 474 475 @Override 476 public Object getExitTransition(Window window) { 477 return mTransitionHelper.getExitTransition(window); 478 } 479 480 @Override 481 public Object getReenterTransition(Window window) { 482 return mTransitionHelper.getReenterTransition(window); 483 } 484 } 485 486 /** 487 * Returns the TransitionHelper that can be used to perform Transition 488 * animations. 489 */ 490 public static TransitionHelper getInstance() { 491 return sHelper; 492 } 493 494 private TransitionHelper() { 495 if ("L".equals(Build.VERSION.RELEASE)) { 496 mImpl = new TransitionHelperApi21Impl(); 497 } else if (systemSupportsTransitions()) { 498 mImpl = new TransitionHelperKitkatImpl(); 499 } else { 500 mImpl = new TransitionHelperStubImpl(); 501 } 502 } 503 504 public Object getSharedElementEnterTransition(Window window) { 505 return mImpl.getSharedElementEnterTransition(window); 506 } 507 508 public Object getSharedElementReturnTransition(Window window) { 509 return mImpl.getSharedElementReturnTransition(window); 510 } 511 512 public Object getSharedElementExitTransition(Window window) { 513 return mImpl.getSharedElementExitTransition(window); 514 } 515 516 public Object getSharedElementReenterTransition(Window window) { 517 return mImpl.getSharedElementReenterTransition(window); 518 } 519 520 public Object getEnterTransition(Window window) { 521 return mImpl.getEnterTransition(window); 522 } 523 524 public Object getReturnTransition(Window window) { 525 return mImpl.getReturnTransition(window); 526 } 527 528 public Object getExitTransition(Window window) { 529 return mImpl.getExitTransition(window); 530 } 531 532 public Object getReenterTransition(Window window) { 533 return mImpl.getReenterTransition(window); 534 } 535 536 public Object createScene(ViewGroup sceneRoot, Runnable r) { 537 return mImpl.createScene(sceneRoot, r); 538 } 539 540 public Object createChangeBounds(boolean reparent) { 541 return mImpl.createChangeBounds(reparent); 542 } 543 544 public void setChangeBoundsStartDelay(Object changeBounds, View view, int startDelay) { 545 mImpl.setChangeBoundsStartDelay(changeBounds, view, startDelay); 546 } 547 548 public void setChangeBoundsStartDelay(Object changeBounds, int viewId, int startDelay) { 549 mImpl.setChangeBoundsStartDelay(changeBounds, viewId, startDelay); 550 } 551 552 public void setChangeBoundsStartDelay(Object changeBounds, String className, int startDelay) { 553 mImpl.setChangeBoundsStartDelay(changeBounds, className, startDelay); 554 } 555 556 public void setChangeBoundsDefaultStartDelay(Object changeBounds, int startDelay) { 557 mImpl.setChangeBoundsDefaultStartDelay(changeBounds, startDelay); 558 } 559 560 public Object createTransitionSet(boolean sequential) { 561 return mImpl.createTransitionSet(sequential); 562 } 563 564 public Object createSlide(SlideCallback callback) { 565 return mImpl.createSlide(callback); 566 } 567 568 public void addTransition(Object transitionSet, Object transition) { 569 mImpl.addTransition(transitionSet, transition); 570 } 571 572 public void exclude(Object transition, int targetId, boolean exclude) { 573 mImpl.exclude(transition, targetId, exclude); 574 } 575 576 public void exclude(Object transition, View targetView, boolean exclude) { 577 mImpl.exclude(transition, targetView, exclude); 578 } 579 580 public void excludeChildren(Object transition, int targetId, boolean exclude) { 581 mImpl.excludeChildren(transition, targetId, exclude); 582 } 583 584 public void excludeChildren(Object transition, View targetView, boolean exclude) { 585 mImpl.excludeChildren(transition, targetView, exclude); 586 } 587 588 public void include(Object transition, int targetId) { 589 mImpl.include(transition, targetId); 590 } 591 592 public void include(Object transition, View targetView) { 593 mImpl.include(transition, targetView); 594 } 595 596 public void setStartDelay(Object transition, long startDelay) { 597 mImpl.setStartDelay(transition, startDelay); 598 } 599 600 public void setDuration(Object transition, long duration) { 601 mImpl.setDuration(transition, duration); 602 } 603 604 public Object createAutoTransition() { 605 return mImpl.createAutoTransition(); 606 } 607 608 public Object createFadeTransition(int fadeMode) { 609 return mImpl.createFadeTransition(fadeMode); 610 } 611 612 public void setTransitionListener(Object transition, TransitionListener listener) { 613 mImpl.setTransitionListener(transition, listener); 614 } 615 616 public void runTransition(Object scene, Object transition) { 617 mImpl.runTransition(scene, transition); 618 } 619 620 public void setInterpolator(Object transition, Object timeInterpolator) { 621 mImpl.setInterpolator(transition, timeInterpolator); 622 } 623} 624