1a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik/* 2a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * Copyright (C) 2013 The Android Open Source Project 3a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * 4a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 5a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * you may not use this file except in compliance with the License. 6a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * You may obtain a copy of the License at 7a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * 8a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 9a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * 10a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * Unless required by applicable law or agreed to in writing, software 11a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 12a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * See the License for the specific language governing permissions and 14a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik * limitations under the License. 15a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik */ 16a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikpackage com.android.rastermill.samples; 17a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik 18a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport android.app.Activity; 193105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craikimport android.graphics.Bitmap; 20a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport android.os.Bundle; 21a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport android.support.rastermill.FrameSequence; 22a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport android.support.rastermill.FrameSequenceDrawable; 23a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport android.view.View; 24a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport android.widget.ImageView; 25e36c5d675c8c2f900ef186a55edf71ce36ca9fa0Chris Craikimport android.widget.Toast; 26a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik 27a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport java.io.InputStream; 283105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craikimport java.util.HashSet; 29a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik 30a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikpublic class AnimatedGifTest extends Activity { 313105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik FrameSequenceDrawable mDrawable; 323105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 333105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik // This provider is entirely unnecessary, just here to validate the acquire/release process 343105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik private class CheckingProvider implements FrameSequenceDrawable.BitmapProvider { 353105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik HashSet<Bitmap> mBitmaps = new HashSet<Bitmap>(); 363105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 373105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public Bitmap acquireBitmap(int minWidth, int minHeight) { 383105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik Bitmap bitmap = 393105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik Bitmap.createBitmap(minWidth + 1, minHeight + 4, Bitmap.Config.ARGB_8888); 403105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mBitmaps.add(bitmap); 413105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik return bitmap; 423105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 433105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 443105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 453105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public void releaseBitmap(Bitmap bitmap) { 463105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik if (!mBitmaps.contains(bitmap)) throw new IllegalStateException(); 473105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mBitmaps.remove(bitmap); 483105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik bitmap.recycle(); 493105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 503105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 513105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public boolean isEmpty() { 523105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik return mBitmaps.isEmpty(); 533105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 543105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 553105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 563105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik final CheckingProvider mProvider = new CheckingProvider(); 573105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 58a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 59a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onCreate(Bundle savedInstanceState) { 60a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik super.onCreate(savedInstanceState); 61a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik 62a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik setContentView(R.layout.basic_test_activity); 63a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { 64a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 65a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 663105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.start(); 67a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 68a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 69a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.stop).setOnClickListener(new View.OnClickListener() { 70a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 71a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 723105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.stop(); 73a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 74a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 75a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.vis).setOnClickListener(new View.OnClickListener() { 76a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 77a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 783105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setVisible(true, true); 79a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 80a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 81a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.invis).setOnClickListener(new View.OnClickListener() { 82a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 83a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 843105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setVisible(false, true); 85a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 86a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 87a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 883105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 893105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 903105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik protected void onResume() { 913105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik super.onResume(); 923105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 933105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik ImageView imageView = (ImageView) findViewById(R.id.imageview); 943105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik InputStream is = getResources().openRawResource(R.raw.animated); 953105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 963105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik FrameSequence fs = FrameSequence.decodeStream(is); 973105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable = new FrameSequenceDrawable(fs, mProvider); 983105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setOnFinishedListener(new FrameSequenceDrawable.OnFinishedListener() { 993105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 1003105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public void onFinished(FrameSequenceDrawable drawable) { 1013105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik Toast.makeText(getApplicationContext(), 1023105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik "THE ANIMATION HAS FINISHED", Toast.LENGTH_SHORT).show(); 1033105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 1043105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik }); 1053105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik imageView.setImageDrawable(mDrawable); 1063105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 1073105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1083105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 1093105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik protected void onPause() { 1103105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik super.onPause(); 1113105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik ImageView imageView = (ImageView) findViewById(R.id.imageview); 1123105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1134d2f71e46622169d54b799d85f659420bf2defc1Chris Craik mDrawable.destroy(); 1143105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik if (!mProvider.isEmpty()) throw new IllegalStateException("All bitmaps not recycled"); 1153105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1163105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable = null; 1173105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik imageView.setImageDrawable(null); 1183105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1193105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 120a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik} 121