/* * Copyright (C) 2016 Jorge Ruesga * * 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 com.ruesga.android.wallpapers.photophase.borders; import android.content.Context; import android.media.effect.EffectContext; import android.media.effect.EffectFactory; import com.ruesga.android.wallpapers.photophase.Colors; import com.ruesga.android.wallpapers.photophase.preferences.PreferencesProvider.Preferences; import com.ruesga.android.wallpapers.photophase.utils.Utils; import java.util.HashMap; import java.util.Map; /** * A class that manages all the supported borders */ public class Borders { /** * Enumeration of the supported borders */ public enum BORDERS { /** * @see BordersFactory#BORDER_NULL */ NO_BORDER(0), /** * @see BordersFactory#BORDER_SIMPLE */ SIMPLE(1), /** * @see BordersFactory#BORDER_ROUNDED */ ROUNDED(2), /** * @see BordersFactory#BORDER_ROUNDED_SQUARES */ ROUNDED_SQUARES(3), /** * @see BordersFactory#BORDER_HORIZONTAL_FILM */ HORIZONTAL_FILM(4), /** * @see BordersFactory#BORDER_VERTICAL_FILM */ VERTICAL_FILM(5), /** * @see BordersFactory#BORDER_ELEGANT */ ELEGANT(6), /** * @see BordersFactory#BORDER_DOUBLE */ DOUBLE(7), /** * @see BordersFactory#BORDER_DOUBLE_JOINED */ DOUBLE_JOINED(8), /** * @see BordersFactory#BORDER_INSET */ INSET(9), /** * @see BordersFactory#BORDER_SQUARES */ SQUARES(10), /** * @see BordersFactory#BORDER_INSET_SQUARES */ INSET_SQUARES(11); public final int mId; BORDERS(int id) { mId = id; } public static BORDERS fromId(int id) { for (BORDERS border : BORDERS.values()) { if (border.mId == id) { return border; } } return null; } } private final Map<BORDERS, Border> mCachedBorders; private final EffectContext mEffectContext; private final Context mContext; /** * Constructor of <code>Borders</code> * * @param effectContext The current effect context */ public Borders(Context context, EffectContext effectContext) { super(); mCachedBorders = new HashMap<>(); mEffectContext = effectContext; mContext = context; } /** * Method that that release the cached data */ public void release() { if (mCachedBorders != null) { for (Border border : mCachedBorders.values()) { border.release(); } mCachedBorders.clear(); } } /** * Method that return the next border to use with the picture. * * @return Border The next border to use or null if no need to apply any border */ @SuppressWarnings("boxing") public Border getNextBorder() { // Get an effect based on the user preference BORDERS[] borders = Preferences.General.Borders.toBORDERS( Preferences.General.Borders.getSelectedBorders(mContext)); BORDERS nextBorder = null; if (borders.length > 0) { int low = 0; int high = borders.length - 1; int pos = Utils.getNextRandom(low, high); nextBorder = borders[pos]; } return getBorder(nextBorder); } public Border getBorder(BORDERS nextBorder) { EffectFactory effectFactory = mEffectContext.getFactory(); Border border = null; // Ensure we apply at least an border (a null one) if (nextBorder == null) { nextBorder = BORDERS.NO_BORDER; } // The border was cached previously? if (mCachedBorders.containsKey(nextBorder)) { border = mCachedBorders.get(nextBorder); updateColors(border); return border; } // Select the effect if is available if (nextBorder.compareTo(BORDERS.NO_BORDER) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_NULL)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_NULL); } } else if (nextBorder.compareTo(BORDERS.SIMPLE) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_SIMPLE)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_SIMPLE); } } else if (nextBorder.compareTo(BORDERS.ROUNDED) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_ROUNDED)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_ROUNDED); } } else if (nextBorder.compareTo(BORDERS.ROUNDED_SQUARES) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_ROUNDED_SQUARES)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_ROUNDED_SQUARES); } } else if (nextBorder.compareTo(BORDERS.HORIZONTAL_FILM) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_HORIZONTAL_FILM)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_HORIZONTAL_FILM); } } else if (nextBorder.compareTo(BORDERS.VERTICAL_FILM) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_VERTICAL_FILM)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_VERTICAL_FILM); } } else if (nextBorder.compareTo(BORDERS.ELEGANT) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_ELEGANT)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_ELEGANT); } } else if (nextBorder.compareTo(BORDERS.DOUBLE) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_DOUBLE)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_DOUBLE); } } else if (nextBorder.compareTo(BORDERS.DOUBLE_JOINED) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_DOUBLE_JOINED)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_DOUBLE_JOINED); } } else if (nextBorder.compareTo(BORDERS.INSET) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_INSET)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_INSET); } } else if (nextBorder.compareTo(BORDERS.SQUARES) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_SQUARES)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_SQUARES); } } else if (nextBorder.compareTo(BORDERS.INSET_SQUARES) == 0) { if (EffectFactory.isEffectSupported(BordersFactory.BORDER_INSET_SQUARES)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_INSET_SQUARES); } } // Instead of not to apply any border, just use one null border to follow the same // border model. This allow to use the same height when Border.apply is applied for all // the frames if (border == null && EffectFactory.isEffectSupported(BordersFactory.BORDER_NULL)) { border = (Border) effectFactory.createEffect(BordersFactory.BORDER_NULL); nextBorder = BORDERS.NO_BORDER; } // Set the color if (border != null) { updateColors(border); // Cache the border mCachedBorders.put(nextBorder, border); } return border; } private void updateColors(Border border) { border.mColor = Colors.getInstance(mContext).getBorder(); border.mBgColor = Colors.getInstance(mContext).getBackground(); } }