/* * Copyright 2018 Allan Wang * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ca.allanwang.kau.utils import android.annotation.SuppressLint import android.app.Activity import android.app.ActivityOptions import android.content.Context import android.os.Bundle import android.os.Parcelable import android.util.Pair import android.view.View import androidx.annotation.AnimRes import ca.allanwang.kau.R import java.io.Serializable /** * Created by Allan Wang on 10/12/17. */ /** * Similar to [Bundle.putAll], but checks for a null insert and returns the parent bundle */ infix fun Bundle.with(bundle: Bundle?): Bundle { if (bundle != null) putAll(bundle) return this } /** * Saves all bundle args based on their respective types. * * Taken courtesy of Anko * * Previously, Anko was a dependency in KAU, but has been removed on 12/24/2018 * as most of the methods weren't used */ fun bundleOf(vararg params: kotlin.Pair): Bundle { val b = Bundle() for (p in params) { val (k, v) = p when (v) { null -> b.putSerializable(k, null) is Boolean -> b.putBoolean(k, v) is Byte -> b.putByte(k, v) is Char -> b.putChar(k, v) is Short -> b.putShort(k, v) is Int -> b.putInt(k, v) is Long -> b.putLong(k, v) is Float -> b.putFloat(k, v) is Double -> b.putDouble(k, v) is String -> b.putString(k, v) is CharSequence -> b.putCharSequence(k, v) is Parcelable -> b.putParcelable(k, v) is Serializable -> b.putSerializable(k, v) is BooleanArray -> b.putBooleanArray(k, v) is ByteArray -> b.putByteArray(k, v) is CharArray -> b.putCharArray(k, v) is DoubleArray -> b.putDoubleArray(k, v) is FloatArray -> b.putFloatArray(k, v) is IntArray -> b.putIntArray(k, v) is LongArray -> b.putLongArray(k, v) is Array<*> -> { @Suppress("UNCHECKED_CAST") when { v.isArrayOf() -> b.putParcelableArray(k, v as Array) v.isArrayOf() -> b.putCharSequenceArray(k, v as Array) v.isArrayOf() -> b.putStringArray(k, v as Array) else -> throw KauException("Unsupported bundle component (${v.javaClass})") } } is ShortArray -> b.putShortArray(k, v) is Bundle -> b.putBundle(k, v) else -> throw KauException("Unsupported bundle component (${v.javaClass})") } } return b } /** * Given the parent view and map of view ids to tags, * create a scene transition animation */ fun Bundle.withSceneTransitionAnimation(parent: View, data: Map) = withSceneTransitionAnimation( parent.context, data.mapKeys { (id, _) -> parent.findViewById(id) } ) /** * Given a mapping of views to tags, * create a scene transition animation */ @SuppressLint("NewApi") fun Bundle.withSceneTransitionAnimation(context: Context, data: Map = emptyMap()) { if (context !is Activity || !buildIsLollipopAndUp) return val options = ActivityOptions.makeSceneTransitionAnimation( context, *data.map { (view, tag) -> Pair(view, tag) }.toTypedArray() ) putAll(options.toBundle()) } fun Bundle.withCustomAnimation( context: Context, @AnimRes enterResId: Int, @AnimRes exitResId: Int ) { this with ActivityOptions.makeCustomAnimation( context, enterResId, exitResId ).toBundle() } fun Bundle.withSlideIn(context: Context) = withCustomAnimation( context, R.anim.kau_slide_in_right, R.anim.kau_fade_out ) fun Bundle.withSlideOut(context: Context) = withCustomAnimation( context, R.anim.kau_fade_in, R.anim.kau_slide_out_right_top ) fun Bundle.withFade(context: Context) = withCustomAnimation( context, android.R.anim.fade_in, android.R.anim.fade_out )