package com.cooliris.media;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import javax.microedition.khronos.opengles.GL11;
import com.cooliris.media.R;
import android.os.SystemClock;
public final class LoadingLayer extends Layer {
private static final float FADE_INTERVAL = 0.5f;
private static final float GRAY_VALUE = 0.1f;
private static final int[] PRELOAD_RESOURCES_ASYNC_UNSCALED = { R.drawable.stack_frame, R.drawable.grid_frame,
R.drawable.stack_frame_focus, R.drawable.stack_frame_gold, R.drawable.btn_location_filter_unscaled,
R.drawable.videooverlay, R.drawable.grid_check_on, R.drawable.grid_check_off, R.drawable.icon_camera_small_unscaled,
R.drawable.icon_picasa_small_unscaled };
private static final int[] PRELOAD_RESOURCES_ASYNC_SCALED = {/*
* R.drawable.btn_camera_pressed
* ,
* R.drawable.
* btn_camera_focus
* ,
* R.drawable.
* fullscreen_hud_bg
* ,
* R.drawable.
* icon_delete,
* R.drawable.
* icon_edit,
* R.drawable.
* icon_more,
* R.drawable.
* icon_share,
* R.drawable.
* selection_bg_upper
* ,
* R.drawable.
* selection_menu_bg
* ,
* R.drawable.
* selection_menu_bg_pressed
* ,
* R.drawable.
* selection_menu_bg_pressed_left
* ,
* R.drawable.
* selection_menu_bg_pressed_right
* ,
* R.drawable.
* selection_menu_divider
* ,
* R.drawable.
* timebar_bg,
* R.drawable.
* timebar_knob
* ,
* R.drawable.
* timebar_knob_pressed
* ,
* R.drawable.
* timebar_prev
* ,
* R.drawable.
* timebar_next
* ,
* R.drawable.
* mode_grid,
* R.drawable.
* mode_stack,
* R.drawable.
* icon_camera_small
* ,
* R.drawable.
* icon_location_small
* ,
* R.drawable.
* icon_picasa_small
* ,
* R.drawable.
* icon_folder_small
* ,
* R.drawable.
* scroller_new
* ,
* R.drawable.
* scroller_pressed_new
* ,
* R.drawable.
* btn_camera,
* R.drawable.
* btn_play,
* R.drawable
* .pathbar_bg,
* R.drawable.
* pathbar_cap,
* R.drawable.
* pathbar_join
* ,
* R.drawable.
* transparent,
* R.drawable.
* icon_home_small
* ,
* R.drawable.
* ic_fs_details
* ,
* R.drawable.
* ic_spinner1,
* R.drawable.
* ic_spinner2,
* R.drawable.
* ic_spinner3,
* R.drawable.
* ic_spinner4,
* R.drawable.
* ic_spinner5,
* R.drawable.
* ic_spinner6,
* R.drawable.
* ic_spinner7,
* R.drawable.
* ic_spinner8
*/};
private boolean mLoaded = false;
private final FloatAnim mOpacity = new FloatAnim(1f);
private IntBuffer mVertexBuffer;
public LoadingLayer() {
// Create vertex buffer for a screen-spanning quad.
int dimension = 10000 * 0x10000;
int[] vertices = { -dimension, -dimension, 0, dimension, -dimension, 0, -dimension, dimension, 0, dimension, dimension, 0 };
ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
vertexByteBuffer.order(ByteOrder.nativeOrder());
mVertexBuffer = vertexByteBuffer.asIntBuffer();
mVertexBuffer.put(vertices);
mVertexBuffer.position(0);
}
public boolean isLoaded() {
return true;
}
@Override
public void generate(RenderView view, RenderView.Lists lists) {
// Add to drawing list.
lists.blendedList.add(this);
// Start loading textures.
int[] textures = PRELOAD_RESOURCES_ASYNC_UNSCALED;
for (int i = 0; i != textures.length; ++i) {
view.loadTexture(view.getResource(textures[i], false));
}
textures = PRELOAD_RESOURCES_ASYNC_SCALED;
for (int i = 0; i != textures.length; ++i) {
view.loadTexture(view.getResource(textures[i]));
}
}
@Override
public void renderBlended(RenderView view, GL11 gl) {
// Wait for textures to finish loading before fading out.
if (!mLoaded) {
// Request that the view upload all loaded textures.
view.processAllTextures();
// Determine if all textures have loaded.
int[] textures = PRELOAD_RESOURCES_ASYNC_SCALED;
boolean complete = true;
for (int i = 0; i != textures.length; ++i) {
if (view.getResource(textures[i]).mState != Texture.STATE_LOADED) {
complete = false;
break;
}
}
textures = PRELOAD_RESOURCES_ASYNC_UNSCALED;
for (int i = 0; i != textures.length; ++i) {
if (view.getResource(textures[i], false).mState != Texture.STATE_LOADED) {
complete = false;
break;
}
}
if (complete) {
mLoaded = true;
mOpacity.animateValue(0f, FADE_INTERVAL, SystemClock.uptimeMillis());
}
}
// Draw the loading screen.
float alpha = mOpacity.getValue(view.getFrameTime());
if (alpha > 0.004f) {
float gray = GRAY_VALUE * alpha;
gl.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE);
gl.glColor4f(gray, gray, gray, alpha);
gl.glVertexPointer(3, GL11.GL_FIXED, 0, mVertexBuffer);
gl.glDisable(GL11.GL_TEXTURE_2D);
gl.glDisable(GL11.GL_DEPTH_TEST);
gl.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4);
gl.glEnable(GL11.GL_DEPTH_TEST);
gl.glEnable(GL11.GL_TEXTURE_2D);
view.resetColor();
} else {
// Hide the layer once completely faded out.
setHidden(true);
}
}
void reset() {
mLoaded = false;
mOpacity.setValue(1.0f);
setHidden(false);
}
}