AlbumSetPage.java revision 9c21268fa8d394cca6cab78dd023a52e0b147a6e
1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.gallery3d.app; 18 19import android.app.Activity; 20import android.content.Context; 21import android.content.Intent; 22import android.graphics.Rect; 23import android.os.Bundle; 24import android.os.Vibrator; 25import android.provider.MediaStore; 26import android.view.ActionMode; 27import android.view.Menu; 28import android.view.MenuInflater; 29import android.view.MenuItem; 30import android.widget.Toast; 31 32import com.android.gallery3d.R; 33import com.android.gallery3d.common.Utils; 34import com.android.gallery3d.data.DataManager; 35import com.android.gallery3d.data.MediaDetails; 36import com.android.gallery3d.data.MediaObject; 37import com.android.gallery3d.data.MediaSet; 38import com.android.gallery3d.data.Path; 39import com.android.gallery3d.picasasource.PicasaSource; 40import com.android.gallery3d.settings.GallerySettings; 41import com.android.gallery3d.ui.ActionModeHandler; 42import com.android.gallery3d.ui.ActionModeHandler.ActionModeListener; 43import com.android.gallery3d.ui.AlbumSetView; 44import com.android.gallery3d.ui.DetailsHelper; 45import com.android.gallery3d.ui.DetailsHelper.CloseListener; 46import com.android.gallery3d.util.GalleryUtils; 47import com.android.gallery3d.ui.GLCanvas; 48import com.android.gallery3d.ui.GLView; 49import com.android.gallery3d.ui.GridDrawer; 50import com.android.gallery3d.ui.HighlightDrawer; 51import com.android.gallery3d.ui.PositionProvider; 52import com.android.gallery3d.ui.PositionRepository; 53import com.android.gallery3d.ui.PositionRepository.Position; 54import com.android.gallery3d.ui.SelectionManager; 55import com.android.gallery3d.ui.SlotView; 56import com.android.gallery3d.ui.StaticBackground; 57import com.android.gallery3d.util.Future; 58 59public class AlbumSetPage extends ActivityState implements 60 SelectionManager.SelectionListener, GalleryActionBar.ClusterRunner, 61 EyePosition.EyePositionListener, MediaSet.SyncListener { 62 @SuppressWarnings("unused") 63 private static final String TAG = "AlbumSetPage"; 64 65 public static final String KEY_MEDIA_PATH = "media-path"; 66 public static final String KEY_SET_TITLE = "set-title"; 67 public static final String KEY_SET_SUBTITLE = "set-subtitle"; 68 public static final String KEY_SELECTED_CLUSTER_TYPE = "selected-cluster"; 69 70 private static final int DATA_CACHE_SIZE = 256; 71 private static final int REQUEST_DO_ANIMATION = 1; 72 73 private boolean mIsActive = false; 74 private StaticBackground mStaticBackground; 75 private AlbumSetView mAlbumSetView; 76 77 private MediaSet mMediaSet; 78 private String mTitle; 79 private String mSubtitle; 80 private boolean mShowClusterMenu; 81 private int mSelectedAction; 82 private Vibrator mVibrator; 83 84 protected SelectionManager mSelectionManager; 85 private AlbumSetDataAdapter mAlbumSetDataAdapter; 86 private GridDrawer mGridDrawer; 87 private HighlightDrawer mHighlightDrawer; 88 89 private boolean mGetContent; 90 private boolean mGetAlbum; 91 private ActionMode mActionMode; 92 private ActionModeHandler mActionModeHandler; 93 private DetailsHelper mDetailsHelper; 94 private MyDetailsSource mDetailsSource; 95 private boolean mShowDetails; 96 private EyePosition mEyePosition; 97 98 // The eyes' position of the user, the origin is at the center of the 99 // device and the unit is in pixels. 100 private float mX; 101 private float mY; 102 private float mZ; 103 104 private Future<Integer> mSyncTask = null; 105 106 private final GLView mRootPane = new GLView() { 107 private final float mMatrix[] = new float[16]; 108 109 @Override 110 protected void onLayout( 111 boolean changed, int left, int top, int right, int bottom) { 112 mStaticBackground.layout(0, 0, right - left, bottom - top); 113 mEyePosition.resetPosition(); 114 115 int slotViewTop = GalleryActionBar.getHeight((Activity) mActivity); 116 int slotViewBottom = bottom - top; 117 int slotViewRight = right - left; 118 119 if (mShowDetails) { 120 mDetailsHelper.layout(left, slotViewTop, right, bottom); 121 } else { 122 mAlbumSetView.setSelectionDrawer(mGridDrawer); 123 } 124 125 mAlbumSetView.layout(0, slotViewTop, slotViewRight, slotViewBottom); 126 PositionRepository.getInstance(mActivity).setOffset( 127 0, slotViewTop); 128 } 129 130 @Override 131 protected void render(GLCanvas canvas) { 132 canvas.save(GLCanvas.SAVE_FLAG_MATRIX); 133 GalleryUtils.setViewPointMatrix(mMatrix, 134 getWidth() / 2 + mX, getHeight() / 2 + mY, mZ); 135 canvas.multiplyMatrix(mMatrix, 0); 136 super.render(canvas); 137 canvas.restore(); 138 } 139 }; 140 141 @Override 142 public void onEyePositionChanged(float x, float y, float z) { 143 mRootPane.lockRendering(); 144 mX = x; 145 mY = y; 146 mZ = z; 147 mRootPane.unlockRendering(); 148 mRootPane.invalidate(); 149 } 150 151 @Override 152 public void onBackPressed() { 153 if (mShowDetails) { 154 hideDetails(); 155 } else if (mSelectionManager.inSelectionMode()) { 156 mSelectionManager.leaveSelectionMode(); 157 } else { 158 mAlbumSetView.savePositions( 159 PositionRepository.getInstance(mActivity)); 160 super.onBackPressed(); 161 } 162 } 163 164 private void savePositions(int slotIndex, int center[]) { 165 Rect offset = new Rect(); 166 mRootPane.getBoundsOf(mAlbumSetView, offset); 167 mAlbumSetView.savePositions(PositionRepository.getInstance(mActivity)); 168 Rect r = mAlbumSetView.getSlotRect(slotIndex); 169 int scrollX = mAlbumSetView.getScrollX(); 170 int scrollY = mAlbumSetView.getScrollY(); 171 center[0] = offset.left + (r.left + r.right) / 2 - scrollX; 172 center[1] = offset.top + (r.top + r.bottom) / 2 - scrollY; 173 } 174 175 public void onSingleTapUp(int slotIndex) { 176 MediaSet targetSet = mAlbumSetDataAdapter.getMediaSet(slotIndex); 177 if (targetSet == null) return; // Content is dirty, we shall reload soon 178 179 if (mShowDetails) { 180 Path path = targetSet.getPath(); 181 mHighlightDrawer.setHighlightItem(path); 182 mDetailsHelper.reloadDetails(slotIndex); 183 } else if (!mSelectionManager.inSelectionMode()) { 184 Bundle data = new Bundle(getData()); 185 String mediaPath = targetSet.getPath().toString(); 186 int[] center = new int[2]; 187 savePositions(slotIndex, center); 188 data.putIntArray(AlbumPage.KEY_SET_CENTER, center); 189 if (mGetAlbum && targetSet.isLeafAlbum()) { 190 Activity activity = (Activity) mActivity; 191 Intent result = new Intent() 192 .putExtra(AlbumPicker.KEY_ALBUM_PATH, targetSet.getPath().toString()); 193 activity.setResult(Activity.RESULT_OK, result); 194 activity.finish(); 195 } else if (targetSet.getSubMediaSetCount() > 0) { 196 data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath); 197 mActivity.getStateManager().startStateForResult( 198 AlbumSetPage.class, REQUEST_DO_ANIMATION, data); 199 } else { 200 if (!mGetContent && (targetSet.getSupportedOperations() 201 & MediaObject.SUPPORT_IMPORT) != 0) { 202 data.putBoolean(AlbumPage.KEY_AUTO_SELECT_ALL, true); 203 } 204 data.putString(AlbumPage.KEY_MEDIA_PATH, mediaPath); 205 boolean inAlbum = mActivity.getStateManager().hasStateClass(AlbumPage.class); 206 // We only show cluster menu in the first AlbumPage in stack 207 data.putBoolean(AlbumPage.KEY_SHOW_CLUSTER_MENU, !inAlbum); 208 mActivity.getStateManager().startStateForResult( 209 AlbumPage.class, REQUEST_DO_ANIMATION, data); 210 } 211 } else { 212 mSelectionManager.toggle(targetSet.getPath()); 213 mAlbumSetView.invalidate(); 214 } 215 } 216 217 private void onDown(int index) { 218 MediaSet set = mAlbumSetDataAdapter.getMediaSet(index); 219 Path path = (set == null) ? null : set.getPath(); 220 mSelectionManager.setPressedPath(path); 221 mAlbumSetView.invalidate(); 222 } 223 224 private void onUp() { 225 mSelectionManager.setPressedPath(null); 226 mAlbumSetView.invalidate(); 227 } 228 229 public void onLongTap(int slotIndex) { 230 if (mGetContent || mGetAlbum) return; 231 if (mShowDetails) { 232 onSingleTapUp(slotIndex); 233 } else { 234 MediaSet set = mAlbumSetDataAdapter.getMediaSet(slotIndex); 235 if (set == null) return; 236 mSelectionManager.setAutoLeaveSelectionMode(true); 237 mSelectionManager.toggle(set.getPath()); 238 mDetailsSource.findIndex(slotIndex); 239 mAlbumSetView.invalidate(); 240 } 241 } 242 243 public void doCluster(int clusterType) { 244 String basePath = mMediaSet.getPath().toString(); 245 String newPath = FilterUtils.switchClusterPath(basePath, clusterType); 246 Bundle data = new Bundle(getData()); 247 data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath); 248 data.putInt(KEY_SELECTED_CLUSTER_TYPE, clusterType); 249 mAlbumSetView.savePositions(PositionRepository.getInstance(mActivity)); 250 mActivity.getStateManager().switchState(this, AlbumSetPage.class, data); 251 } 252 253 public void doFilter(int filterType) { 254 String basePath = mMediaSet.getPath().toString(); 255 String newPath = FilterUtils.switchFilterPath(basePath, filterType); 256 Bundle data = new Bundle(getData()); 257 data.putString(AlbumSetPage.KEY_MEDIA_PATH, newPath); 258 mAlbumSetView.savePositions(PositionRepository.getInstance(mActivity)); 259 mActivity.getStateManager().switchState(this, AlbumSetPage.class, data); 260 } 261 262 public void onOperationComplete() { 263 mAlbumSetView.invalidate(); 264 // TODO: enable animation 265 } 266 267 @Override 268 public void onCreate(Bundle data, Bundle restoreState) { 269 initializeViews(); 270 initializeData(data); 271 Context context = mActivity.getAndroidContext(); 272 mGetContent = data.getBoolean(Gallery.KEY_GET_CONTENT, false); 273 mGetAlbum = data.getBoolean(Gallery.KEY_GET_ALBUM, false); 274 mTitle = data.getString(AlbumSetPage.KEY_SET_TITLE); 275 mSubtitle = data.getString(AlbumSetPage.KEY_SET_SUBTITLE); 276 mEyePosition = new EyePosition(context, this); 277 mDetailsSource = new MyDetailsSource(); 278 mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); 279 GalleryActionBar actionBar = mActivity.getGalleryActionBar(); 280 if (actionBar != null) { 281 mSelectedAction = data.getInt( 282 AlbumSetPage.KEY_SELECTED_CLUSTER_TYPE, FilterUtils.CLUSTER_BY_ALBUM); 283 } 284 startTransition(); 285 } 286 287 @Override 288 public void onPause() { 289 super.onPause(); 290 mIsActive = false; 291 mActionModeHandler.pause(); 292 mAlbumSetDataAdapter.pause(); 293 mAlbumSetView.pause(); 294 mEyePosition.pause(); 295 DetailsHelper.pause(); 296 GalleryActionBar actionBar = mActivity.getGalleryActionBar(); 297 if (actionBar != null) actionBar.hideClusterMenu(); 298 if (mSyncTask != null) { 299 mSyncTask.cancel(); 300 mSyncTask = null; 301 } 302 } 303 304 @Override 305 public void onResume() { 306 super.onResume(); 307 mIsActive = true; 308 setContentPane(mRootPane); 309 mAlbumSetDataAdapter.resume(); 310 mAlbumSetView.resume(); 311 mEyePosition.resume(); 312 mActionModeHandler.resume(); 313 GalleryActionBar actionBar = mActivity.getGalleryActionBar(); 314 if (mShowClusterMenu && actionBar != null) { 315 actionBar.showClusterMenu(mSelectedAction, this); 316 } 317 } 318 319 private void initializeData(Bundle data) { 320 String mediaPath = data.getString(AlbumSetPage.KEY_MEDIA_PATH); 321 mMediaSet = mActivity.getDataManager().getMediaSet(mediaPath); 322 mSelectionManager.setSourceMediaSet(mMediaSet); 323 mAlbumSetDataAdapter = new AlbumSetDataAdapter( 324 mActivity, mMediaSet, DATA_CACHE_SIZE); 325 mAlbumSetDataAdapter.setLoadingListener(new MyLoadingListener()); 326 mAlbumSetView.setModel(mAlbumSetDataAdapter); 327 } 328 329 private void initializeViews() { 330 mSelectionManager = new SelectionManager(mActivity, true); 331 mSelectionManager.setSelectionListener(this); 332 mStaticBackground = new StaticBackground(mActivity.getAndroidContext()); 333 mRootPane.addComponent(mStaticBackground); 334 335 mGridDrawer = new GridDrawer((Context) mActivity, mSelectionManager); 336 Config.AlbumSetPage config = Config.AlbumSetPage.get((Context) mActivity); 337 mAlbumSetView = new AlbumSetView(mActivity, mGridDrawer, 338 config.slotViewSpec, config.labelSpec); 339 mAlbumSetView.setListener(new SlotView.SimpleListener() { 340 @Override 341 public void onDown(int index) { 342 AlbumSetPage.this.onDown(index); 343 } 344 345 @Override 346 public void onUp() { 347 AlbumSetPage.this.onUp(); 348 } 349 350 @Override 351 public void onSingleTapUp(int slotIndex) { 352 AlbumSetPage.this.onSingleTapUp(slotIndex); 353 } 354 355 @Override 356 public void onLongTap(int slotIndex) { 357 AlbumSetPage.this.onLongTap(slotIndex); 358 } 359 }); 360 361 mActionModeHandler = new ActionModeHandler(mActivity, mSelectionManager); 362 mActionModeHandler.setActionModeListener(new ActionModeListener() { 363 public boolean onActionItemClicked(MenuItem item) { 364 return onItemSelected(item); 365 } 366 }); 367 mRootPane.addComponent(mAlbumSetView); 368 369 mStaticBackground.setImage(R.drawable.background, 370 R.drawable.background_portrait); 371 } 372 373 @Override 374 protected boolean onCreateActionBar(Menu menu) { 375 Activity activity = (Activity) mActivity; 376 GalleryActionBar actionBar = mActivity.getGalleryActionBar(); 377 MenuInflater inflater = activity.getMenuInflater(); 378 379 final boolean inAlbum = mActivity.getStateManager().hasStateClass( 380 AlbumPage.class); 381 382 if (mGetContent) { 383 inflater.inflate(R.menu.pickup, menu); 384 int typeBits = mData.getInt( 385 Gallery.KEY_TYPE_BITS, DataManager.INCLUDE_IMAGE); 386 int id = R.string.select_image; 387 if ((typeBits & DataManager.INCLUDE_VIDEO) != 0) { 388 id = (typeBits & DataManager.INCLUDE_IMAGE) == 0 389 ? R.string.select_video 390 : R.string.select_item; 391 } 392 actionBar.setTitle(id); 393 } else if (mGetAlbum) { 394 inflater.inflate(R.menu.pickup, menu); 395 actionBar.setTitle(R.string.select_album); 396 } else { 397 mShowClusterMenu = !inAlbum; 398 inflater.inflate(R.menu.albumset, menu); 399 MenuItem selectItem = menu.findItem(R.id.action_select); 400 401 if (selectItem != null) { 402 boolean selectAlbums = !inAlbum && 403 actionBar.getClusterTypeAction() == FilterUtils.CLUSTER_BY_ALBUM; 404 if (selectAlbums) { 405 selectItem.setTitle(R.string.select_album); 406 } else { 407 selectItem.setTitle(R.string.select_group); 408 } 409 } 410 411 MenuItem switchCamera = menu.findItem(R.id.action_camera); 412 if (switchCamera != null) { 413 switchCamera.setVisible(GalleryUtils.isCameraAvailable(activity)); 414 } 415 416 actionBar.setTitle(mTitle); 417 actionBar.setSubtitle(mSubtitle); 418 } 419 return true; 420 } 421 422 @Override 423 protected boolean onItemSelected(MenuItem item) { 424 Activity activity = (Activity) mActivity; 425 switch (item.getItemId()) { 426 case R.id.action_cancel: 427 activity.setResult(Activity.RESULT_CANCELED); 428 activity.finish(); 429 return true; 430 case R.id.action_select: 431 mSelectionManager.setAutoLeaveSelectionMode(false); 432 mSelectionManager.enterSelectionMode(); 433 return true; 434 case R.id.action_details: 435 if (mAlbumSetDataAdapter.size() != 0) { 436 if (mShowDetails) { 437 hideDetails(); 438 } else { 439 showDetails(); 440 } 441 } else { 442 Toast.makeText(activity, 443 activity.getText(R.string.no_albums_alert), 444 Toast.LENGTH_SHORT).show(); 445 } 446 return true; 447 case R.id.action_camera: { 448 Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA) 449 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 450 | Intent.FLAG_ACTIVITY_NEW_TASK); 451 activity.startActivity(intent); 452 return true; 453 } 454 case R.id.action_manage_offline: { 455 Bundle data = new Bundle(); 456 String mediaPath = mActivity.getDataManager().getTopSetPath( 457 DataManager.INCLUDE_ALL); 458 data.putString(AlbumSetPage.KEY_MEDIA_PATH, mediaPath); 459 mActivity.getStateManager().startState(ManageCachePage.class, data); 460 return true; 461 } 462 case R.id.action_sync_picasa_albums: { 463 PicasaSource.requestSync(activity); 464 return true; 465 } 466 case R.id.action_settings: { 467 activity.startActivity(new Intent(activity, GallerySettings.class)); 468 return true; 469 } 470 default: 471 return false; 472 } 473 } 474 475 @Override 476 protected void onStateResult(int requestCode, int resultCode, Intent data) { 477 switch (requestCode) { 478 case REQUEST_DO_ANIMATION: { 479 startTransition(); 480 } 481 } 482 } 483 484 private void startTransition() { 485 final PositionRepository repository = 486 PositionRepository.getInstance(mActivity); 487 mAlbumSetView.startTransition(new PositionProvider() { 488 private final Position mTempPosition = new Position(); 489 public Position getPosition(long identity, Position target) { 490 Position p = repository.get(identity); 491 if (p == null) { 492 p = mTempPosition; 493 p.set(target.x, target.y, 128, target.theta, 1); 494 } 495 return p; 496 } 497 }); 498 } 499 500 private String getSelectedString() { 501 GalleryActionBar actionBar = mActivity.getGalleryActionBar(); 502 int count = mSelectionManager.getSelectedCount(); 503 int action = actionBar.getClusterTypeAction(); 504 int string = action == FilterUtils.CLUSTER_BY_ALBUM 505 ? R.plurals.number_of_albums_selected 506 : R.plurals.number_of_groups_selected; 507 String format = mActivity.getResources().getQuantityString(string, count); 508 return String.format(format, count); 509 } 510 511 public void onSelectionModeChange(int mode) { 512 513 switch (mode) { 514 case SelectionManager.ENTER_SELECTION_MODE: { 515 mActivity.getGalleryActionBar().hideClusterMenu(); 516 mActionMode = mActionModeHandler.startActionMode(); 517 mVibrator.vibrate(100); 518 break; 519 } 520 case SelectionManager.LEAVE_SELECTION_MODE: { 521 mActionMode.finish(); 522 if (mShowClusterMenu) { 523 mActivity.getGalleryActionBar().showClusterMenu(mSelectedAction, this); 524 } 525 mRootPane.invalidate(); 526 break; 527 } 528 case SelectionManager.SELECT_ALL_MODE: { 529 mActionModeHandler.setTitle(getSelectedString()); 530 mRootPane.invalidate(); 531 break; 532 } 533 } 534 } 535 536 public void onSelectionChange(Path path, boolean selected) { 537 Utils.assertTrue(mActionMode != null); 538 mActionModeHandler.setTitle(getSelectedString()); 539 mActionModeHandler.updateSupportedOperation(path, selected); 540 } 541 542 private void hideDetails() { 543 mShowDetails = false; 544 mDetailsHelper.hide(); 545 mAlbumSetView.setSelectionDrawer(mGridDrawer); 546 mAlbumSetView.invalidate(); 547 } 548 549 private void showDetails() { 550 mShowDetails = true; 551 if (mDetailsHelper == null) { 552 mHighlightDrawer = new HighlightDrawer(mActivity.getAndroidContext(), 553 mSelectionManager); 554 mDetailsHelper = new DetailsHelper(mActivity, mRootPane, mDetailsSource); 555 mDetailsHelper.setCloseListener(new CloseListener() { 556 public void onClose() { 557 hideDetails(); 558 } 559 }); 560 } 561 mAlbumSetView.setSelectionDrawer(mHighlightDrawer); 562 mDetailsHelper.show(); 563 } 564 565 @Override 566 public void onSyncDone(final MediaSet mediaSet, final int resultCode) { 567 if (resultCode == MediaSet.SYNC_RESULT_ERROR) { 568 Log.d(TAG, "onSyncDone: " + Utils.maskDebugInfo(mediaSet.getName()) + " result=" 569 + resultCode); 570 } 571 ((Activity) mActivity).runOnUiThread(new Runnable() { 572 @Override 573 public void run() { 574 if (!mIsActive) return; 575 mediaSet.notifyContentChanged(); // force reload to handle spinner 576 577 if (resultCode == MediaSet.SYNC_RESULT_ERROR) { 578 Toast.makeText((Context) mActivity, R.string.sync_album_set_error, 579 Toast.LENGTH_LONG).show(); 580 } 581 } 582 }); 583 } 584 585 private class MyLoadingListener implements LoadingListener { 586 public void onLoadingStarted() { 587 GalleryUtils.setSpinnerVisibility((Activity) mActivity, true); 588 } 589 590 public void onLoadingFinished() { 591 if (!mIsActive) return; 592 593 if (mSyncTask == null) { 594 // Request sync in case the mediaSet hasn't been sync'ed before. 595 mSyncTask = mMediaSet.requestSync(AlbumSetPage.this); 596 } 597 if (mSyncTask.isDone()){ 598 // The mediaSet is in sync. Turn off the loading indicator. 599 GalleryUtils.setSpinnerVisibility((Activity) mActivity, false); 600 601 // Only show toast when there's no album and we are going to finish 602 // the page. Toast is redundant if we are going to stay on this page. 603 if ((mAlbumSetDataAdapter.size() == 0) 604 && (mActivity.getStateManager().getStateCount() > 1)) { 605 Toast.makeText((Context) mActivity, 606 R.string.empty_album, Toast.LENGTH_LONG).show(); 607 mActivity.getStateManager().finishState(AlbumSetPage.this); 608 } 609 } 610 } 611 } 612 613 private class MyDetailsSource implements DetailsHelper.DetailsSource { 614 private int mIndex; 615 public int size() { 616 return mAlbumSetDataAdapter.size(); 617 } 618 619 public int getIndex() { 620 return mIndex; 621 } 622 623 // If requested index is out of active window, suggest a valid index. 624 // If there is no valid index available, return -1. 625 public int findIndex(int indexHint) { 626 if (mAlbumSetDataAdapter.isActive(indexHint)) { 627 mIndex = indexHint; 628 } else { 629 mIndex = mAlbumSetDataAdapter.getActiveStart(); 630 if (!mAlbumSetDataAdapter.isActive(mIndex)) { 631 return -1; 632 } 633 } 634 return mIndex; 635 } 636 637 public MediaDetails getDetails() { 638 MediaObject item = mAlbumSetDataAdapter.getMediaSet(mIndex); 639 if (item != null) { 640 mHighlightDrawer.setHighlightItem(item.getPath()); 641 return item.getDetails(); 642 } else { 643 return null; 644 } 645 } 646 } 647} 648