136c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav/*
236c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * Copyright (C) 2015 The Android Open Source Project
336c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav *
436c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * Licensed under the Apache License, Version 2.0 (the "License");
536c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * you may not use this file except in compliance with the License.
636c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * You may obtain a copy of the License at
736c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav *
836c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav *      http://www.apache.org/licenses/LICENSE-2.0
936c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav *
1036c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * Unless required by applicable law or agreed to in writing, software
1136c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * distributed under the License is distributed on an "AS IS" BASIS,
1236c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1336c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * See the License for the specific language governing permissions and
1436c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav * limitations under the License.
1536c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav */
1636c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav
1736c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslavpackage android.support.v4.app;
1836c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav
1936c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslavimport android.app.Activity;
200d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport android.app.SharedElementCallback;
210d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport android.content.Context;
220d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport android.graphics.Matrix;
230d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport android.graphics.RectF;
240d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport android.os.Parcelable;
250d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport android.view.View;
260d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
270d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport java.util.List;
280d5b0e011d7db522a576450593cf38170b997501Abhinav Baidimport java.util.Map;
2936c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav
3036c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslavclass ActivityCompatApi23 {
310d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    public interface OnSharedElementsReadyListenerBridge {
320d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        void onSharedElementsReady();
330d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    }
340d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
35e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav    public interface RequestPermissionsRequestCodeValidator {
360d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        void validateRequestPermissionsRequestCode(int requestCode);
37e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav    }
3836c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav
3936c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav    public static void requestPermissions(Activity activity, String[] permissions,
4036c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav            int requestCode) {
41e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav        if (activity instanceof RequestPermissionsRequestCodeValidator) {
42e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav            ((RequestPermissionsRequestCodeValidator) activity)
43e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav                    .validateRequestPermissionsRequestCode(requestCode);
44e1e957f536c20ebe2a7e6c417ccb2fd8f7fa845bSvetoslav        }
4536c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav        activity.requestPermissions(permissions, requestCode);
4636c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav    }
4736c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav
4836c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav    public static boolean shouldShowRequestPermissionRationale(Activity activity,
4936c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav            String permission) {
5036c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav        return activity.shouldShowRequestPermissionRationale(permission);
5136c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav    }
520d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
530d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    public static void setEnterSharedElementCallback(Activity activity,
540d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            SharedElementCallback23 callback) {
550d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        activity.setEnterSharedElementCallback(createCallback(callback));
560d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    }
570d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
580d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    public static void setExitSharedElementCallback(Activity activity,
590d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            SharedElementCallback23 callback) {
600d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        activity.setExitSharedElementCallback(createCallback(callback));
610d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    }
620d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
630d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    private static SharedElementCallback createCallback(SharedElementCallback23 callback) {
640d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        SharedElementCallback newListener = null;
650d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        if (callback != null) {
660d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            newListener = new SharedElementCallbackImpl(callback);
670d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
680d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        return newListener;
690d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    }
700d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
710d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    public abstract static class SharedElementCallback23
721194904b0540cb2043dd047206abf7592f31c2f4Alan Viverette            extends ActivityCompatApi21.SharedElementCallback21 {
730d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public abstract void onSharedElementsArrived(List<String> sharedElementNames,
740d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                List<View> sharedElements, OnSharedElementsReadyListenerBridge listener);
750d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    }
760d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
770d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    private static class SharedElementCallbackImpl extends SharedElementCallback {
780d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        private SharedElementCallback23 mCallback;
790d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
800d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public SharedElementCallbackImpl(SharedElementCallback23 callback) {
810d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            mCallback = callback;
820d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
830d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
840d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        @Override
850d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public void onSharedElementStart(List<String> sharedElementNames,
860d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                List<View> sharedElements, List<View> sharedElementSnapshots) {
870d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            mCallback.onSharedElementStart(sharedElementNames, sharedElements,
880d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                    sharedElementSnapshots);
890d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
900d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
910d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        @Override
920d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public void onSharedElementEnd(List<String> sharedElementNames, List<View> sharedElements,
930d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                List<View> sharedElementSnapshots) {
940d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            mCallback.onSharedElementEnd(sharedElementNames, sharedElements,
950d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                    sharedElementSnapshots);
960d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
970d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
980d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        @Override
990d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public void onRejectSharedElements(List<View> rejectedSharedElements) {
1000d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            mCallback.onRejectSharedElements(rejectedSharedElements);
1010d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
1020d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
1030d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        @Override
1040d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
1050d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            mCallback.onMapSharedElements(names, sharedElements);
1060d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
1070d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
1080d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        @Override
1090d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public Parcelable onCaptureSharedElementSnapshot(View sharedElement,
1100d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                Matrix viewToGlobalMatrix, RectF screenBounds) {
1110d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            return mCallback.onCaptureSharedElementSnapshot(sharedElement, viewToGlobalMatrix,
1120d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                            screenBounds);
1130d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
1140d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
1150d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        @Override
1160d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public View onCreateSnapshotView(Context context, Parcelable snapshot) {
1170d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            return mCallback.onCreateSnapshotView(context, snapshot);
1180d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
1190d5b0e011d7db522a576450593cf38170b997501Abhinav Baid
1200d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        @Override
1210d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        public void onSharedElementsArrived(List<String> sharedElementNames,
1220d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                List<View> sharedElements, final OnSharedElementsReadyListener listener) {
1230d5b0e011d7db522a576450593cf38170b997501Abhinav Baid            mCallback.onSharedElementsArrived(sharedElementNames, sharedElements,
1240d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                    new OnSharedElementsReadyListenerBridge() {
1250d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                        @Override
1260d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                        public void onSharedElementsReady() {
1270d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                            listener.onSharedElementsReady();
1280d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                        }
1290d5b0e011d7db522a576450593cf38170b997501Abhinav Baid                    });
1300d5b0e011d7db522a576450593cf38170b997501Abhinav Baid        }
1310d5b0e011d7db522a576450593cf38170b997501Abhinav Baid    }
13236c328cb8d2b86ce99c9e7c7382478b2b496bdd3Svetoslav}
133