blob: a0190db775fd7483311280309120ad2cdcff2bf0 [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.gallery3d.app;
import com.android.gallery3d.R;
import com.android.gallery3d.data.MediaObject;
import com.android.gallery3d.data.MediaSet;
import com.android.gallery3d.data.Path;
import com.android.gallery3d.ui.AlbumSetView;
import com.android.gallery3d.ui.CacheBarView;
import com.android.gallery3d.ui.GLCanvas;
import com.android.gallery3d.ui.GLView;
import com.android.gallery3d.ui.ManageCacheDrawer;
import com.android.gallery3d.ui.MenuExecutor;
import com.android.gallery3d.ui.SelectionDrawer;
import com.android.gallery3d.ui.SelectionManager;
import com.android.gallery3d.ui.SlotView;
import com.android.gallery3d.ui.StaticBackground;
import com.android.gallery3d.util.GalleryUtils;
import android.app.ActionBar;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.widget.Toast;
import java.util.ArrayList;
public class ManageCachePage extends ActivityState implements
SelectionManager.SelectionListener, CacheBarView.Listener,
MenuExecutor.ProgressListener, EyePosition.EyePositionListener {
public static final String KEY_MEDIA_PATH = "media-path";
private static final String TAG = "ManageCachePage";
private static final float USER_DISTANCE_METER = 0.3f;
private static final int DATA_CACHE_SIZE = 256;
private StaticBackground mStaticBackground;
private AlbumSetView mAlbumSetView;
private MediaSet mMediaSet;
protected SelectionManager mSelectionManager;
protected SelectionDrawer mSelectionDrawer;
private AlbumSetDataAdapter mAlbumSetDataAdapter;
private float mUserDistance; // in pixel
private CacheBarView mCacheBar;
private EyePosition mEyePosition;
// The eyes' position of the user, the origin is at the center of the
// device and the unit is in pixels.
private float mX;
private float mY;
private float mZ;
private int mAlbumCountToMakeAvailableOffline;
private GLView mRootPane = new GLView() {
private float mMatrix[] = new float[16];
@Override
protected void onLayout(
boolean changed, int left, int top, int right, int bottom) {
mStaticBackground.layout(0, 0, right - left, bottom - top);
mEyePosition.resetPosition();
Config.ManageCachePage config = Config.ManageCachePage.get((Context) mActivity);
ActionBar actionBar = ((Activity) mActivity).getActionBar();
int slotViewTop = GalleryActionBar.getHeight((Activity) mActivity);
int slotViewBottom = bottom - top - config.cacheBarHeight;
mAlbumSetView.layout(0, slotViewTop, right - left, slotViewBottom);
mCacheBar.layout(0, bottom - top - config.cacheBarHeight,
right - left, bottom - top);
}
@Override
protected void render(GLCanvas canvas) {
canvas.save(GLCanvas.SAVE_FLAG_MATRIX);
GalleryUtils.setViewPointMatrix(mMatrix,
getWidth() / 2 + mX, getHeight() / 2 + mY, mZ);
canvas.multiplyMatrix(mMatrix, 0);
super.render(canvas);
canvas.restore();
}
};
public void onEyePositionChanged(float x, float y, float z) {
mRootPane.lockRendering();
mX = x;
mY = y;
mZ = z;
mRootPane.unlockRendering();
mRootPane.invalidate();
}
public void onSingleTapUp(int slotIndex) {
MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex);
if (targetSet == null) return; // Content is dirty, we shall reload soon
// ignore selection action if the target set does not support cache
// operation (like a local album).
if ((targetSet.getSupportedOperations()
& MediaSet.SUPPORT_CACHE) == 0) {
showToastForLocalAlbum();
return;
}
Path path = targetSet.getPath();
boolean isFullyCached =
(targetSet.getCacheFlag() == MediaObject.CACHE_FLAG_FULL);
boolean isSelected = mSelectionManager.isItemSelected(path);
if (!isFullyCached) {
// We only count the media sets that will be made available offline
// in this session.
if (isSelected) {
--mAlbumCountToMakeAvailableOffline;
} else {
++mAlbumCountToMakeAvailableOffline;
}
}
long sizeOfTarget = targetSet.getCacheSize();
if (isFullyCached ^ isSelected) {
mCacheBar.increaseTargetCacheSize(-sizeOfTarget);
} else {
mCacheBar.increaseTargetCacheSize(sizeOfTarget);
}
mSelectionManager.toggle(path);
mAlbumSetView.invalidate();
}
@Override
public void onCreate(Bundle data, Bundle restoreState) {
initializeViews();
initializeData(data);
mEyePosition = new EyePosition(mActivity.getAndroidContext(), this);
}
@Override
public void onPause() {
super.onPause();
mAlbumSetDataAdapter.pause();
mAlbumSetView.pause();
mCacheBar.pause();
mEyePosition.pause();
}
@Override
public void onResume() {
super.onResume();
setContentPane(mRootPane);
mAlbumSetDataAdapter.resume();
mAlbumSetView.resume();
mCacheBar.resume();
mEyePosition.resume();
}
private void initializeData(Bundle data) {
mUserDistance = GalleryUtils.meterToPixel(USER_DISTANCE_METER);
String mediaPath = data.getString(ManageCachePage.KEY_MEDIA_PATH);
mMediaSet = mActivity.getDataManager().getMediaSet(mediaPath);
mSelectionManager.setSourceMediaSet(mMediaSet);
// We will always be in selection mode in this page.
mSelectionManager.setAutoLeaveSelectionMode(false);
mSelectionManager.enterSelectionMode();
mAlbumSetDataAdapter = new AlbumSetDataAdapter(
mActivity, mMediaSet, DATA_CACHE_SIZE);
mAlbumSetView.setModel(mAlbumSetDataAdapter);
}
private void initializeViews() {
mSelectionManager = new SelectionManager(mActivity, true);
mSelectionManager.setSelectionListener(this);
mStaticBackground = new StaticBackground(mActivity.getAndroidContext());
mRootPane.addComponent(mStaticBackground);
mSelectionDrawer = new ManageCacheDrawer(
(Context) mActivity, mSelectionManager);
Config.ManageCachePage config = Config.ManageCachePage.get((Context) mActivity);
mAlbumSetView = new AlbumSetView(mActivity, mSelectionDrawer,
config.slotWidth, config.slotHeight,
config.displayItemSize, config.labelFontSize,
config.labelOffsetY, config.labelMargin);
mAlbumSetView.setListener(new SlotView.SimpleListener() {
@Override
public void onSingleTapUp(int slotIndex) {
ManageCachePage.this.onSingleTapUp(slotIndex);
}
});
mRootPane.addComponent(mAlbumSetView);
mCacheBar = new CacheBarView(mActivity, R.drawable.manage_bar,
config.cacheBarHeight,
config.cacheBarPinLeftMargin,
config.cacheBarPinRightMargin,
config.cacheBarButtonRightMargin,
config.cacheBarFontSize);
mCacheBar.setListener(this);
mRootPane.addComponent(mCacheBar);
mStaticBackground.setImage(R.drawable.background,
R.drawable.background_portrait);
}
public void onDoneClicked() {
ArrayList<Path> ids = mSelectionManager.getSelected(false);
if (ids.size() == 0) {
onBackPressed();
return;
}
showToast();
MenuExecutor menuExecutor = new MenuExecutor(mActivity,
mSelectionManager);
menuExecutor.startAction(R.id.action_toggle_full_caching,
R.string.process_caching_requests, this);
}
private void showToast() {
if (mAlbumCountToMakeAvailableOffline > 0) {
Activity activity = (Activity) mActivity;
Toast.makeText(activity, activity.getResources().getQuantityString(
R.plurals.make_albums_available_offline,
mAlbumCountToMakeAvailableOffline),
Toast.LENGTH_SHORT).show();
}
}
private void showToastForLocalAlbum() {
Activity activity = (Activity) mActivity;
Toast.makeText(activity, activity.getResources().getString(
R.string.try_to_set_local_album_available_offline),
Toast.LENGTH_SHORT).show();
}
public void onProgressComplete(int result) {
onBackPressed();
}
public void onProgressUpdate(int index) {
}
public void onSelectionModeChange(int mode) {
}
public void onSelectionChange(Path path, boolean selected) {
}
}