| /* |
| * Copyright 2018 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| package org.skia.skottie; |
| |
| import android.app.Activity; |
| import android.content.Intent; |
| import android.graphics.Color; |
| import android.graphics.Point; |
| import android.net.Uri; |
| import android.os.Bundle; |
| import android.view.View; |
| import android.view.ViewGroup; |
| import android.widget.Button; |
| import android.widget.GridLayout; |
| |
| import java.io.FileNotFoundException; |
| import java.io.InputStream; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.concurrent.CountDownLatch; |
| import java.util.concurrent.TimeUnit; |
| import java.util.concurrent.TimeoutException; |
| |
| import static java.lang.Math.ceil; |
| import static java.lang.Math.sqrt; |
| |
| public class SkottieActivity extends Activity implements View.OnClickListener { |
| |
| private final static long TIME_OUT_MS = 10000; |
| |
| private SkottieApplication mApplication; |
| |
| private CountDownLatch mEnterAnimationFence = new CountDownLatch(1); |
| |
| private GridLayout mGrid; |
| private int mRowCount = 0; |
| private int mColumnCount = 0; |
| private int mCellWidth = 0; |
| private int mCellHeight = 0; |
| |
| private List<SkottieView> mAnimations; |
| static private List<Uri> mAnimationFiles = new ArrayList<Uri>(); |
| |
| private void populateGrid() { |
| mRowCount = 0; |
| mColumnCount = 0; |
| mAnimations = new ArrayList<SkottieView>(); |
| mCellWidth = 0; |
| mCellHeight = 0; |
| |
| int rawAssets[] = { |
| R.raw.star, R.raw.movie_loading, R.raw.uk, R.raw.white_material_wave_loading |
| }; |
| |
| for (int resId : rawAssets) { |
| SkottieView view = new SkottieView(this); |
| view.setSkottieResource(resId); |
| mAnimations.add(view); |
| } |
| |
| for (Uri uri : mAnimationFiles) { |
| try { |
| SkottieView view = new SkottieView(this); |
| view.setSkottieURI(this, uri); |
| mAnimations.add(view); |
| } catch (FileNotFoundException e) { |
| e.printStackTrace(); |
| } |
| } |
| |
| Point size = new Point(); |
| getWindowManager().getDefaultDisplay().getSize(size); |
| int screenWidth = size.x; |
| int screenHeight = (int)(size.y / 1.3f); |
| |
| double unit = sqrt(mAnimations.size() / 6.0f); |
| mRowCount = (int)ceil(3 * unit); |
| mColumnCount = (int)ceil(2 * unit); |
| mGrid.setColumnCount(mColumnCount); |
| mGrid.setRowCount(mRowCount); |
| mCellWidth = screenWidth / mColumnCount; |
| mCellHeight = screenHeight / mRowCount; |
| |
| refreshGrid(); |
| |
| startAnimation(); |
| |
| for (SkottieView view : mAnimations) { |
| view.setOnClickListener(new View.OnClickListener(){ |
| public void onClick(View view){ |
| inflateView((SkottieView)view); |
| } |
| }); |
| } |
| |
| if (mInflatedIndex >= 0) { |
| SkottieView view = mAnimations.get(mInflatedIndex); |
| mInflatedIndex = -1; |
| inflateView(view); |
| } |
| } |
| |
| static int mInflatedIndex = -1; |
| |
| private void inflateView(SkottieView view) { |
| if (mInflatedIndex >= 0) { |
| //deflate active view |
| SkottieView oldView = mAnimations.get(mInflatedIndex); |
| if (oldView != null) { |
| int row = mInflatedIndex / mColumnCount, column = mInflatedIndex % mColumnCount; |
| addView(oldView, row, column, false); |
| } |
| mInflatedIndex = -1; |
| //start and show animations that were in the background |
| for (SkottieView anyView : mAnimations) { |
| if (anyView != oldView) { |
| anyView.getSkottieAnimation().start(); |
| anyView.setVisibility(View.VISIBLE); |
| } |
| } |
| return; |
| } |
| |
| //stop and hide animations in the background |
| for (SkottieView anyView : mAnimations) { |
| if (anyView != view) { |
| anyView.getSkottieAnimation().stop(); |
| anyView.setVisibility(View.INVISIBLE); |
| } |
| } |
| |
| mInflatedIndex = mAnimations.indexOf(view); |
| |
| GridLayout.Spec rowSpec = GridLayout.spec(0, mRowCount, GridLayout.CENTER); |
| GridLayout.Spec colSpec = GridLayout.spec(0, mColumnCount, GridLayout.CENTER); |
| GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpec, colSpec); |
| params.width = ViewGroup.LayoutParams.MATCH_PARENT; |
| params.height = ViewGroup.LayoutParams.MATCH_PARENT; |
| |
| mGrid.updateViewLayout(view, params); |
| } |
| |
| private void refreshGrid() { |
| mGrid.removeAllViews(); |
| int currentRaw = 0; |
| int row = 0, column = 0; |
| for (SkottieView view : mAnimations) { |
| addView(view, row, column, true); |
| column++; |
| if (column >= mColumnCount) { |
| column = 0; |
| row++; |
| } |
| } |
| } |
| |
| private void addView(SkottieView view, int row , int column, boolean addView) { |
| GridLayout.Spec rowSpec = GridLayout.spec(row, 1, GridLayout.CENTER); |
| GridLayout.Spec colSpec = GridLayout.spec(column, 1, GridLayout.CENTER); |
| GridLayout.LayoutParams params = new GridLayout.LayoutParams(rowSpec, colSpec); |
| params.width = mCellWidth; |
| params.height = mCellHeight; |
| if (addView) { |
| mGrid.addView(view, params); |
| } else { |
| mGrid.updateViewLayout(view, params); |
| } |
| } |
| |
| private void startAnimation() { |
| for (SkottieView view : mAnimations) { |
| view.getSkottieAnimation().start(); |
| } |
| } |
| |
| private void stopAnimation() { |
| for (SkottieView view : mAnimations) { |
| view.getSkottieAnimation().stop(); |
| } |
| } |
| |
| private void addLottie(Uri uri) throws FileNotFoundException { |
| int animations = mAnimations.size(); |
| if (animations < mRowCount * mColumnCount) { |
| SkottieView view = new SkottieView(this); |
| view.setSkottieURI(this, uri); |
| int row = animations / mColumnCount, column = animations % mColumnCount; |
| mAnimations.add(view); |
| mAnimationFiles.add(uri); |
| view.setOnClickListener(new View.OnClickListener(){ |
| public void onClick(View view){ |
| inflateView((SkottieView)view); |
| } |
| }); |
| addView(view, row, column, true); |
| view.getSkottieAnimation().start(); |
| } else { |
| stopAnimation(); |
| mAnimationFiles.add(uri); |
| populateGrid(); |
| startAnimation(); |
| } |
| } |
| |
| |
| @Override |
| public void onEnterAnimationComplete() { |
| super.onEnterAnimationComplete(); |
| mEnterAnimationFence.countDown(); |
| } |
| |
| public void waitForEnterAnimationComplete() throws TimeoutException, InterruptedException { |
| if (!mEnterAnimationFence.await(TIME_OUT_MS, TimeUnit.MILLISECONDS)) { |
| throw new TimeoutException(); |
| } |
| } |
| |
| private void createLayout() { |
| setContentView(R.layout.main_layout); |
| Button button1 = (Button)findViewById(R.id.open_lottie); |
| button1.setOnClickListener(this); |
| mGrid = (GridLayout)findViewById(R.id.grid_lotties); |
| mGrid.setBackgroundColor(Color.LTGRAY); |
| |
| populateGrid(); |
| } |
| |
| @Override |
| protected void onCreate(Bundle savedInstanceState) { |
| super.onCreate(savedInstanceState); |
| |
| createLayout(); |
| } |
| |
| @Override |
| protected void onDestroy() { |
| super.onDestroy(); |
| } |
| |
| static final int PICK_FILE_REQUEST = 2; |
| |
| @Override |
| public void onClick(View view) { |
| Intent intent = new Intent(); |
| intent.setType("application/json"); |
| Intent i = Intent.createChooser(intent, "View Default File Manager"); |
| startActivityForResult(i, PICK_FILE_REQUEST); |
| } |
| |
| @Override |
| protected void onActivityResult(int requestCode, int resultCode, Intent data) { |
| super.onActivityResult(requestCode, resultCode, data); |
| if (resultCode == Activity.RESULT_OK) { |
| if (requestCode == PICK_FILE_REQUEST) if (data != null) { |
| //no data present |
| Uri uri = data.getData(); |
| |
| try { |
| addLottie(uri); |
| } catch (FileNotFoundException e) { |
| e.printStackTrace(); |
| } |
| } |
| } |
| } |
| } |