150ce74b0963de66b294761c045428562d946b65aYuichi Araki/* 250ce74b0963de66b294761c045428562d946b65aYuichi Araki * Copyright (C) 2017 The Android Open Source Project 350ce74b0963de66b294761c045428562d946b65aYuichi Araki * 450ce74b0963de66b294761c045428562d946b65aYuichi Araki * Licensed under the Apache License, Version 2.0 (the "License"); 550ce74b0963de66b294761c045428562d946b65aYuichi Araki * you may not use this file except in compliance with the License. 650ce74b0963de66b294761c045428562d946b65aYuichi Araki * You may obtain a copy of the License at 750ce74b0963de66b294761c045428562d946b65aYuichi Araki * 850ce74b0963de66b294761c045428562d946b65aYuichi Araki * http://www.apache.org/licenses/LICENSE-2.0 950ce74b0963de66b294761c045428562d946b65aYuichi Araki * 1050ce74b0963de66b294761c045428562d946b65aYuichi Araki * Unless required by applicable law or agreed to in writing, software 1150ce74b0963de66b294761c045428562d946b65aYuichi Araki * distributed under the License is distributed on an "AS IS" BASIS, 1250ce74b0963de66b294761c045428562d946b65aYuichi Araki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350ce74b0963de66b294761c045428562d946b65aYuichi Araki * See the License for the specific language governing permissions and 1450ce74b0963de66b294761c045428562d946b65aYuichi Araki * limitations under the License. 1550ce74b0963de66b294761c045428562d946b65aYuichi Araki */ 1650ce74b0963de66b294761c045428562d946b65aYuichi Araki 17ac5fe7c617c66850fff75a9fce9979c6e5674b0fAurimas Liutikaspackage androidx.transition; 1850ce74b0963de66b294761c045428562d946b65aYuichi Araki 1950ce74b0963de66b294761c045428562d946b65aYuichi Arakiimport android.graphics.Matrix; 2050ce74b0963de66b294761c045428562d946b65aYuichi Arakiimport android.util.Log; 2150ce74b0963de66b294761c045428562d946b65aYuichi Arakiimport android.view.View; 2250ce74b0963de66b294761c045428562d946b65aYuichi Araki 234d1d6a17310a57807dabb3f404715cfe43a90ed0Aurimas Liutikasimport androidx.annotation.NonNull; 244d1d6a17310a57807dabb3f404715cfe43a90ed0Aurimas Liutikasimport androidx.annotation.RequiresApi; 254d1d6a17310a57807dabb3f404715cfe43a90ed0Aurimas Liutikas 2650ce74b0963de66b294761c045428562d946b65aYuichi Arakiimport java.lang.reflect.InvocationTargetException; 2750ce74b0963de66b294761c045428562d946b65aYuichi Arakiimport java.lang.reflect.Method; 2850ce74b0963de66b294761c045428562d946b65aYuichi Araki 2950ce74b0963de66b294761c045428562d946b65aYuichi Araki@RequiresApi(21) 3050ce74b0963de66b294761c045428562d946b65aYuichi Arakiclass ViewUtilsApi21 extends ViewUtilsApi19 { 3150ce74b0963de66b294761c045428562d946b65aYuichi Araki 3250ce74b0963de66b294761c045428562d946b65aYuichi Araki private static final String TAG = "ViewUtilsApi21"; 3350ce74b0963de66b294761c045428562d946b65aYuichi Araki 3450ce74b0963de66b294761c045428562d946b65aYuichi Araki private static Method sTransformMatrixToGlobalMethod; 3550ce74b0963de66b294761c045428562d946b65aYuichi Araki private static boolean sTransformMatrixToGlobalMethodFetched; 3650ce74b0963de66b294761c045428562d946b65aYuichi Araki private static Method sTransformMatrixToLocalMethod; 3750ce74b0963de66b294761c045428562d946b65aYuichi Araki private static boolean sTransformMatrixToLocalMethodFetched; 3850ce74b0963de66b294761c045428562d946b65aYuichi Araki private static Method sSetAnimationMatrixMethod; 3950ce74b0963de66b294761c045428562d946b65aYuichi Araki private static boolean sSetAnimationMatrixMethodFetched; 4050ce74b0963de66b294761c045428562d946b65aYuichi Araki 4150ce74b0963de66b294761c045428562d946b65aYuichi Araki @Override 4250ce74b0963de66b294761c045428562d946b65aYuichi Araki public void transformMatrixToGlobal(@NonNull View view, @NonNull Matrix matrix) { 4350ce74b0963de66b294761c045428562d946b65aYuichi Araki fetchTransformMatrixToGlobalMethod(); 4450ce74b0963de66b294761c045428562d946b65aYuichi Araki if (sTransformMatrixToGlobalMethod != null) { 4550ce74b0963de66b294761c045428562d946b65aYuichi Araki try { 4650ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToGlobalMethod.invoke(view, matrix); 4750ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (IllegalAccessException e) { 4850ce74b0963de66b294761c045428562d946b65aYuichi Araki // Do nothing 4950ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (InvocationTargetException e) { 5050ce74b0963de66b294761c045428562d946b65aYuichi Araki throw new RuntimeException(e.getCause()); 5150ce74b0963de66b294761c045428562d946b65aYuichi Araki } 5250ce74b0963de66b294761c045428562d946b65aYuichi Araki } 5350ce74b0963de66b294761c045428562d946b65aYuichi Araki } 5450ce74b0963de66b294761c045428562d946b65aYuichi Araki 5550ce74b0963de66b294761c045428562d946b65aYuichi Araki @Override 5650ce74b0963de66b294761c045428562d946b65aYuichi Araki public void transformMatrixToLocal(@NonNull View view, @NonNull Matrix matrix) { 5750ce74b0963de66b294761c045428562d946b65aYuichi Araki fetchTransformMatrixToLocalMethod(); 5850ce74b0963de66b294761c045428562d946b65aYuichi Araki if (sTransformMatrixToLocalMethod != null) { 5950ce74b0963de66b294761c045428562d946b65aYuichi Araki try { 6050ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToLocalMethod.invoke(view, matrix); 6150ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (IllegalAccessException e) { 6250ce74b0963de66b294761c045428562d946b65aYuichi Araki // Do nothing 6350ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (InvocationTargetException e) { 6450ce74b0963de66b294761c045428562d946b65aYuichi Araki throw new RuntimeException(e.getCause()); 6550ce74b0963de66b294761c045428562d946b65aYuichi Araki } 6650ce74b0963de66b294761c045428562d946b65aYuichi Araki } 6750ce74b0963de66b294761c045428562d946b65aYuichi Araki } 6850ce74b0963de66b294761c045428562d946b65aYuichi Araki 6950ce74b0963de66b294761c045428562d946b65aYuichi Araki @Override 7050ce74b0963de66b294761c045428562d946b65aYuichi Araki public void setAnimationMatrix(@NonNull View view, Matrix matrix) { 7150ce74b0963de66b294761c045428562d946b65aYuichi Araki fetchSetAnimationMatrix(); 7250ce74b0963de66b294761c045428562d946b65aYuichi Araki if (sSetAnimationMatrixMethod != null) { 7350ce74b0963de66b294761c045428562d946b65aYuichi Araki try { 7450ce74b0963de66b294761c045428562d946b65aYuichi Araki sSetAnimationMatrixMethod.invoke(view, matrix); 7550ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (InvocationTargetException e) { 7650ce74b0963de66b294761c045428562d946b65aYuichi Araki // Do nothing 7750ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (IllegalAccessException e) { 7850ce74b0963de66b294761c045428562d946b65aYuichi Araki throw new RuntimeException(e.getCause()); 7950ce74b0963de66b294761c045428562d946b65aYuichi Araki } 8050ce74b0963de66b294761c045428562d946b65aYuichi Araki } 8150ce74b0963de66b294761c045428562d946b65aYuichi Araki } 8250ce74b0963de66b294761c045428562d946b65aYuichi Araki 8350ce74b0963de66b294761c045428562d946b65aYuichi Araki private void fetchTransformMatrixToGlobalMethod() { 8450ce74b0963de66b294761c045428562d946b65aYuichi Araki if (!sTransformMatrixToGlobalMethodFetched) { 8550ce74b0963de66b294761c045428562d946b65aYuichi Araki try { 8650ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToGlobalMethod = View.class.getDeclaredMethod( 8750ce74b0963de66b294761c045428562d946b65aYuichi Araki "transformMatrixToGlobal", Matrix.class); 8850ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToGlobalMethod.setAccessible(true); 8950ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (NoSuchMethodException e) { 9050ce74b0963de66b294761c045428562d946b65aYuichi Araki Log.i(TAG, "Failed to retrieve transformMatrixToGlobal method", e); 9150ce74b0963de66b294761c045428562d946b65aYuichi Araki } 9250ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToGlobalMethodFetched = true; 9350ce74b0963de66b294761c045428562d946b65aYuichi Araki } 9450ce74b0963de66b294761c045428562d946b65aYuichi Araki } 9550ce74b0963de66b294761c045428562d946b65aYuichi Araki 9650ce74b0963de66b294761c045428562d946b65aYuichi Araki private void fetchTransformMatrixToLocalMethod() { 9750ce74b0963de66b294761c045428562d946b65aYuichi Araki if (!sTransformMatrixToLocalMethodFetched) { 9850ce74b0963de66b294761c045428562d946b65aYuichi Araki try { 9950ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToLocalMethod = View.class.getDeclaredMethod( 10050ce74b0963de66b294761c045428562d946b65aYuichi Araki "transformMatrixToLocal", Matrix.class); 10150ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToLocalMethod.setAccessible(true); 10250ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (NoSuchMethodException e) { 10350ce74b0963de66b294761c045428562d946b65aYuichi Araki Log.i(TAG, "Failed to retrieve transformMatrixToLocal method", e); 10450ce74b0963de66b294761c045428562d946b65aYuichi Araki } 10550ce74b0963de66b294761c045428562d946b65aYuichi Araki sTransformMatrixToLocalMethodFetched = true; 10650ce74b0963de66b294761c045428562d946b65aYuichi Araki } 10750ce74b0963de66b294761c045428562d946b65aYuichi Araki } 10850ce74b0963de66b294761c045428562d946b65aYuichi Araki 10950ce74b0963de66b294761c045428562d946b65aYuichi Araki private void fetchSetAnimationMatrix() { 11050ce74b0963de66b294761c045428562d946b65aYuichi Araki if (!sSetAnimationMatrixMethodFetched) { 11150ce74b0963de66b294761c045428562d946b65aYuichi Araki try { 11250ce74b0963de66b294761c045428562d946b65aYuichi Araki sSetAnimationMatrixMethod = View.class.getDeclaredMethod( 11350ce74b0963de66b294761c045428562d946b65aYuichi Araki "setAnimationMatrix", Matrix.class); 11450ce74b0963de66b294761c045428562d946b65aYuichi Araki sSetAnimationMatrixMethod.setAccessible(true); 11550ce74b0963de66b294761c045428562d946b65aYuichi Araki } catch (NoSuchMethodException e) { 11650ce74b0963de66b294761c045428562d946b65aYuichi Araki Log.i(TAG, "Failed to retrieve setAnimationMatrix method", e); 11750ce74b0963de66b294761c045428562d946b65aYuichi Araki } 11850ce74b0963de66b294761c045428562d946b65aYuichi Araki sSetAnimationMatrixMethodFetched = true; 11950ce74b0963de66b294761c045428562d946b65aYuichi Araki } 12050ce74b0963de66b294761c045428562d946b65aYuichi Araki } 12150ce74b0963de66b294761c045428562d946b65aYuichi Araki 12250ce74b0963de66b294761c045428562d946b65aYuichi Araki} 123