/* * Copyright (C) 2015 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.adapters; import android.animation.Animator; import android.content.Context; import android.content.res.Configuration; import android.graphics.PorterDuff; import android.support.annotation.ArrayRes; import android.support.v4.content.ContextCompat; import android.support.v4.util.Pair; import android.support.v4.view.PagerAdapter; import android.support.v7.widget.SwitchCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; import com.ruesga.android.wallpapers.photophase.AndroidHelper; import com.ruesga.android.wallpapers.photophase.R; import com.ruesga.android.wallpapers.photophase.borders.Borders; import com.ruesga.android.wallpapers.photophase.effects.Effects; import com.ruesga.android.wallpapers.photophase.transitions.Transitions; import com.ruesga.android.wallpapers.photophase.widgets.LivePreviewView; import org.adw.library.widgets.discreteseekbar.DiscreteSeekBar; import java.util.Set; public class LivePreviewAdapter extends PagerAdapter { public interface LivePreviewCallback { Set<String> getSelectedEntries(); void setSelectedEntries(Set<String> entries); Transitions.TRANSITIONS getTransitionForId(int id); Effects.EFFECTS getEffectForId(int id); Borders.BORDERS getBorderForId(int id); boolean hasSettings(int id); void configureSettings(int id, DiscreteSeekBar seekBar); void saveSettings(int id, int newVal); } private static class ShowAnimatorListener implements Animator.AnimatorListener { private final View mTarget; public ShowAnimatorListener(View v) { mTarget = v; } @Override public void onAnimationStart(Animator animation) { mTarget.setAlpha(0.0f); mTarget.setVisibility(View.VISIBLE); } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } } private static class HideAnimatorListener implements Animator.AnimatorListener { private final View mTarget; public HideAnimatorListener(View v) { mTarget = v; } @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { mTarget.setVisibility(View.GONE); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } } private final Context mContext; private final String[] mLabels; private final String[] mValues; private final LivePreviewCallback mCallback; private final Set<String> mSelectedEntries; public LivePreviewAdapter(Context context, @ArrayRes int labels, @ArrayRes int values, LivePreviewCallback cb) { super(); mContext = context; Pair<String[], String[]> entries = AndroidHelper.sortEntries(context, labels, values); mLabels = entries.first; mValues = entries.second; mCallback = cb; mSelectedEntries = cb.getSelectedEntries(); } @Override public Object instantiateItem(ViewGroup container, final int position) { LayoutInflater li = LayoutInflater.from(mContext); final View view = li.inflate(R.layout.live_preview_view, container, false); SwitchCompat check = (SwitchCompat) view.findViewById(R.id.check); check.setChecked(mSelectedEntries.contains(mValues[position])); check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { mSelectedEntries.add(mValues[position]); } else { mSelectedEntries.remove(mValues[position]); } mCallback.setSelectedEntries(mSelectedEntries); } }); int id = Integer.valueOf(mValues[position]); TextView label = (TextView) view.findViewById(R.id.label); label.setText(mLabels[position]); LivePreviewView preview = (LivePreviewView) view.findViewById(R.id.preview); preview.setEffect(mCallback.getEffectForId(id)); preview.setBorder(mCallback.getBorderForId(id)); preview.setTransition(mCallback.getTransitionForId(id)); configureSettings(view, id, preview); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { LivePreviewView v = (LivePreviewView) ((View) object).findViewById(R.id.preview); v.recycle(); container.removeView((View) object); } @Override public int getCount() { return mValues.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public float getPageWidth(int position) { int orientation = mContext.getResources().getConfiguration().orientation; return orientation == Configuration.ORIENTATION_PORTRAIT ? 1.0f : 0.5f; } private void configureSettings(View view, final int id, final LivePreviewView preview) { final ImageView settings = (ImageView) view.findViewById(R.id.settings); final View settingsBlock = view.findViewById(R.id.settings_block); if (mCallback.hasSettings(id)) { settings.setColorFilter(ContextCompat.getColor(mContext, R.color.color_accent), PorterDuff.Mode.SRC_ATOP); settings.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { settingsBlock.animate().alpha(1.0f).setDuration(600L).setListener( new ShowAnimatorListener(settingsBlock)).start(); settings.animate().alpha(0.0f).setDuration(600L).setListener( new HideAnimatorListener(settings)).start(); } }); final View done = view.findViewById(R.id.done); done.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { settings.animate().alpha(1.f).setDuration(600L).setListener( new ShowAnimatorListener(settings)).start(); settingsBlock.animate().alpha(0.0f).setDuration(600L).setListener( new HideAnimatorListener(settingsBlock)).start(); } }); final DiscreteSeekBar seekBar = (DiscreteSeekBar) view.findViewById(R.id.strength); mCallback.configureSettings(id, seekBar); seekBar.setOnProgressChangeListener(new DiscreteSeekBar.OnProgressChangeListener() { @Override public void onProgressChanged(DiscreteSeekBar discreteSeekBar, int i, boolean b) { mCallback.saveSettings(id, i); preview.recreate(); } @Override public void onStartTrackingTouch(DiscreteSeekBar discreteSeekBar) { } @Override public void onStopTrackingTouch(DiscreteSeekBar discreteSeekBar) { } }); } else { settings.setVisibility(View.GONE); } } }