TransitionKitKat.java revision c876cd8f9334e2423de00836009f3fd7a9566938
1/* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 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 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 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. 15 */ 16 17package android.support.transition; 18 19import android.animation.Animator; 20import android.animation.TimeInterpolator; 21import android.transition.Transition; 22import android.view.View; 23import android.view.ViewGroup; 24 25import java.util.ArrayList; 26import java.util.List; 27 28class TransitionKitKat extends TransitionImpl { 29 30 /* package */ android.transition.Transition mTransition; 31 32 private TransitionInterface mExternalTransition; 33 34 private CompatListener mCompatListener; 35 36 private static void copyValues(android.transition.TransitionValues source, 37 android.support.transition.TransitionValues dest) { 38 if (source == null) { 39 return; 40 } 41 dest.view = source.view; 42 if (source.values.size() > 0) { 43 dest.values.putAll(source.values); 44 } 45 } 46 47 private static void copyValues(android.support.transition.TransitionValues source, 48 android.transition.TransitionValues dest) { 49 if (source == null) { 50 return; 51 } 52 dest.view = source.view; 53 if (source.values.size() > 0) { 54 dest.values.putAll(source.values); 55 } 56 } 57 58 @Override 59 public void init(TransitionInterface external, Object internal) { 60 mExternalTransition = external; 61 if (internal == null) { 62 mTransition = new TransitionWrapper(external); 63 } else { 64 mTransition = (android.transition.Transition) internal; 65 } 66 } 67 68 @Override 69 public TransitionImpl addListener(TransitionInterfaceListener listener) { 70 if (mCompatListener == null) { 71 mCompatListener = new CompatListener(); 72 mTransition.addListener(mCompatListener); 73 } 74 mCompatListener.addListener(listener); 75 return this; 76 } 77 78 @Override 79 public TransitionImpl removeListener(TransitionInterfaceListener listener) { 80 if (mCompatListener == null) { 81 return this; 82 } 83 mCompatListener.removeListener(listener); 84 if (mCompatListener.isEmpty()) { 85 mTransition.removeListener(mCompatListener); 86 mCompatListener = null; 87 } 88 return this; 89 } 90 91 @Override 92 public TransitionImpl addTarget(View target) { 93 mTransition.addTarget(target); 94 return this; 95 } 96 97 @Override 98 public TransitionImpl addTarget(int targetId) { 99 mTransition.addTarget(targetId); 100 return this; 101 } 102 103 @Override 104 public void captureEndValues(TransitionValues transitionValues) { 105 android.transition.TransitionValues internalValues = 106 new android.transition.TransitionValues(); 107 copyValues(transitionValues, internalValues); 108 mTransition.captureEndValues(internalValues); 109 copyValues(internalValues, transitionValues); 110 } 111 112 @Override 113 public void captureStartValues(TransitionValues transitionValues) { 114 android.transition.TransitionValues internalValues = 115 new android.transition.TransitionValues(); 116 copyValues(transitionValues, internalValues); 117 mTransition.captureStartValues(internalValues); 118 copyValues(internalValues, transitionValues); 119 } 120 121 @Override 122 public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, 123 TransitionValues endValues) { 124 android.transition.TransitionValues internalStartValues; 125 android.transition.TransitionValues internalEndValues; 126 if (startValues != null) { 127 internalStartValues = new android.transition.TransitionValues(); 128 copyValues(startValues, internalStartValues); 129 } else { 130 internalStartValues = null; 131 } 132 if (endValues != null) { 133 internalEndValues = new android.transition.TransitionValues(); 134 copyValues(endValues, internalEndValues); 135 } else { 136 internalEndValues = null; 137 } 138 return mTransition.createAnimator(sceneRoot, internalStartValues, internalEndValues); 139 } 140 141 @Override 142 public TransitionImpl excludeChildren(View target, boolean exclude) { 143 mTransition.excludeChildren(target, exclude); 144 return this; 145 } 146 147 @Override 148 public TransitionImpl excludeChildren(int targetId, boolean exclude) { 149 mTransition.excludeChildren(targetId, exclude); 150 return this; 151 } 152 153 @Override 154 public TransitionImpl excludeChildren(Class type, boolean exclude) { 155 mTransition.excludeChildren(type, exclude); 156 return this; 157 } 158 159 @Override 160 public TransitionImpl excludeTarget(View target, boolean exclude) { 161 mTransition.excludeTarget(target, exclude); 162 return this; 163 } 164 165 @Override 166 public TransitionImpl excludeTarget(int targetId, boolean exclude) { 167 mTransition.excludeTarget(targetId, exclude); 168 return this; 169 } 170 171 @Override 172 public TransitionImpl excludeTarget(Class type, boolean exclude) { 173 mTransition.excludeTarget(type, exclude); 174 return this; 175 } 176 177 @Override 178 public long getDuration() { 179 return mTransition.getDuration(); 180 } 181 182 @Override 183 public TransitionImpl setDuration(long duration) { 184 mTransition.setDuration(duration); 185 return this; 186 } 187 188 @Override 189 public TimeInterpolator getInterpolator() { 190 return mTransition.getInterpolator(); 191 } 192 193 @Override 194 public TransitionImpl setInterpolator(TimeInterpolator interpolator) { 195 mTransition.setInterpolator(interpolator); 196 return this; 197 } 198 199 @Override 200 public String getName() { 201 return mTransition.getName(); 202 } 203 204 @Override 205 public long getStartDelay() { 206 return mTransition.getStartDelay(); 207 } 208 209 @Override 210 public TransitionImpl setStartDelay(long startDelay) { 211 mTransition.setStartDelay(startDelay); 212 return this; 213 } 214 215 @Override 216 public List<Integer> getTargetIds() { 217 return mTransition.getTargetIds(); 218 } 219 220 @Override 221 public List<View> getTargets() { 222 return mTransition.getTargets(); 223 } 224 225 @Override 226 public String[] getTransitionProperties() { 227 return mTransition.getTransitionProperties(); 228 } 229 230 @Override 231 public TransitionValues getTransitionValues(View view, boolean start) { 232 TransitionValues values = new TransitionValues(); 233 copyValues(mTransition.getTransitionValues(view, start), values); 234 return values; 235 } 236 237 @Override 238 public TransitionImpl removeTarget(View target) { 239 mTransition.removeTarget(target); 240 return this; 241 } 242 243 @Override 244 public TransitionImpl removeTarget(int targetId) { 245 mTransition.removeTarget(targetId); 246 return this; 247 } 248 249 @Override 250 public String toString() { 251 return mTransition.toString(); 252 } 253 254 private static class TransitionWrapper extends android.transition.Transition { 255 256 private TransitionInterface mTransition; 257 258 public TransitionWrapper(TransitionInterface transition) { 259 mTransition = transition; 260 } 261 262 @Override 263 public void captureStartValues(android.transition.TransitionValues transitionValues) { 264 android.support.transition.TransitionValues externalValues = 265 new android.support.transition.TransitionValues(); 266 copyValues(transitionValues, externalValues); 267 mTransition.captureStartValues(externalValues); 268 copyValues(externalValues, transitionValues); 269 } 270 271 @Override 272 public void captureEndValues(android.transition.TransitionValues transitionValues) { 273 android.support.transition.TransitionValues externalValues = 274 new android.support.transition.TransitionValues(); 275 copyValues(transitionValues, externalValues); 276 mTransition.captureEndValues(externalValues); 277 copyValues(externalValues, transitionValues); 278 } 279 280 @Override 281 public Animator createAnimator(ViewGroup sceneRoot, 282 android.transition.TransitionValues startValues, 283 android.transition.TransitionValues endValues) { 284 android.support.transition.TransitionValues externalStartValues; 285 android.support.transition.TransitionValues externalEndValues; 286 if (startValues != null) { 287 externalStartValues = new android.support.transition.TransitionValues(); 288 copyValues(startValues, externalStartValues); 289 } else { 290 externalStartValues = null; 291 } 292 if (endValues != null) { 293 externalEndValues = new android.support.transition.TransitionValues(); 294 copyValues(endValues, externalEndValues); 295 } else { 296 externalEndValues = null; 297 } 298 return mTransition.createAnimator(sceneRoot, externalStartValues, 299 externalEndValues); 300 } 301 302 } 303 304 @SuppressWarnings("unchecked") 305 private class CompatListener implements android.transition.Transition.TransitionListener { 306 307 private final ArrayList<TransitionInterfaceListener> mListeners = new ArrayList<>(); 308 309 private void addListener(TransitionInterfaceListener listener) { 310 mListeners.add(listener); 311 } 312 313 private void removeListener(TransitionInterfaceListener listener) { 314 mListeners.remove(listener); 315 } 316 317 private boolean isEmpty() { 318 return mListeners.isEmpty(); 319 } 320 321 @Override 322 public void onTransitionStart(Transition transition) { 323 for (TransitionInterfaceListener listener : mListeners) { 324 listener.onTransitionStart(mExternalTransition); 325 } 326 } 327 328 @Override 329 public void onTransitionEnd(Transition transition) { 330 for (TransitionInterfaceListener listener : mListeners) { 331 listener.onTransitionEnd(mExternalTransition); 332 } 333 } 334 335 @Override 336 public void onTransitionCancel(Transition transition) { 337 for (TransitionInterfaceListener listener : mListeners) { 338 listener.onTransitionCancel(mExternalTransition); 339 } 340 } 341 342 @Override 343 public void onTransitionPause(Transition transition) { 344 for (TransitionInterfaceListener listener : mListeners) { 345 listener.onTransitionPause(mExternalTransition); 346 } 347 } 348 349 @Override 350 public void onTransitionResume(Transition transition) { 351 for (TransitionInterfaceListener listener : mListeners) { 352 listener.onTransitionResume(mExternalTransition); 353 } 354 } 355 356 } 357 358} 359