package com.steamcommunity.siplus.steamscreenshots;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import android.app.Fragment;
import android.content.Intent;
import android.content.res.Resources;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.TextView;
public class ScreenshotsImagesFragment extends Fragment {
static final String FRAGMENT_TAG = Utility.PACKAGE + ".ScreenshotsImagesFragment";
static final String STATE_SELECTED = FRAGMENT_TAG + ".STATE_SELECTED";
SteamshotsAccount mAccount;
ScreenshotsActivity mActivity;
ScreenshotsImagesAdapter mAdapter;
ArrayList<UploadedCaption> mCaptions;
UploadedCaption[] mCaptionsAtPositions;
String mGame;
Resources mResources;
int[] mScreenshots;
ArrayList<Integer> mSelected;
GridView widgetGrid;
TextView widgetSelect;
// Assuming that the data is sorted
void filterDeadSelected() {
ArrayList<Integer> old = mSelected;
if (old.isEmpty()) {
return;
}
int current;
int i = 0;
Iterator<Integer> iterator;
ArrayList<Integer> selected = new ArrayList<Integer>(mSelected.size());
int screenshot;
int[] screenshots = mScreenshots;
int length = screenshots.length;
for (iterator = old.iterator(); iterator.hasNext(); ) {
current = iterator.next();
for (; i < length; ++i) {
screenshot = screenshots[i];
if (screenshot == current) {
selected.add(current);
++i;
break;
}
if (screenshot < current) {
break;
}
}
if (i > length) {
break;
}
}
mSelected = selected;
mAdapter.notifyDataSetChanged();
mActivity.refreshActionBar();
}
void loadScreenshots() {
long steamID = mAccount.mSteamID;
File[] files = (new File(ScreenshotName.folderPath(steamID, mGame))).listFiles(new ScreenshotFileFilter(0));
int length;
if (files != null) {
length = files.length;
} else {
length = 0;
}
int i;
int[] screenshots = new int[length];
for (i = 0; i < length; ++i) {
screenshots[i] = ScreenshotName.nameToInt(files[i].getName());
}
UploadedCaption[] captionsArray = new UploadedCaption[length];
mCaptionsAtPositions = captionsArray;
mScreenshots = screenshots;
if (length == 0) {
mActivity.deselectGame();
mAdapter.notifyDataSetChanged();
return;
}
Arrays.sort(screenshots);
Utility.reverseArray(screenshots);
ArrayList<UploadedCaption> captions = UploadedCaption.fromFileSorted(steamID, mGame);
mCaptions = captions;
if (captions != null) {
// Because the list and the array are sorted, instead of doing search in array from 0 every time,
// we're searching in the array from the (last offset + 1).
UploadedCaption caption;
int captionScreenshot;
i = 0;
Iterator<UploadedCaption> iterator;
int screenshot;
for (iterator = captions.iterator(); iterator.hasNext(); ) {
caption = iterator.next();
captionScreenshot = caption.mScreenshot;
for (; i < length; ++i) {
screenshot = screenshots[i];
if (screenshot == captionScreenshot) {
captionsArray[i++] = caption;
break;
}
if (screenshot < captionScreenshot) {
break;
}
}
if (i >= length) {
break;
}
}
}
mAdapter.notifyDataSetChanged();
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
ScreenshotsActivity activity = (ScreenshotsActivity)(getActivity());
mActivity = activity;
mAccount = activity.mAccount;
mGame = activity.mGame;
mResources = activity.getResources();
View view = getView();
widgetGrid = (GridView)(view.findViewById(R.id.fragment_screenshots_images_grid));
widgetSelect = (TextView)(view.findViewById(R.id.fragment_screenshots_images_select));
if (mGame == null) {
widgetGrid.setVisibility(View.GONE);
widgetSelect.setVisibility(View.VISIBLE);
return;
}
mAdapter = new ScreenshotsImagesAdapter(this);
loadScreenshots();
if (savedInstanceState != null) {
mSelected = savedInstanceState.getIntegerArrayList(STATE_SELECTED);
if (mSelected != null) {
filterDeadSelected();
}
}
if (mSelected == null) {
mSelected = new ArrayList<Integer>(mScreenshots.length);
}
activity.refreshActionBar();
widgetGrid.setAdapter(mAdapter);
widgetGrid.setOnItemClickListener(new ScreenshotsImagesOnItemClick(this));
widgetGrid.setOnItemLongClickListener(new ScreenshotsImagesOnItemLongClick(this));
widgetGrid.setVisibility(View.VISIBLE);
widgetSelect.setVisibility(View.GONE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_screenshots_images, container, false);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntegerArrayList(STATE_SELECTED, mSelected);
}
void toggleSelection(int position) {
int current;
boolean deselected = false;
Iterator<Integer> iterator;
ArrayList<Integer> selected = mSelected;
int screenshot = mScreenshots[position];
for (iterator = selected.iterator(); iterator.hasNext(); ) {
current = iterator.next();
if (current == screenshot) {
iterator.remove();
mActivity.refreshActionBar();
deselected = true;
break;
}
}
if (!deselected) {
selected.add(screenshot);
Collections.sort(selected);
Collections.reverse(selected);
mActivity.refreshActionBar();
}
View view = widgetGrid.getChildAt(position - widgetGrid.getFirstVisiblePosition());
if (view != null) {
if (deselected) {
view.setBackgroundResource(0);
view.findViewById(R.id.grid_screenshot_selected).setVisibility(View.GONE);
} else {
view.setBackgroundResource(android.R.color.holo_blue_dark);
view.findViewById(R.id.grid_screenshot_selected).setVisibility(View.VISIBLE);
}
}
}
}
class ScreenshotsImagesAdapter extends BaseAdapter {
ScreenshotsImagesFragment mFragment;
LayoutInflater mLayoutInflater;
ScreenshotsImagesAdapter(ScreenshotsImagesFragment fragment) {
mFragment = fragment;
mLayoutInflater = fragment.mActivity.getLayoutInflater();
}
@Override
public int getCount() {
int[] screenshots = mFragment.mScreenshots;
if (screenshots == null) {
return 0;
}
return screenshots.length;
}
@Override
public Object getItem(int position) {
return getItemId(position);
}
@Override
public long getItemId(int position) {
int[] screenshots = mFragment.mScreenshots;
if (screenshots == null) {
return position;
}
return screenshots[position];
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ScreenshotsImagesFragment fragment = mFragment;
int[] screenshots = fragment.mScreenshots;
if (screenshots == null) {
return null;
}
View view = mLayoutInflater.inflate(R.layout.grid_screenshot, parent, false);
((ImageView)(view.findViewById(R.id.grid_screenshot_image))).setImageDrawable(
new BitmapDrawable(fragment.mResources, ScreenshotName.folderPath(fragment.mAccount.mSteamID, fragment.mGame) +
'/' + ScreenshotName.nameToString(fragment.mScreenshots[position]) + ScreenshotName.THUMB_SUFFIX));
view.findViewById(R.id.grid_screenshot_uploaded).setVisibility(
fragment.mCaptionsAtPositions[position] != null ? View.VISIBLE : View.GONE);
Iterator<Integer> iterator;
int screenshot = screenshots[position];
int selected;
for (iterator = fragment.mSelected.iterator(); iterator.hasNext(); ) {
selected = iterator.next();
if (selected != screenshot) {
continue;
}
view.setBackgroundResource(android.R.color.holo_blue_dark);
view.findViewById(R.id.grid_screenshot_selected).setVisibility(View.VISIBLE);
}
return view;
}
}
class ScreenshotsImagesOnItemClick implements OnItemClickListener {
ScreenshotsImagesFragment mFragment;
ScreenshotsImagesOnItemClick(ScreenshotsImagesFragment fragment) {
mFragment = fragment;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
ScreenshotsImagesFragment fragment = mFragment;
if (!fragment.mSelected.isEmpty()) {
fragment.toggleSelection(position);
return;
}
ScreenshotsActivity activity = fragment.mActivity;
activity.startActivity(new Intent(activity.getApplicationContext(), PreviewActivity.class)
.putExtra(PreviewActivity.EXTRASTATE_ACCOUNT, fragment.mAccount)
.putExtra(PreviewActivity.EXTRASTATE_GAME, fragment.mGame)
.putExtra(PreviewActivity.EXTRASTATE_SCREENSHOT, fragment.mScreenshots[position]));
}
}
class ScreenshotsImagesOnItemLongClick implements OnItemLongClickListener {
ScreenshotsImagesFragment mFragment;
ScreenshotsImagesOnItemLongClick(ScreenshotsImagesFragment fragment) {
mFragment = fragment;
}
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
mFragment.toggleSelection(position);
return true;
}
}