/* * Copyright (C) 2012 Simon Robinson * * This file is part of Com-Me. * * Com-Me is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 3 of the * License, or (at your option) any later version. * * Com-Me is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General * Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with Com-Me. * If not, see <http://www.gnu.org/licenses/>. */ package ac.robinson.mediatablet.activity; import group.pals.android.lib.ui.lockpattern.LockPatternActivity; import java.io.File; import java.util.ArrayList; import ac.robinson.mediatablet.MediaTablet; import ac.robinson.mediatablet.MediaTabletActivity; import ac.robinson.mediatablet.R; import ac.robinson.mediatablet.provider.HomesteadManager; import ac.robinson.mediatablet.provider.MediaAdapter; import ac.robinson.mediatablet.provider.MediaItem; import ac.robinson.mediatablet.provider.MediaManager; import ac.robinson.mediatablet.provider.MediaTabletProvider; import ac.robinson.mediatablet.provider.PersonItem; import ac.robinson.mediatablet.provider.PersonManager; import ac.robinson.mediatablet.view.MediaViewHolder; import ac.robinson.util.BitmapUtilities; import ac.robinson.util.ImageCacheUtilities; import ac.robinson.util.StringUtilities; import ac.robinson.util.UIUtilities; import ac.robinson.util.UIUtilities.ReflectionTab; import ac.robinson.util.UIUtilities.ReflectionTabListener; import ac.robinson.view.CrossFadeDrawable; import ac.robinson.view.FastBitmapDrawable; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentResolver; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Resources; import android.graphics.ColorFilter; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.ToggleButton; //TODO: add a search view: http://developer.android.com/guide/topics/ui/actionbar.html#ActionView //TODO: filter by text - original filename or text content public class MediaBrowserActivity extends MediaTabletActivity { private MediaAdapter mMediaAdapter; private FastBitmapDrawable mDefaultIcon; private GridView mGrid; private final Handler mScrollHandler = new ScrollHandler(); private int mScrollState = ScrollManager.SCROLL_STATE_IDLE; private boolean mPendingIconsUpdate; private boolean mFingerUp = true; private ColorFilter mToggleButtonFilter; // TODO: for showing the grid position hints // private PopupWindow mPopup; // private View mCurrentGridPositionView; // private TextView mCurrentGridPositionText; private String mParentId; // the owner of this media, or null if it's the public media view private int mMediaVisibility; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // load previous visibility and parent id on screen rotation mParentId = null; mMediaVisibility = MediaItem.MEDIA_PUBLIC; if (savedInstanceState != null) { mParentId = savedInstanceState.getString(getString(R.string.extra_parent_id)); mMediaVisibility = savedInstanceState.getInt(getString(R.string.extra_media_visibility)); } else { final Intent intent = getIntent(); if (intent != null) { mParentId = intent.getStringExtra(getString(R.string.extra_parent_id)); mMediaVisibility = intent.getIntExtra(getString(R.string.extra_media_visibility), MediaItem.MEDIA_PUBLIC); } } if (mParentId != null) { addPersonalisedTabs(); } else { UIUtilities.addActionBarTabs(this, new ReflectionTab[] { new ReflectionTab(R.id.intent_homestead_browser, R.drawable.ic_menu_homesteads, getString(R.string.title_homestead_browser)), new ReflectionTab(R.id.intent_media_browser, R.drawable.ic_menu_public_media, getString(R.string.title_media_browser_public), true) }, mReflectionTabListener); } UIUtilities.configureActionBar(this, true, false, R.string.title_media_browser_public, 0); setContentView(R.layout.media_browser); initialiseMediaGridView(); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putString(getString(R.string.extra_parent_id), mParentId); savedInstanceState.putInt(getString(R.string.extra_media_visibility), mMediaVisibility); super.onSaveInstanceState(savedInstanceState); } @Override protected void onPause() { super.onPause(); mScrollHandler.removeMessages(MediaTablet.MESSAGE_UPDATE_GRID_ICONS); // dismissPopup(); } @Override protected void onDestroy() { ImageCacheUtilities.cleanupCache(); super.onDestroy(); } @Override public boolean onCreateOptionsMenu(Menu menu) { if (mParentId != null) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.public_media, menu); inflater.inflate(R.menu.delete, menu); } else { getMenuInflater().inflate(R.menu.back, menu); } return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: return super.onOptionsItemSelected(item); case R.id.menu_back: finish(); return true; case R.id.menu_view_public_media: viewPublicMedia(); return true; case R.id.menu_delete: LayoutInflater inflater = LayoutInflater.from(MediaBrowserActivity.this); final View textEntryView = inflater.inflate(R.layout.password_input, null); AlertDialog.Builder builder = new AlertDialog.Builder(MediaBrowserActivity.this); builder.setMessage(R.string.delete_person_password_prompt).setCancelable(false).setView(textEntryView) .setPositiveButton(R.string.button_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { if (MediaTablet.ADMINISTRATOR_PASSWORD.equals(StringUtilities .sha1Hash(((EditText) textEntryView.findViewById(R.id.text_password_entry)) .getText().toString()))) { ContentResolver contentResolver = getContentResolver(); PersonItem personToDelete = PersonManager.findPersonByInternalId(contentResolver, mParentId); personToDelete.setDeleted(true); PersonManager.updatePerson(contentResolver, personToDelete); String parentId = personToDelete.getParentId(); ArrayList<PersonItem> testPeople = PersonManager.findPeopleByParentId( contentResolver, parentId); if (testPeople.size() <= 0) { HomesteadManager.deleteHomesteadByInternalId(getContentResolver(), parentId); } else { HomesteadManager.reloadHomesteadIcon(getResources(), contentResolver, parentId); } UIUtilities.showToast(MediaBrowserActivity.this, R.string.delete_person_deleted); viewHomesteads(); } else { UIUtilities.showToast(MediaBrowserActivity.this, R.string.delete_person_password_incorrect); } } }).setNegativeButton(R.string.button_cancel, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); builder.show(); return true; default: return super.onOptionsItemSelected(item); } } @Override protected void loadPreferences(SharedPreferences mediaTabletSettings) { } @Override protected String getCurrentPersonId() { // only return the current person's id when they are unlocked return mMediaVisibility == MediaItem.MEDIA_PRIVATE ? mParentId : PersonItem.UNKNOWN_PERSON_ID; } // setBackgroundDrawable is deprecated from API 16+ (Jelly Bean), but we still want to target earlier versions; // since this is purely a name change, there's no real reason to do anything platform-independent @SuppressWarnings("deprecation") private void initialiseMediaGridView() { // for API 11 and above, buttons are in the action bar - could use XML-v11 but maintenance is a hassle if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { findViewById(R.id.panel_media).setVisibility(View.GONE); } if (mParentId == null) { findViewById(R.id.panel_profile_picture).setVisibility(View.GONE); findViewById(R.id.panel_filter_buttons).setBackgroundDrawable(null); findViewById(R.id.button_media_view_public_media).setVisibility(View.GONE); findViewById(R.id.button_media_view_homesteads).setVisibility(View.GONE); ((Button) findViewById(R.id.button_media_view_people)).setCompoundDrawablesWithIntrinsicBounds(0, android.R.drawable.ic_menu_revert, 0, 0); } else { ((ImageView) findViewById(R.id.profile_picture_overlay_filter)) .setOnLongClickListener(imageLongPressListener); } updateOwnerPicture(); // show the locked/unlocked owner picture or the public icon mMediaAdapter = new MediaAdapter(this, mParentId, mMediaVisibility); mDefaultIcon = mMediaAdapter.getDefaultIcon(); mGrid = (GridView) findViewById(R.id.grid_media); ColorMatrix colourMatrix = new ColorMatrix(); colourMatrix.setSaturation(0); mToggleButtonFilter = new ColorMatrixColorFilter(colourMatrix); uncheckOtherFilterButtons(0); final GridView grid = mGrid; grid.setAdapter(mMediaAdapter); grid.setOnScrollListener(new ScrollManager()); grid.setOnTouchListener(new FingerTracker()); grid.setOnItemSelectedListener(new SelectionTracker()); grid.setOnItemClickListener(new MediaViewer()); // TODO: for the scrolling hints // mCurrentGridPositionView = getLayoutInflater().inflate(R.layout.grid_annotation, null); // mCurrentGridPositionText = (TextView) mCurrentGridPositionView.findViewById(R.id.text_grid_annotation); } private void addPersonalisedTabs() { UIUtilities.removeActionBarTabs(this); PersonItem person = PersonManager.findPersonByInternalId(getContentResolver(), mParentId); String personName = person == null ? null : person.getName(); String mediaTitle = person == null || personName == null ? getString(R.string.title_media_browser) : getString( mMediaVisibility == MediaItem.MEDIA_PUBLIC ? R.string.title_media_browser_public_personalised : R.string.title_media_browser_private_personalised, personName); String peopleTitle = person == null || personName == null ? getString(R.string.title_people_browser) : String .format(getString(R.string.title_people_browser_personalised), personName); UIUtilities.addActionBarTabs(this, new ReflectionTab[] { new ReflectionTab(R.id.intent_homestead_browser, R.drawable.ic_menu_homesteads, getString(R.string.title_homestead_browser)), new ReflectionTab(R.id.intent_people_browser, R.drawable.ic_menu_people, peopleTitle), new ReflectionTab(R.id.intent_media_browser, R.drawable.ic_menu_media, mediaTitle, true) }, mReflectionTabListener); } private void updateOwnerPicture() { if (mParentId != null && MediaTablet.DIRECTORY_THUMBS != null) { Resources resources = getResources(); int iconWidth = resources.getDimensionPixelSize(R.dimen.media_owner_icon_width); int iconHeight = resources.getDimensionPixelSize(R.dimen.media_owner_icon_width); ImageView ownerIcon = ((ImageView) findViewById(R.id.profile_picture_image)); BitmapDrawable cachedIcon = new BitmapDrawable(getResources(), BitmapUtilities.loadAndCreateScaledBitmap( new File(MediaTablet.DIRECTORY_THUMBS, PersonItem.getCacheId(mParentId)).getAbsolutePath(), iconWidth, iconHeight, BitmapUtilities.ScalingLogic.CROP, true)); ownerIcon.setImageDrawable(cachedIcon); } updateLockVisibility(); } private void updateLockVisibility() { if (mParentId == null || mMediaVisibility == MediaItem.MEDIA_PRIVATE) { findViewById(R.id.profile_picture_overlay).setVisibility(View.GONE); } else { findViewById(R.id.profile_picture_overlay).setVisibility(View.VISIBLE); } } public void handleFilterClicks(View currentButton) { final int buttonId = currentButton.getId(); final boolean buttonIsChecked = ((ToggleButton) currentButton).isChecked(); switch (buttonId) { case R.id.button_media_filter_images: mMediaAdapter.setMediaFilters(buttonIsChecked, MediaTabletProvider.TYPE_IMAGE_BACK, MediaTabletProvider.TYPE_IMAGE_FRONT); break; case R.id.button_media_filter_videos: mMediaAdapter.setMediaFilters(buttonIsChecked, MediaTabletProvider.TYPE_VIDEO); break; case R.id.button_media_filter_audio: mMediaAdapter.setMediaFilters(buttonIsChecked, MediaTabletProvider.TYPE_AUDIO); break; case R.id.button_media_filter_text: mMediaAdapter.setMediaFilters(buttonIsChecked, MediaTabletProvider.TYPE_TEXT); break; case R.id.button_media_filter_narratives: mMediaAdapter.setMediaFilters(buttonIsChecked, MediaTabletProvider.TYPE_NARRATIVE); break; } uncheckOtherFilterButtons(buttonId); } private void uncheckOtherFilterButtons(int currentButtonId) { int[] otherButtons = new int[] { R.id.button_media_filter_images, R.id.button_media_filter_videos, R.id.button_media_filter_audio, R.id.button_media_filter_text, R.id.button_media_filter_narratives }; for (int i = 0, n = otherButtons.length; i < n; i++) { final ToggleButton currentButton = ((ToggleButton) findViewById(otherButtons[i])); if ((currentButtonId == otherButtons[i] && currentButton.isChecked()) || (currentButtonId == 0 && currentButton.isChecked())) { currentButton.getBackground().setColorFilter(null); } else { currentButton.setChecked(false); currentButton.getBackground().setColorFilter(mToggleButtonFilter); } } } public void handlePersonIconClick(View personIcon) { if (mMediaVisibility == MediaItem.MEDIA_PUBLIC) { PersonItem ownerPerson = PersonManager.findPersonByInternalId(getContentResolver(), mParentId); Intent lockPatternIntent = new Intent(MediaBrowserActivity.this, LockPatternActivity.class); lockPatternIntent.putExtra(LockPatternActivity._Theme, android.R.style.Theme_Dialog); lockPatternIntent.putExtra(LockPatternActivity._Mode, LockPatternActivity.LPMode.ComparePattern); lockPatternIntent.putExtra(LockPatternActivity._MaxRetry, 1); // default: 5 lockPatternIntent.putExtra(LockPatternActivity._PaternSha1, ownerPerson.getPasswordHash()); startActivityForResult(lockPatternIntent, R.id.intent_lock_pattern); } else { mMediaVisibility = MediaItem.MEDIA_PUBLIC; mMediaAdapter.setVisibilityFilter(mMediaVisibility); PersonItem person = PersonManager.findPersonByInternalId(getContentResolver(), mParentId); person.setLockStatus(PersonItem.PERSON_LOCKED); PersonManager.updatePerson(getContentResolver(), person); addPersonalisedTabs(); // must remove and re-add - Android bug means setting text fails updateLockVisibility(); UIUtilities.showToast(MediaBrowserActivity.this, R.string.message_locking_person_success); } } private void viewHomesteads() { final Intent resultIntent = new Intent(); resultIntent.putExtra(getString(R.string.extra_finish_activity), true); resultIntent.putExtra(getString(R.string.extra_finish_parent_activities), true); // in case from public media setResult(Activity.RESULT_OK, resultIntent); // exit people browser too finish(); } public void handleButtonClicks(View currentButton) { switch (currentButton.getId()) { case R.id.button_media_view_homesteads: viewHomesteads(); break; case R.id.button_media_view_people: finish(); break; case R.id.button_media_view_public_media: viewPublicMedia(); break; } } private ReflectionTabListener mReflectionTabListener = new ReflectionTabListener() { @Override public void onTabSelected(int tabId) { switch (tabId) { case R.id.intent_homestead_browser: viewHomesteads(); break; case R.id.intent_people_browser: finish(); break; default: break; } } @Override public void onTabReselected(int tabId) { } @Override public void onTabUnselected(int tabId) { } }; private View.OnLongClickListener imageLongPressListener = new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if (mMediaVisibility == MediaItem.MEDIA_PRIVATE) { PersonItem person = PersonManager.findPersonByInternalId(getContentResolver(), mParentId); if (person != null) { editPerson(person.getParentId(), mParentId); return true; } return false; } return false; } }; public int getScrollState() { return mScrollState; // for MediaAdapter purposes } public boolean isPendingIconsUpdate() { return mPendingIconsUpdate; // for MediaAdapter purposes } private void onView(MediaViewHolder currentMediaHolder) { Class<?> launchClass = null; switch (currentMediaHolder.mediaType) { case MediaTabletProvider.TYPE_IMAGE_BACK: case MediaTabletProvider.TYPE_IMAGE_FRONT: case MediaTabletProvider.TYPE_UNKNOWN: launchClass = ImageViewerActivity.class; break; case MediaTabletProvider.TYPE_AUDIO: case MediaTabletProvider.TYPE_VIDEO: launchClass = AudioVideoViewerActivity.class; break; case MediaTabletProvider.TYPE_TEXT: launchClass = TextViewerActivity.class; break; case MediaTabletProvider.TYPE_NARRATIVE: launchClass = NarrativeViewerActivity.class; break; default: break; } if (launchClass != null) { Intent storyViewerIntent = new Intent(this, launchClass); storyViewerIntent.putExtra(getString(R.string.extra_internal_id), currentMediaHolder.mediaInternalId); storyViewerIntent.putExtra(getString(R.string.extra_parent_id), mParentId == null || PersonItem.UNKNOWN_PERSON_ID.equals(currentMediaHolder.mediaOwnerId) ? null : currentMediaHolder.mediaOwnerId); startActivityForResult(storyViewerIntent, R.id.intent_media_item_viewer); } } // private void dismissPopup() { // if (mPopup != null) { // mPopup.dismiss(); // } // } // private void showPopup() { // if (mPopup == null) { // PopupWindow p = new PopupWindow(this); // p.setFocusable(false); // p.setContentView(mCurrentGridPositionView); // p.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); // p.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); // p.setBackgroundDrawable(null); // // p.setAnimationStyle(R.style.PopupAnimation); // // mPopup = p; // } // // if (mGrid.getWindowVisibility() == View.VISIBLE) { // mPopup.showAtLocation(mGrid, Gravity.CENTER, 0, 0); // } // } // setBackgroundDrawable is deprecated from API 16+ (Jelly Bean), but we still want to target earlier versions; // since this is purely a name change, there's no real reason to do anything platform-independent @SuppressWarnings("deprecation") private void updateMediaIcons() { mPendingIconsUpdate = false; final GridView grid = mGrid; final FastBitmapDrawable icon = mDefaultIcon; final int count = grid.getChildCount(); // show a different icon depending on whether we're viewing from the public media or this person's media store final int iconVisibility = mParentId == null ? MediaItem.MEDIA_PUBLIC : MediaItem.MEDIA_PRIVATE; for (int i = 0; i < count; i++) { final View view = grid.getChildAt(i); final MediaViewHolder holder = (MediaViewHolder) view.getTag(); if (holder.queryIcon) { // if the icon has gone missing (recently imported or cache deletion), regenerate it String mediaCacheId = MediaItem.getCacheId(holder.mediaInternalId, iconVisibility); FastBitmapDrawable cachedIcon = ImageCacheUtilities.getCachedIcon(MediaTablet.DIRECTORY_THUMBS, mediaCacheId, ImageCacheUtilities.NULL_DRAWABLE); if (ImageCacheUtilities.NULL_DRAWABLE.equals(cachedIcon)) { MediaManager.reloadMediaIcon(getResources(), getContentResolver(), holder.mediaInternalId, iconVisibility); cachedIcon = ImageCacheUtilities.getCachedIcon(MediaTablet.DIRECTORY_THUMBS, mediaCacheId, icon); } CrossFadeDrawable d = holder.transition; d.setEnd(cachedIcon.getBitmap()); holder.display.setImageDrawable(d); d.startTransition(MediaTablet.ANIMATION_FADE_TRANSITION_DURATION); holder.loader.setVisibility(View.GONE); if (mParentId != null && holder.mediaVisibility == MediaItem.MEDIA_PUBLIC) { holder.overlay.setBackgroundResource(R.drawable.item_public); holder.overlay.setPadding(0, 0, 0, 0); } else { holder.overlay.setBackgroundDrawable(null); } holder.queryIcon = false; } } grid.invalidate(); } private void postUpdateMediaIcons() { Handler handler = mScrollHandler; Message message = handler.obtainMessage(MediaTablet.MESSAGE_UPDATE_GRID_ICONS, MediaBrowserActivity.this); handler.removeMessages(MediaTablet.MESSAGE_UPDATE_GRID_ICONS); mPendingIconsUpdate = true; handler.sendMessage(message); } private class ScrollManager implements AbsListView.OnScrollListener { // private String mPreviousPrefix; // private boolean mPopupWillShow; // private final Runnable mShowPopup = new Runnable() { // public void run() { // showPopup(); // } // }; // private final Runnable mDismissPopup = new Runnable() { // public void run() { // mScrollHandler.removeCallbacks(mShowPopup); // mPopupWillShow = false; // dismissPopup(); // } // }; public void onScrollStateChanged(AbsListView view, int scrollState) { if (mScrollState == SCROLL_STATE_FLING && scrollState != SCROLL_STATE_FLING) { final Handler handler = mScrollHandler; final Message message = handler.obtainMessage(MediaTablet.MESSAGE_UPDATE_GRID_ICONS, MediaBrowserActivity.this); handler.removeMessages(MediaTablet.MESSAGE_UPDATE_GRID_ICONS); handler.sendMessageDelayed(message, mFingerUp ? 0 : MediaTablet.ANIMATION_ICON_SHOW_DELAY); mPendingIconsUpdate = true; } else if (scrollState == SCROLL_STATE_FLING) { mPendingIconsUpdate = false; mScrollHandler.removeMessages(MediaTablet.MESSAGE_UPDATE_GRID_ICONS); } mScrollState = scrollState; } // TODO: fix this (see MediaPhone) public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (mScrollState != SCROLL_STATE_FLING) return; // final int count = view.getChildCount(); // if (count == 0) // return; // // final StringBuilder buffer = new StringBuilder(7); // // String title = Long.toString(((MediaViewHolder) view.getChildAt(0).getTag()).mediaDateCreated); // title = title.substring(0, Math.min(title.length(), 2)); // if (title.length() == 2) { // buffer.append(Character.toUpperCase(title.charAt(0))); // buffer.append(title.charAt(1)); // } else { // buffer.append(title.toUpperCase()); // } // // if (count > 1) { // buffer.append(" - "); // // final int lastChild = count - 1; // title = Long.toString(((MediaViewHolder) view.getChildAt(lastChild).getTag()).mediaDateCreated); // title = title.substring(0, Math.min(title.length(), 2)); // // if (title.length() == 2) { // buffer.append(Character.toUpperCase(title.charAt(0))); // buffer.append(title.charAt(1)); // } else { // buffer.append(title.toUpperCase()); // } // } // // final String prefix = buffer.toString(); // final Handler scrollHandler = mScrollHandler; // // if (!mPopupWillShow && (mPopup == null || !mPopup.isShowing()) && !prefix.equals(mPreviousPrefix)) { // // mPopupWillShow = true; // final Runnable showPopup = mShowPopup; // scrollHandler.removeCallbacks(showPopup); // scrollHandler.postDelayed(showPopup, MediaTablet.ANIMATION_GRIDHINT_SHOW_DELAY); // } // // mCurrentGridPositionText.setText(prefix); // mPreviousPrefix = prefix; // // final Runnable dismissPopup = mDismissPopup; // scrollHandler.removeCallbacks(dismissPopup); // scrollHandler.postDelayed(dismissPopup, MediaTablet.ANIMATION_GRIDHINT_HIDE_DELAY); } } private static class ScrollHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MediaTablet.MESSAGE_UPDATE_GRID_ICONS: ((MediaBrowserActivity) msg.obj).updateMediaIcons(); break; } } } private class FingerTracker implements View.OnTouchListener { public boolean onTouch(View view, MotionEvent event) { final int action = event.getAction(); mFingerUp = action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL; if (mFingerUp && mScrollState != ScrollManager.SCROLL_STATE_FLING) { postUpdateMediaIcons(); } return false; } } private class SelectionTracker implements AdapterView.OnItemSelectedListener { public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) { if (mScrollState != ScrollManager.SCROLL_STATE_IDLE) { mScrollState = ScrollManager.SCROLL_STATE_IDLE; postUpdateMediaIcons(); } } public void onNothingSelected(AdapterView<?> adapterView) { } } private class MediaViewer implements AdapterView.OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { MediaViewHolder currentMediaHolder = ((MediaViewHolder) view.getTag()); onView(currentMediaHolder); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent resultIntent) { switch (requestCode) { case R.id.intent_media_browser: case R.id.intent_media_item_viewer: if (resultCode == Activity.RESULT_OK && resultIntent != null) { if (resultIntent.getBooleanExtra(getString(R.string.extra_finish_activity), false)) { if (resultIntent.getBooleanExtra(getString(R.string.extra_finish_parent_activities), false)) { viewHomesteads(); } else { finish(); } } } break; case R.id.intent_lock_pattern: if (resultCode == Activity.RESULT_OK) { mMediaVisibility = MediaItem.MEDIA_PRIVATE; mMediaAdapter.setVisibilityFilter(mMediaVisibility); PersonItem person = PersonManager.findPersonByInternalId(getContentResolver(), mParentId); person.setLockStatus(PersonItem.PERSON_UNLOCKED); PersonManager.updatePerson(getContentResolver(), person); addPersonalisedTabs(); // must remove and re-add - Android bug means setting text fails updateLockVisibility(); UIUtilities.showToast(MediaBrowserActivity.this, R.string.message_unlocking_person_success); } else { UIUtilities.showToast(MediaBrowserActivity.this, R.string.message_unlocking_person_failed); } break; case R.id.intent_add_user: updateOwnerPicture(); break; default: super.onActivityResult(requestCode, resultCode, resultIntent); } } }