/*
* This file provided by Facebook is for non-commercial testing and evaluation
* purposes only. Facebook reserves all rights not expressly granted.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.facebook.fresco.samples.showcase.imagepipeline;
import java.util.Locale;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.fresco.samples.showcase.BaseShowcaseFragment;
import com.facebook.fresco.samples.showcase.R;
import com.facebook.fresco.samples.showcase.postprocessor.BlurPostprocessor;
import com.facebook.fresco.samples.showcase.postprocessor.CachedWatermarkPostprocessor;
import com.facebook.fresco.samples.showcase.postprocessor.FasterGreyScalePostprocessor;
import com.facebook.fresco.samples.showcase.postprocessor.ScalingBlurPostprocessor;
import com.facebook.fresco.samples.showcase.postprocessor.SlowGreyScalePostprocessor;
import com.facebook.fresco.samples.showcase.postprocessor.WatermarkPostprocessor;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.imagepipeline.request.Postprocessor;
/**
* Fragment that illustrates how to use the image pipeline directly in order to create
* notifications.
*/
public class ImagePipelinePostProcessorFragment extends BaseShowcaseFragment
implements DurationCallback {
private static final Uri URI =
Uri.parse("http://frescolib.org/static/sample-images/animal_a_l.jpg");
private static final int WATERMARK_COUNT = 10;
private static final String WATERMARK_STRING = "WATERMARK";
private final Entry[] SPINNER_ENTRIES = new Entry[]{
new Entry(
R.string.imagepipeline_postprocessor_show_original,
null),
new Entry(
R.string.imagepipeline_postprocessor_set_greyscale_slow,
new SlowGreyScalePostprocessor(this)),
new Entry(
R.string.imagepipeline_postprocessor_set_greyscale,
new FasterGreyScalePostprocessor(this)),
new Entry(
R.string.imagepipeline_postprocessor_set_watermark,
new WatermarkPostprocessor(this, WATERMARK_COUNT, WATERMARK_STRING)),
new Entry(
R.string.imagepipeline_postprocessor_set_watermark_cached,
new CachedWatermarkPostprocessor(this, WATERMARK_COUNT, WATERMARK_STRING)),
new Entry(
R.string.imagepipeline_postprocessor_set_blur,
new BlurPostprocessor(this)),
new Entry(
R.string.imagepipeline_postprocessor_set_scaling_blur,
new ScalingBlurPostprocessor(this)),
};
private Button mButton;
private SimpleDraweeView mDraweeMain;
private Spinner mSpinner;
@Nullable
@Override
public View onCreateView(
LayoutInflater inflater,
@Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_imagepipeline_postprocessor, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
mButton = (Button) view.findViewById(R.id.button);
mDraweeMain = (SimpleDraweeView) view.findViewById(R.id.drawee_view);
mSpinner = (Spinner) view.findViewById(R.id.spinner);
mSpinner.setAdapter(new SimplePostprocessorAdapter());
mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
final Entry spinnerEntry = SPINNER_ENTRIES[position];
setPostprocessor(spinnerEntry.postprocessor);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
mSpinner.setSelection(0);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Entry spinnerEntry = SPINNER_ENTRIES[mSpinner.getSelectedItemPosition()];
setPostprocessor(spinnerEntry.postprocessor);
}
});
}
@Override
public int getTitleId() {
return R.string.imagepipeline_postprocessor_title;
}
@Override
public void showDuration(long startNs) {
final float deltaMs = startNs / 1e6f;
final String message = String.format((Locale) null, "Duration: %.1f ms", deltaMs);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getContext(), message, Toast.LENGTH_SHORT).show();
}
});
}
private void setPostprocessor(Postprocessor postprocessor) {
final ImageRequest imageRequest = ImageRequestBuilder.newBuilderWithSource(URI)
.setPostprocessor(postprocessor)
.build();
final DraweeController draweeController = Fresco.newDraweeControllerBuilder()
.setOldController(mDraweeMain.getController())
.setImageRequest(imageRequest)
.build();
mDraweeMain.setController(draweeController);
}
private class SimplePostprocessorAdapter extends BaseAdapter {
@Override
public int getCount() {
return SPINNER_ENTRIES.length;
}
@Override
public Object getItem(int position) {
return SPINNER_ENTRIES[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final LayoutInflater layoutInflater = getLayoutInflater(null);
final View view = convertView != null
? convertView
: layoutInflater.inflate(android.R.layout.simple_spinner_dropdown_item, parent, false);
final TextView textView = (TextView) view.findViewById(android.R.id.text1);
textView.setText(SPINNER_ENTRIES[position].descriptionId);
return view;
}
}
private static class Entry {
final int descriptionId;
final Postprocessor postprocessor;
Entry(int descriptionId, Postprocessor postprocessor) {
this.descriptionId = descriptionId;
this.postprocessor = postprocessor;
}
}
}