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