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; 24e36c5d675c8c2f900ef186a55edf71ce36ca9fa0Chris Craikimport android.widget.Toast; 25a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik 26a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craikimport java.io.InputStream; 273105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craikimport java.util.HashSet; 28a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik 291dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craikpublic class FrameSequenceTest extends Activity { 303105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik FrameSequenceDrawable mDrawable; 311dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik int mResourceId; 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 621dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik mResourceId = getIntent().getIntExtra("resourceId", R.raw.animated_gif); 631dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik 64a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik setContentView(R.layout.basic_test_activity); 65a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.start).setOnClickListener(new View.OnClickListener() { 66a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 67a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 683105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.start(); 69a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 70a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 71a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.stop).setOnClickListener(new View.OnClickListener() { 72a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 73a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 743105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.stop(); 75a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 76a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 77a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.vis).setOnClickListener(new View.OnClickListener() { 78a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 79a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 803105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setVisible(true, true); 81a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 82a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 83a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik findViewById(R.id.invis).setOnClickListener(new View.OnClickListener() { 84a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik @Override 85a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik public void onClick(View view) { 863105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setVisible(false, true); 87a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 88a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik }); 89958761ceb97982b510d3059d31ba8c45700a1654Chris Craik findViewById(R.id.circle_mask).setOnClickListener(new View.OnClickListener() { 90958761ceb97982b510d3059d31ba8c45700a1654Chris Craik @Override 91958761ceb97982b510d3059d31ba8c45700a1654Chris Craik public void onClick(View view) { 92958761ceb97982b510d3059d31ba8c45700a1654Chris Craik mDrawable.setCircleMaskEnabled(!mDrawable.getCircleMaskEnabled()); 93958761ceb97982b510d3059d31ba8c45700a1654Chris Craik } 94958761ceb97982b510d3059d31ba8c45700a1654Chris Craik }); 95a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik } 963105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 973105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 983105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik protected void onResume() { 993105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik super.onResume(); 1003105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 101958761ceb97982b510d3059d31ba8c45700a1654Chris Craik View drawableView = findViewById(R.id.drawableview); 1021dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik InputStream is = getResources().openRawResource(mResourceId); 1033105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1043105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik FrameSequence fs = FrameSequence.decodeStream(is); 1053105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable = new FrameSequenceDrawable(fs, mProvider); 1063105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable.setOnFinishedListener(new FrameSequenceDrawable.OnFinishedListener() { 1073105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 1083105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik public void onFinished(FrameSequenceDrawable drawable) { 1093105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik Toast.makeText(getApplicationContext(), 1101dcd11c8d1b433446147c8f1bddfa277c26c918eChris Craik "The animation has finished", Toast.LENGTH_SHORT).show(); 1113105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 1123105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik }); 113958761ceb97982b510d3059d31ba8c45700a1654Chris Craik drawableView.setBackgroundDrawable(mDrawable); 1143105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 1153105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1163105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik @Override 1173105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik protected void onPause() { 1183105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik super.onPause(); 119958761ceb97982b510d3059d31ba8c45700a1654Chris Craik View drawableView = findViewById(R.id.drawableview); 1203105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1214d2f71e46622169d54b799d85f659420bf2defc1Chris Craik mDrawable.destroy(); 1223105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik if (!mProvider.isEmpty()) throw new IllegalStateException("All bitmaps not recycled"); 1233105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik 1243105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik mDrawable = null; 125958761ceb97982b510d3059d31ba8c45700a1654Chris Craik drawableView.setBackgroundDrawable(null); 1263105099a73d4fea3408ea0cf6b358fff77dc8b67Chris Craik } 127a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4Chris Craik} 128