diff --git a/.gitmodules b/.gitmodules
index 7885bfd..700f96f 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -3,7 +3,7 @@
url = git://github.com/photo/facebook-android-sdk.git
[submodule "submodules/HoloEverywhere"]
path = submodules/HoloEverywhere
- url = git://github.com/Prototik/HoloEverywhere.git
+ url = git://github.com/httpdispatch/HoloEverywhere.git
[submodule "submodules/PhotoView"]
path = submodules/PhotoView
url = https://github.com/chrisbanes/PhotoView.git
diff --git a/app/libs/apache-mime4j-core-0.7.jar b/app/libs/apache-mime4j-core-0.7.jar
deleted file mode 100644
index e3c6252..0000000
Binary files a/app/libs/apache-mime4j-core-0.7.jar and /dev/null differ
diff --git a/app/libs/commons-codec-1.4.jar b/app/libs/commons-codec-1.4.jar
deleted file mode 100644
index 458d432..0000000
Binary files a/app/libs/commons-codec-1.4.jar and /dev/null differ
diff --git a/app/libs/httpmime-4.1.2.jar b/app/libs/httpmime-4.1.2.jar
deleted file mode 100644
index eea3b3f..0000000
Binary files a/app/libs/httpmime-4.1.2.jar and /dev/null differ
diff --git a/app/libs/libGoogleAnalyticsV2.jar b/app/libs/libGoogleAnalyticsV2.jar
deleted file mode 100644
index 46d0e44..0000000
Binary files a/app/libs/libGoogleAnalyticsV2.jar and /dev/null differ
diff --git a/app/libs/signpost-commonshttp4-1.2.1.1.jar b/app/libs/signpost-commonshttp4-1.2.1.1.jar
deleted file mode 100644
index 50e9838..0000000
Binary files a/app/libs/signpost-commonshttp4-1.2.1.1.jar and /dev/null differ
diff --git a/app/libs/signpost-core-1.2.1.1.jar b/app/libs/signpost-core-1.2.1.1.jar
deleted file mode 100644
index 59e7537..0000000
Binary files a/app/libs/signpost-core-1.2.1.1.jar and /dev/null differ
diff --git a/app/project.properties b/app/project.properties
index 400a648..18876eb 100644
--- a/app/project.properties
+++ b/app/project.properties
@@ -1,9 +1,9 @@
# Project target.
target=android-18
-android.library.reference.1=../submodules/facebook-android-sdk/facebook
-android.library.reference.2=../submodules/Android-Feather
-android.library.reference.3=../submodules/HoloEverywhere/addons/preferences
-android.library.reference.4=../submodules/HoloEverywhere/addons/slider
-android.library.reference.5=../submodules/google-play-services_lib
-android.library.reference.6=../submodules/viewpagerindicator/library
-android.library.reference.7=../common
+android.library.reference.1=..\\common
+android.library.reference.2=..\\submodules\\facebook-android-sdk\\facebook
+android.library.reference.3=..\\submodules\\Android-Feather
+android.library.reference.4=..\\submodules\\HoloEverywhere\\addons\\preferences
+android.library.reference.5=..\\submodules\\HoloEverywhere\\addons\\slider
+android.library.reference.6=..\\submodules\\google-play-services_lib
+android.library.reference.7=..\\submodules\\viewpagerindicator\\library
diff --git a/app/res/layout/fragment_sync_select_photos.xml b/app/res/layout/fragment_sync_select_photos.xml
deleted file mode 100644
index 96c6a33..0000000
--- a/app/res/layout/fragment_sync_select_photos.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/src/com/trovebox/android/app/MainActivity.java b/app/src/com/trovebox/android/app/MainActivity.java
index 9fd021b..a51ba1f 100644
--- a/app/src/com/trovebox/android/app/MainActivity.java
+++ b/app/src/com/trovebox/android/app/MainActivity.java
@@ -16,6 +16,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
+import android.view.KeyEvent;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.view.Menu;
@@ -47,8 +48,8 @@ import com.trovebox.android.common.util.GuiUtils;
import com.trovebox.android.common.util.LoadingControl;
import com.trovebox.android.common.util.ObjectAccessor;
import com.trovebox.android.common.util.SyncUtils;
-import com.trovebox.android.common.util.TrackerUtils;
import com.trovebox.android.common.util.SyncUtils.SyncStartedHandler;
+import com.trovebox.android.common.util.TrackerUtils;
@Addons(Activity.ADDON_SLIDER)
public class MainActivity extends CommonActivity implements LoadingControl, GalleryOpenControl,
@@ -422,17 +423,20 @@ public class MainActivity extends CommonActivity implements LoadingControl, Gall
}
@Override
- public void onBackPressed() {
- Fragment fragment = getCurrentFragment();
+ public boolean dispatchKeyEvent(android.view.KeyEvent event) {
+ final int keyCode = event.getKeyCode();
+
boolean proceed = true;
- if (fragment != null && fragment instanceof BackKeyControl)
- {
- proceed &= !((BackKeyControl) fragment).isBackKeyOverrode();
+ if (keyCode == KeyEvent.KEYCODE_BACK) {
+ Fragment fragment = getCurrentFragment();
+ if (fragment != null && fragment instanceof BackKeyControl) {
+ proceed &= !((BackKeyControl) fragment).isBackKeyOverrode();
+ }
}
- if (proceed)
- {
- super.onBackPressed();
+ if (proceed) {
+ return super.dispatchKeyEvent(event);
}
+ return proceed;
}
@Override
diff --git a/app/src/com/trovebox/android/app/SyncFragment.java b/app/src/com/trovebox/android/app/SyncFragment.java
index 10f36f0..423eaaf 100644
--- a/app/src/com/trovebox/android/app/SyncFragment.java
+++ b/app/src/com/trovebox/android/app/SyncFragment.java
@@ -313,10 +313,13 @@ public class SyncFragment extends CommonFragment implements NextStepFlow,
@Override
public boolean isBackKeyOverrode() {
- if (activeFragment != null && activeFragment == secondStepFragment)
+ if (activeFragment != null)
{
- activatePreviousStep();
- return true;
+ if (activeFragment == secondStepFragment) {
+ activatePreviousStep();
+ } else {
+ return firstStepFragment.isBackKeyOverrode();
+ }
}
return false;
}
diff --git a/app/src/com/trovebox/android/app/SyncImageSelectionFragment.java b/app/src/com/trovebox/android/app/SyncImageSelectionFragment.java
index 58db4d7..ca8d557 100644
--- a/app/src/com/trovebox/android/app/SyncImageSelectionFragment.java
+++ b/app/src/com/trovebox/android/app/SyncImageSelectionFragment.java
@@ -1,224 +1,35 @@
-
package com.trovebox.android.app;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.TreeSet;
-
-import org.holoeverywhere.LayoutInflater;
-import org.holoeverywhere.app.Activity;
-import org.holoeverywhere.widget.Switch;
-
-import android.content.Context;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.provider.MediaStore;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.ViewGroup.LayoutParams;
-import android.view.ViewTreeObserver;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.CompoundButton;
-import android.widget.CompoundButton.OnCheckedChangeListener;
-import android.widget.GridView;
-import android.widget.ImageView;
-
-import com.actionbarsherlock.view.Menu;
-import com.actionbarsherlock.view.MenuInflater;
-import com.actionbarsherlock.view.MenuItem;
-import com.trovebox.android.app.net.account.AccountLimitUtils2;
-import com.trovebox.android.common.bitmapfun.util.ImageCache;
-import com.trovebox.android.common.bitmapfun.util.ImageFileSystemFetcher;
-import com.trovebox.android.common.bitmapfun.util.ImageResizer;
-import com.trovebox.android.common.bitmapfun.util.ImageWorker.ImageWorkerAdapter;
-import com.trovebox.android.common.fragment.common.CommonRefreshableFragmentWithImageWorker;
-import com.trovebox.android.common.provider.UploadsProviderAccessor;
import com.trovebox.android.common.util.CommonUtils;
import com.trovebox.android.common.util.GuiUtils;
-import com.trovebox.android.common.util.LoadingControl;
import com.trovebox.android.common.util.TrackerUtils;
-import com.trovebox.android.common.util.concurrent.AsyncTaskEx;
-public class SyncImageSelectionFragment extends CommonRefreshableFragmentWithImageWorker
-{
- public static final String TAG = SyncImageSelectionFragment.class.getSimpleName();
- public static final String SELECTED_IMAGES = "SyncImageSelectionFragmentSelectedImages";
- public static final String IMAGE_WORKER_ADAPTER = "SyncImageSelectionFragmentAdapter";
+public class SyncImageSelectionFragment extends
+ com.trovebox.android.common.fragment.sync.SyncImageSelectionFragment {
- private LoadingControl loadingControl;
- private CustomImageAdapter mAdapter;
- private int mImageThumbSize;
- private int mImageThumbSpacing;
- private int mImageThumbBorder;
- private GridView photosGrid;
- ViewTreeObserver.OnGlobalLayoutListener photosGridListener;
NextStepFlow nextStepFlow;
- InitTask initTask = null;
- Switch stateSwitch;
- CustomImageWorkerAdapter customImageWorkerAdapter;
- SelectionController selectionController;
- @Override
- public void onCreate(Bundle savedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setHasOptionsMenu(true);
-
- mImageThumbSize = getResources().getDimensionPixelSize(
- R.dimen.image_thumbnail_size);
- mImageThumbSpacing = getResources().getDimensionPixelSize(
- R.dimen.image_thumbnail_spacing);
- mImageThumbBorder = getResources().getDimensionPixelSize(
- R.dimen.image_thumbnail_border);
-
- customImageWorkerAdapter = CommonUtils.getParcelableFromBundleIfNotNull(
- IMAGE_WORKER_ADAPTER, savedInstanceState);
- selectionController = CommonUtils.getParcelableFromBundleIfNotNull(SELECTED_IMAGES,
- savedInstanceState);
- if (selectionController == null)
- {
- selectionController = new SelectionController();
- }
- if (customImageWorkerAdapter != null)
- {
- mImageWorker.setAdapter(customImageWorkerAdapter);
- }
- mAdapter = new CustomImageAdapter(getActivity(), (ImageResizer) mImageWorker,
- selectionController);
+ public SyncImageSelectionFragment() {
+ super(R.layout.action_mode_sync, true, R.string.sync_next_button);
}
- @Override
- public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
- super.onCreateOptionsMenu(menu, inflater);
- inflater.inflate(R.menu.sync_image_selection, menu);
- }
@Override
- public boolean onOptionsItemSelected(MenuItem item) {
- switch (item.getItemId())
- {
- case R.id.menu_select_all: {
- TrackerUtils
- .trackOptionsMenuClickEvent("menu_select_all",
- SyncImageSelectionFragment.this);
- selectAll();
- return true;
- }
- case R.id.menu_select_none: {
- TrackerUtils.trackOptionsMenuClickEvent("menu_select_none",
- SyncImageSelectionFragment.this);
- selectNone();
- return true;
- }
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState)
- {
- super.onCreateView(inflater, container, savedInstanceState);
- View v = inflater.inflate(R.layout.fragment_sync_select_photos,
- container, false);
- return v;
- }
-
- @Override
- public void onViewCreated(View view, Bundle savedInstanceState) {
- super.onViewCreated(view, savedInstanceState);
- init(view);
- }
-
- @Override
- public void onDetach() {
- super.onDetach();
- if (mAdapter != null)
- {
- mAdapter.mItemHeight = 0;
- }
- }
-
- @Override
- public void onSaveInstanceState(Bundle outState) {
- super.onSaveInstanceState(outState);
- outState.putParcelable(SELECTED_IMAGES, selectionController);
- outState.putParcelable(IMAGE_WORKER_ADAPTER, customImageWorkerAdapter);
- }
-
- public void init(View v)
- {
- photosGrid = (GridView) v.findViewById(R.id.grid_photos);
- photosGrid.setAdapter(new DummyImageAdapter());
-
- // This listener is used to get the final width of the GridView and then
- // calculate the
- // number of columns and the width of each column. The width of each
- // column is variable
- // as the GridView has stretchMode=columnWidth. The column width is used
- // to set the height
- // of each view so we get nice square thumbnails.
- photosGridListener = new ViewTreeObserver.OnGlobalLayoutListener()
- {
- @Override
- public void onGlobalLayout()
- {
- if (mAdapter.mItemHeight == 0)
- {
- final int numColumns = (int) Math.floor(
- photosGrid.getWidth()
- / (mImageThumbSize
- + mImageThumbSpacing + mImageThumbBorder));
- if (numColumns > 0)
- {
- final int columnWidth =
- (photosGrid.getWidth() / numColumns)
- - mImageThumbSpacing;
- mAdapter.setItemHeight(columnWidth, columnWidth
- - 2 * mImageThumbBorder);
- if (BuildConfig.DEBUG)
- {
- CommonUtils.debug(TAG,
- "onCreateView - numColumns set to "
- + numColumns);
- }
- }
- }
- }
- };
- photosGrid.getViewTreeObserver().addOnGlobalLayoutListener(photosGridListener);
- final Button nextStepBtn = (Button) v.findViewById(R.id.nextBtn);
- nextStepBtn.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- TrackerUtils.trackButtonClickEvent("nextBtn", SyncImageSelectionFragment.this);
- if (isDataLoaded())
- {
- if (selectionController.hasSelected())
- {
- int selectedCount = getSelectedCount();
- nextStepBtn.setEnabled(false);
- com.trovebox.android.common.net.account.AccountLimitUtils.checkQuotaPerUploadAvailableAndRunAsync(new Runnable() {
+ protected void actionButtonPressed() {
+ super.actionButtonPressed();
+ TrackerUtils.trackButtonClickEvent("nextBtn", SyncImageSelectionFragment.this);
+ if (isDataLoaded()) {
+ if (getSelectedCount() > 0) {
+ int selectedCount = getSelectedCount();
+ com.trovebox.android.common.net.account.AccountLimitUtils
+ .checkQuotaPerUploadAvailableAndRunAsync(new Runnable() {
@Override
public void run() {
CommonUtils.debug(TAG, "Upload limit check passed");
TrackerUtils.trackLimitEvent("sync_move_to_second_step", "success");
- if (nextStepFlow != null)
- {
+ if (nextStepFlow != null) {
nextStepFlow.activateNextStep();
}
- nextStepBtn.setEnabled(true);
}
}, new Runnable() {
@@ -226,880 +37,29 @@ public class SyncImageSelectionFragment extends CommonRefreshableFragmentWithIma
public void run() {
CommonUtils.debug(TAG, "Upload limit check failed");
TrackerUtils.trackLimitEvent("sync_move_to_second_step", "fail");
- nextStepBtn.setEnabled(true);
}
}, selectedCount, loadingControl);
- } else
- {
- GuiUtils.alert(R.string.sync_please_pick_at_least_one_photo);
- }
- }
- }
- });
- stateSwitch = (Switch) v.findViewById(R.id.uploaded_state_switch);
- stateSwitch.setOnCheckedChangeListener(new OnCheckedChangeListener()
- {
-
- @Override
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked)
- {
- switchUploadState(isChecked);
- }
- });
- if (isDataLoaded())
- {
- photosGrid.setAdapter(mAdapter);
- } else
- {
- if (initTask == null)
- {
- refresh(v);
+ } else {
+ GuiUtils.alert(R.string.sync_please_pick_at_least_one_photo);
}
}
}
@Override
- protected void initImageWorker()
- {
- mImageWorker = new CustomImageFileSystemFetcher(getActivity(),
- loadingControl,
- mImageThumbSize);
- mImageWorker.setLoadingImage(R.drawable.empty_photo);
-
- mImageWorker.setImageCache(ImageCache.findOrCreateCache(getActivity(),
- ImageCache.LOCAL_THUMBS_CACHE_DIR, 1500, true, false));
+ public void pageDeactivated() {
+ super.pageDeactivated();
+ leaveSelectionMode();
}
- protected void switchUploadState(boolean isChecked)
- {
- if (isDataLoaded())
- {
- customImageWorkerAdapter.setFiltered(!isChecked);
- mAdapter.notifyDataSetChanged();
- }
- }
-
- protected void selectAll()
- {
- if (isDataLoaded())
- {
- for (int i = 0, size = customImageWorkerAdapter.getSize(); i < size; i++)
- {
- ImageData imageData = (ImageData) customImageWorkerAdapter.getItem(i);
- if (imageData != null &&
- !selectionController.isSelected(imageData.id)
- && !customImageWorkerAdapter.isProcessedValue(imageData))
- {
- selectionController.addToSelected(imageData.id);
- }
- }
- mAdapter.notifyDataSetChanged();
- }
- }
-
- protected void selectNone()
- {
- if (isDataLoaded())
- {
- selectionController.clearSelection();
- mAdapter.notifyDataSetChanged();
- }
- }
-
- @Override
- public void onAttach(Activity activity)
- {
- super.onAttach(activity);
- loadingControl = ((LoadingControl) activity);
-
- }
-
- @Override
- public void refresh()
- {
- refresh(getView());
- }
-
- void refresh(View v)
- {
- if (initTask == null)
- {
- initTask = new InitTask();
- initTask.execute();
- }
- }
-
- public boolean isDataLoaded()
- {
- return customImageWorkerAdapter != null;
- }
-
- @Override
- public void onResume()
- {
- super.onResume();
- if (isDataLoaded())
- {
- mAdapter.notifyDataSetChanged();
- }
- }
-
- @Override
- public void onDestroyView()
- {
- super.onDestroyView();
- if (initTask != null)
- {
- initTask.cancel(true);
- }
- GuiUtils.removeGlobalOnLayoutListener(photosGrid, photosGridListener);
-
- }
-
- public void clear()
- {
- selectionController.clearSelection();
- }
-
- /**
- * Get the selected images count
- *
- * @return
- */
- public int getSelectedCount() {
- if (selectionController == null)
- {
- return 0;
- }
- return selectionController.selectedIds.size();
- }
-
- public ArrayList getSelectedFileNames()
- {
- long start = System.currentTimeMillis();
- ArrayList result = new ArrayList();
- if (customImageWorkerAdapter == null)
- {
- return result;
- }
- for (int i = 0, size = customImageWorkerAdapter.getSize(); i < size; i++)
- {
- ImageData imageData = (ImageData) customImageWorkerAdapter.getItem(i);
- if (imageData != null && selectionController.isSelected(imageData.id))
- {
- result.add(imageData.data);
- }
- }
- TrackerUtils.trackDataProcessingTiming(System.currentTimeMillis() - start,
- "getSelectedFileNames",
- TAG);
- return result;
- }
-
- public NextStepFlow getNextStepFlow()
- {
+ public NextStepFlow getNextStepFlow() {
return nextStepFlow;
}
- public void setNextStepFlow(NextStepFlow nextStepFlow)
- {
+ public void setNextStepFlow(NextStepFlow nextStepFlow) {
this.nextStepFlow = nextStepFlow;
}
- static interface NextStepFlow
- {
+ static interface NextStepFlow {
void activateNextStep();
}
-
- public void addProcessedValues(List values)
- {
- if (isDataLoaded())
- {
- customImageWorkerAdapter.addProcessedValues(values);
- mAdapter.notifyDataSetChanged();
- }
- }
-
- public static class ImageData implements Parcelable
- {
- public long id;
- public String data;
- public String folder;
-
- public ImageData(long id, String data)
- {
- super();
- this.id = id;
- this.data = data;
- folder = getFolderFromPath(data);
- }
-
- /**
- * Get the parent folder name for the specified path
- *
- * @param path
- * @return
- */
- public String getFolderFromPath(String path)
- {
- if (path == null)
- {
- return null;
- }
- int p = path.lastIndexOf("/");
- String result = "";
- if (p > 0)
- {
- int p2 = path.lastIndexOf("/", p - 1);
- if (p2 != -1)
- {
- result = path.substring(p2 + 1, p);
- }
- }
- CommonUtils.debug(TAG, "getFolderFromPath: fileName '%1$s; folderName '%2$s'", path,
- result);
- return result;
- }
-
- @Override
- public String toString()
- {
- return data;
- }
-
- /*****************************
- * PARCELABLE IMPLEMENTATION *
- *****************************/
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- out.writeLong(id);
- out.writeString(data);
- out.writeString(folder);
- }
-
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- @Override
- public ImageData createFromParcel(Parcel in) {
- return new ImageData(in);
- }
-
- @Override
- public ImageData[] newArray(int size) {
- return new ImageData[size];
- }
- };
-
- private ImageData(Parcel in) {
- id = in.readLong();
- data = in.readString();
- folder = in.readString();
- }
- }
-
- private class InitTask extends
- AsyncTaskEx
- {
- CustomImageWorkerAdapter adapter;
-
- @Override
- protected Boolean doInBackground(Void... params)
- {
- try
- {
- adapter = new CustomImageWorkerAdapter();
- return true;
- } catch (Exception e)
- {
- GuiUtils.error(TAG,
- null,
- e);
- }
- return false;
- }
-
- @Override
- protected void onPreExecute()
- {
- super.onPreExecute();
- loadingControl.startLoading();
- photosGrid.setAdapter(new DummyImageAdapter());
- customImageWorkerAdapter = null;
- mImageWorker.setAdapter(null);
- selectionController.clearSelection();
- }
-
- @Override
- protected void onCancelled()
- {
- super.onCancelled();
- loadingControl.stopLoading();
- initTask = null;
- }
-
- @Override
- protected void onPostExecute(Boolean result)
- {
- super.onPostExecute(result);
- loadingControl.stopLoading();
- initTask = null;
- if (!isCancelled())
- {
- adapter.setFiltered(!stateSwitch.isChecked());
- customImageWorkerAdapter = adapter;
- mImageWorker.setAdapter(adapter);
- if (photosGrid != null)
- {
- selectionController.clearSelection();
- photosGrid.setAdapter(mAdapter);
- }
- }
- }
-
- }
-
- public static class SelectionController implements Parcelable
- {
- Set selectedIds = new TreeSet();
-
- public SelectionController()
- {
-
- }
-
- public boolean isSelected(final long id)
- {
- return selectedIds.contains(id);
- }
-
- public void addToSelected(final long id)
- {
- selectedIds.add(id);
- }
-
- public void removeFromSelected(final long id)
- {
- selectedIds.remove(id);
- }
-
- void clearSelection()
- {
- selectedIds.clear();
- }
-
- boolean hasSelected()
- {
- return !selectedIds.isEmpty();
- }
-
- /*****************************
- * PARCELABLE IMPLEMENTATION *
- *****************************/
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- out.writeInt(selectedIds.size());
- for (Long id : selectedIds)
- {
- out.writeLong(id);
- }
- }
-
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- @Override
- public SelectionController createFromParcel(Parcel in) {
- return new SelectionController(in);
- }
-
- @Override
- public SelectionController[] newArray(int size) {
- return new SelectionController[size];
- }
- };
-
- private SelectionController(Parcel in) {
- int size = in.readInt();
- for (int i = 0; i < size; i++)
- {
- selectedIds.add(in.readLong());
- }
- }
- }
-
- private class DummyImageAdapter extends BaseAdapter
- {
-
- @Override
- public int getCount() {
- return 0;
- }
-
- @Override
- public Object getItem(int position) {
- return null;
- }
-
- @Override
- public long getItemId(int position) {
- return 0;
- }
-
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- return null;
- }
-
- }
-
- private class CustomImageAdapter extends ImageAdapter {
- SelectionController selectionController;
-
- public CustomImageAdapter(Context context, ImageResizer imageWorker,
- SelectionController selectionController)
- {
- super(context, imageWorker);
- this.selectionController = selectionController;
- }
-
- @Override
- public View getViewAdditional(int position, View convertView,
- ViewGroup container)
- {
- // Now handle the main ImageView thumbnails
- final ViewHolder holder;
- if (convertView == null)
- { // if it's not recycled, instantiate and initialize
- convertView = layoutInflater.inflate(
- R.layout.item_sync_image, null);
- convertView.setLayoutParams(mImageViewLayoutParams);
- holder = new ViewHolder();
- holder.selectedOverlay = convertView
- .findViewById(R.id.selection_overlay);
- holder.uploadedOverlay = convertView
- .findViewById(R.id.uploaded_overlay);
- holder.imageContainer = convertView.findViewById(R.id.imageContainer);
- holder.imageView = (ImageView) convertView.findViewById(R.id.image);
- convertView.setTag(holder);
- } else
- { // Otherwise re-use the converted view
- holder = (ViewHolder) convertView.getTag();
- }
-
- // Check the height matches our calculated column width
- if (convertView.getLayoutParams().height != mItemHeight)
- {
- convertView.setLayoutParams(mImageViewLayoutParams);
- }
- ImageData value = (ImageData) getItem(position);
- final long id = value.id;
-
- holder.selectedOverlay.setVisibility(selectionController.isSelected(id) ?
- View.VISIBLE : View.INVISIBLE);
- boolean isProcessed = customImageWorkerAdapter
- .isProcessedValue(value);
- holder.uploadedOverlay.setVisibility(isProcessed ?
- View.VISIBLE : View.INVISIBLE);
- if (isProcessed)
- {
- holder.imageContainer.setOnClickListener(null);
- } else
- {
- holder.imageContainer.setOnClickListener(new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- TrackerUtils.trackButtonClickEvent("imageContainer",
- SyncImageSelectionFragment.this);
- boolean selected = selectionController.isSelected(id);
- if (selected)
- {
- selectionController.removeFromSelected(id);
- } else
- {
- selectionController.addToSelected(id);
- }
- holder.selectedOverlay.setVisibility(selectionController.isSelected(id) ?
- View.VISIBLE : View.INVISIBLE);
- }
-
- });
- }
- // Finally load the image asynchronously into the ImageView, this
- // also takes care of
- // setting a placeholder image while the background thread runs
- mImageWorker.loadImage(position, holder.imageView);
- return convertView;
- }
-
- protected class ViewHolder
- {
- View selectedOverlay;
- View uploadedOverlay;
- View imageContainer;
- ImageView imageView;
- }
- }
-
- /**
- * The main adapter that backs the GridView. This is fairly standard except
- * the number of columns in the GridView is used to create a fake top row of
- * empty views as we use a transparent ActionBar and don't want the real top
- * row of images to start off covered by it.
- */
- private static class ImageAdapter extends BaseAdapter {
-
- protected final Context mContext;
- protected int mItemHeight = 0;
- protected GridView.LayoutParams mImageViewLayoutParams;
- private ImageResizer mImageWorker;
- LayoutInflater layoutInflater;
-
- public ImageAdapter(Context context, ImageResizer imageWorker)
- {
- super();
- mContext = context;
- this.mImageWorker = imageWorker;
- this.layoutInflater = LayoutInflater.from(context);
- mImageViewLayoutParams = new GridView.LayoutParams(
- LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
- }
-
- @Override
- public int getCount()
- {
- return mImageWorker.getAdapter().getSize();
- }
-
- @Override
- public Object getItem(int position)
- {
- return mImageWorker.getAdapter().getItem(position);
- }
-
- @Override
- public long getItemId(int position)
- {
- return position;
- }
-
- @Override
- public boolean hasStableIds()
- {
- return true;
- }
-
- @Override
- public final View getView(int position, View convertView,
- ViewGroup container)
- {
- return getViewAdditional(position, convertView, container);
- }
-
- public View getViewAdditional(int position, View convertView,
- ViewGroup container)
- {
- // Now handle the main ImageView thumbnails
- ImageView imageView;
- if (convertView == null)
- { // if it's not recycled, instantiate and initialize
- imageView = new ImageView(mContext);
- imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
- imageView.setLayoutParams(mImageViewLayoutParams);
- } else
- { // Otherwise re-use the converted view
- imageView = (ImageView) convertView;
- }
-
- // Check the height matches our calculated column width
- if (imageView.getLayoutParams().height != mItemHeight)
- {
- imageView.setLayoutParams(mImageViewLayoutParams);
- }
- // Finally load the image asynchronously into the ImageView, this
- // also takes care of
- // setting a placeholder image while the background thread runs
- mImageWorker.loadImage(position, imageView);
- return imageView;
- }
-
- /**
- * Sets the item height. Useful for when we know the column width so the
- * height can be set to match.
- *
- * @param height
- */
- public void setItemHeight(int height, int imageHeight)
- {
- if (height == mItemHeight)
- {
- return;
- }
- mItemHeight = height;
- mImageViewLayoutParams =
- new GridView.LayoutParams(LayoutParams.MATCH_PARENT,
- mItemHeight);
- mImageWorker.setImageSize(imageHeight);
- notifyDataSetChanged();
- }
- }
-
- private class CustomImageFileSystemFetcher extends ImageFileSystemFetcher
- {
- public CustomImageFileSystemFetcher(Context context,
- LoadingControl loadingControl, int imageSize)
- {
- super(context, loadingControl, imageSize);
- }
-
- public CustomImageFileSystemFetcher(Context context,
- LoadingControl loadingControl, int imageWidth,
- int imageHeight)
- {
- super(context, loadingControl, imageWidth, imageHeight);
- }
-
- @Override
- protected Bitmap processBitmap(Object data, ProcessingState processingState) {
- ImageData imageData = (ImageData) data;
- return super.processBitmap(imageData.data, processingState);
- }
- }
-
- public static class CustomImageWorkerAdapter extends
- ImageWorkerAdapter implements Parcelable
- {
- public List all;
- public Set processedValues;
-
- public List filteredIndexes;
-
- public boolean filtered = false;
-
- public CustomImageWorkerAdapter()
- {
- loadGallery();
- loadProcessedValues();
- sort();
- }
-
- public CustomImageWorkerAdapter(
- List all,
- Set processedValues,
- List filteredIndexes,
- boolean filtered)
- {
- this.all = all;
- this.processedValues = processedValues;
- this.filteredIndexes = filteredIndexes;
- this.filtered = filtered;
- }
-
- public void loadGallery()
- {
- long start = System.currentTimeMillis();
- String[] projection =
- {
- MediaStore.Images.Media._ID,
- MediaStore.Images.Media.DATA
- };
- Cursor cursor = TroveboxApplication.getContext().getContentResolver().query(
- MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
- projection, // Which columns to return
- null, // Return all rows
- null,
- MediaStore.Images.Media.BUCKET_ID);
- if (cursor != null)
- {
- try
- {
- int count = cursor.getCount();
- all = new ArrayList(count);
- while (cursor.moveToNext())
- {
- int ind = 0;
- all.add(new ImageData(cursor.getLong(ind++), cursor
- .getString(ind)));
- }
- } finally
- {
-
- cursor.close();
- }
- } else
- {
- all = new ArrayList();
- }
- TrackerUtils.trackDataLoadTiming(System.currentTimeMillis() - start, "localGallery",
- TAG);
- }
-
- public void loadProcessedValues()
- {
- UploadsProviderAccessor uploads = new UploadsProviderAccessor(
- TroveboxApplication.getContext());
- List fileNames = uploads
- .getUploadedOrPendingPhotosFileNames();
- processedValues = new TreeSet(fileNames);
- }
-
- @Override
- public int getSize()
- {
- return filteredIndexes == null ? all.size() : filteredIndexes
- .size();
- }
-
- @Override
- public Object getItem(int num)
- {
- return filteredIndexes == null ? all.get(num) : all
- .get(filteredIndexes.get(num));
- }
-
- public void setFiltered(boolean filtered)
- {
- if (filtered)
- {
- long start = System.currentTimeMillis();
- filteredIndexes = new ArrayList();
-
- for (int i = 0, size = all.size(); i < size; i++)
- {
- ImageData value = all.get(i);
- if (!isProcessedValue(value))
- {
- filteredIndexes.add(i);
- }
- }
- TrackerUtils.trackDataProcessingTiming(System.currentTimeMillis() - start,
- "imageFilter", TAG);
- } else
- {
- filteredIndexes = null;
- }
- this.filtered = filtered;
- }
-
- public boolean isProcessedValue(ImageData value)
- {
- return processedValues.contains(value.data);
- }
-
- public void addProcessedValues(List values)
- {
- processedValues.addAll(values);
- sort();
- setFiltered(filtered);
- }
-
- public void clearProcessedValues()
- {
- processedValues.clear();
- sort();
- setFiltered(filtered);
- }
-
- void sort()
- {
- Collections.sort(all, new Comparator()
- {
- @Override
- public int compare(ImageData lhs, ImageData rhs)
- {
- int result;
- boolean leftProcessed = isProcessedValue(lhs);
- boolean rightProcessed = isProcessedValue(rhs);
- if (leftProcessed == rightProcessed)
- {
- result = 0;
- } else
- {
- result = leftProcessed ? -1 : 1;
- }
- if (result == 0)
- {
- if (lhs.folder == null) {
- result = -1;
- } else if (rhs.folder == null)
- {
- result = 1;
- } else
- {
- result = lhs.folder.toLowerCase().compareTo(rhs.folder.toLowerCase());
- }
- }
- return result;
- }
- });
- }
-
- /*****************************
- * PARCELABLE IMPLEMENTATION *
- *****************************/
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel out, int flags) {
- out.writeList(all);
- out.writeInt(processedValues.size());
- for (String value : processedValues)
- {
- out.writeString(value);
- }
- out.writeList(filteredIndexes);
- out.writeByte((byte) (filtered ? 1 : 0));
- }
-
- public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
- @Override
- public CustomImageWorkerAdapter createFromParcel(Parcel in) {
- return new CustomImageWorkerAdapter(in);
- }
-
- @Override
- public CustomImageWorkerAdapter[] newArray(int size) {
- return new CustomImageWorkerAdapter[size];
- }
- };
-
- @SuppressWarnings("unchecked")
- private CustomImageWorkerAdapter(Parcel in) {
- all = in.readArrayList(getClass().getClassLoader());
- int size = in.readInt();
- processedValues = new TreeSet();
- for (int i = 0; i < size; i++)
- {
- processedValues.add(in.readString());
- }
- filteredIndexes = in.readArrayList(getClass().getClassLoader());
- filtered = in.readByte() == 1;
- }
- }
-
- public void uploadsCleared()
- {
- if (isDataLoaded())
- {
- customImageWorkerAdapter.clearProcessedValues();
- mAdapter.notifyDataSetChanged();
- }
- }
-
- @Override
- protected boolean isRefreshMenuVisible() {
- return !loadingControl.isLoading();
- }
}
diff --git a/submodules/HoloEverywhere b/submodules/HoloEverywhere
index 0204479..b5b9b87 160000
--- a/submodules/HoloEverywhere
+++ b/submodules/HoloEverywhere
@@ -1 +1 @@
-Subproject commit 020447990b7d0a1954984a57122b0f027d7bd843
+Subproject commit b5b9b87e1a282fafc75a83b4904bb368ed17b690