blob: 6c9d077179427fc06df29a813d8f39d288b8b2c3 [file] [log] [blame]
/*
* 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();
}
}
}
}
}