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 */ 161dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craikpackage com.android.framesequence.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 301dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craikpublic class FrameSequenceTest extends Activity { 313105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik FrameSequenceDrawable mDrawable; 321dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik int mResourceId; 333105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 343105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik // This provider is entirely unnecessary, just here to validate the acquire/release process 353105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik private class CheckingProvider implements FrameSequenceDrawable.BitmapProvider { 363105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik HashSet<Bitmap> mBitmaps = new HashSet<Bitmap>(); 373105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 383105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public Bitmap acquireBitmap(int minWidth, int minHeight) { 393105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik Bitmap bitmap = 403105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik Bitmap.createBitmap(minWidth + 1, minHeight + 4, Bitmap.Config.ARGB_8888); 413105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mBitmaps.add(bitmap); 423105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik return bitmap; 433105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 443105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 453105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 463105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public void releaseBitmap(Bitmap bitmap) { 473105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik if (!mBitmaps.contains(bitmap)) throw new IllegalStateException(); 483105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mBitmaps.remove(bitmap); 493105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik bitmap.recycle(); 503105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 513105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 523105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public boolean isEmpty() { 533105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik return mBitmaps.isEmpty(); 543105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 553105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 563105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 573105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik final CheckingProvider mProvider = new CheckingProvider(); 583105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 59a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 60a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onCreate(Bundle savedInstanceState) { 61a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik super.onCreate(savedInstanceState); 62a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik 631dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik mResourceId = getIntent().getIntExtra("resourceId", R.raw.animated_gif); 641dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik 65a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik setContentView(R.layout.basic_test_activity); 66a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { 67a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 68a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 693105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.start(); 70a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 71a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 72a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.stop).setOnClickListener(new View.OnClickListener() { 73a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 74a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 753105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.stop(); 76a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 77a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 78a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.vis).setOnClickListener(new View.OnClickListener() { 79a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 80a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 813105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setVisible(true, true); 82a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 83a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 84a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.invis).setOnClickListener(new View.OnClickListener() { 85a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 86a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 873105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setVisible(false, true); 88a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 89a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 90a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 913105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 923105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 933105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik protected void onResume() { 943105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik super.onResume(); 953105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 963105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik ImageView imageView = (ImageView) findViewById(R.id.imageview); 971dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik InputStream is = getResources().openRawResource(mResourceId); 983105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 993105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik FrameSequence fs = FrameSequence.decodeStream(is); 1003105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable = new FrameSequenceDrawable(fs, mProvider); 1013105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setOnFinishedListener(new FrameSequenceDrawable.OnFinishedListener() { 1023105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 1033105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public void onFinished(FrameSequenceDrawable drawable) { 1043105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik Toast.makeText(getApplicationContext(), 1051dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik "The animation has finished", Toast.LENGTH_SHORT).show(); 1063105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 1073105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik }); 1083105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik imageView.setImageDrawable(mDrawable); 1093105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 1103105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1113105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 1123105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik protected void onPause() { 1133105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik super.onPause(); 1143105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik ImageView imageView = (ImageView) findViewById(R.id.imageview); 1153105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1164d2f71e46622169d54b799d85f659420bf2defc1Chris Craik mDrawable.destroy(); 1173105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik if (!mProvider.isEmpty()) throw new IllegalStateException("All bitmaps not recycled"); 1183105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1193105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable = null; 1203105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik imageView.setImageDrawable(null); 1213105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1223105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 123a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik} 124