Bladeren bron

Merge pull request #143 from nextcloud/pinchZoom

Pinch zoom
Mario Đanić 7 jaren geleden
bovenliggende
commit
3cc07cdb61

+ 0 - 0
src/com/owncloud/android/ui/fragment/ExtendedListFragment.java


+ 1 - 0
src/main/AndroidManifest.xml

@@ -71,6 +71,7 @@
         <activity
             android:name=".ui.activity.FileDisplayActivity"
             android:label="@string/app_name"
+            android:configChanges="orientation|screenSize"
             android:theme="@style/Theme.ownCloud.Toolbar.Drawer">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />

+ 29 - 6
src/main/java/com/owncloud/android/db/PreferenceManager.java

@@ -38,6 +38,7 @@ public abstract class PreferenceManager {
     private static final String AUTO_PREF__UPLOAD_FILE_EXTENSION_MAP_URL = "prefs_upload_file_extension_map_url";
     private static final String AUTO_PREF__UPLOAD_FILE_EXTENSION_URL = "prefs_upload_file_extension_url";
     private static final String AUTO_PREF__UPLOADER_BEHAVIOR = "prefs_uploader_behaviour";
+    private static final String AUTO_PREF__GRID_COLUMNS = "grid_columns";
     private static final String PREF__INSTANT_UPLOADING = "instant_uploading";
     private static final String PREF__INSTANT_VIDEO_UPLOADING = "instant_video_uploading";
     private static final String PREF__INSTANT_UPLOAD_PATH_USE_SUBFOLDERS = "instant_upload_path_use_subfolders";
@@ -259,16 +260,34 @@ public abstract class PreferenceManager {
         saveIntPreference(context, AUTO_PREF__UPLOADER_BEHAVIOR, uploaderBehaviour);
     }
 
+    /**
+     * Gets the grid columns which the user has set last.
+     *
+     * @param context Caller {@link Context}, used to access to shared preferences manager.
+     * @return grid columns     grid columns
+     */
+    public static float getGridColumns(Context context) {
+        return getDefaultSharedPreferences(context).getFloat(AUTO_PREF__GRID_COLUMNS, -1.0f);
+    }
+
+    /**
+     * Saves the grid columns which the user has set last.
+     *
+     * @param context   Caller {@link Context}, used to access to shared preferences manager.
+     * @param gridColumns the uploader behavior
+     */
+    public static void setGridColumns(Context context, float gridColumns) {
+        saveFloatPreference(context, AUTO_PREF__GRID_COLUMNS, gridColumns);
+    }
+
     public static void saveBooleanPreference(Context context, String key, boolean value) {
         SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit();
-        appPreferences.putBoolean(key, value);
-        appPreferences.apply();
+        appPreferences.putBoolean(key, value).apply();
     }
 
     private static void saveStringPreference(Context context, String key, String value) {
         SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit();
-        appPreferences.putString(key, value);
-        appPreferences.apply();
+        appPreferences.putString(key, value).apply();
     }
 
     private static void saveStringPreferenceNow(Context context, String key, String value) {
@@ -279,8 +298,12 @@ public abstract class PreferenceManager {
 
     private static void saveIntPreference(Context context, String key, int value) {
         SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit();
-        appPreferences.putInt(key, value);
-        appPreferences.apply();
+        appPreferences.putInt(key, value).apply();
+    }
+
+    public static void saveFloatPreference(Context context, String key, float value) {
+        SharedPreferences.Editor appPreferences = getDefaultSharedPreferences(context.getApplicationContext()).edit();
+        appPreferences.putFloat(key, value).apply();
     }
 
     private static void saveLongPreference(Context context, String key, long value) {

+ 10 - 6
src/main/java/com/owncloud/android/ui/adapter/FileListListAdapter.java

@@ -77,6 +77,7 @@ import java.util.Vector;
  */
 public class FileListListAdapter extends BaseAdapter {
 
+    public static final int showFilenameColumnThreshold = 4;
     private Context mContext;
     private Vector<OCFile> mFilesAll = new Vector<OCFile>();
     private Vector<OCFile> mFiles = null;
@@ -252,9 +253,15 @@ public class FileListListAdapter extends BaseAdapter {
                 case GRID_ITEM:
                     // filename
                     fileName = (TextView) view.findViewById(R.id.Filename);
+
                     name = file.getFileName();
                     fileName.setText(name);
 
+                    if (OCFileListFragmentInterface.getColumnSize() > showFilenameColumnThreshold
+                            && viewType == ViewType.GRID_ITEM) {
+                        fileName.setVisibility(View.GONE);
+                    }
+
                 case GRID_IMAGE:
                     // sharedIcon
                     ImageView sharedIconV = (ImageView) view.findViewById(R.id.sharedIcon);
@@ -273,12 +280,9 @@ public class FileListListAdapter extends BaseAdapter {
                     // local state
                     ImageView localStateView = (ImageView) view.findViewById(R.id.localFileIndicator);
                     localStateView.bringToFront();
-                    FileDownloaderBinder downloaderBinder =
-                            mTransferServiceGetter.getFileDownloaderBinder();
-                    FileUploaderBinder uploaderBinder =
-                            mTransferServiceGetter.getFileUploaderBinder();
-                    OperationsServiceBinder opsBinder =
-                            mTransferServiceGetter.getOperationsServiceBinder();
+                    FileDownloaderBinder downloaderBinder = mTransferServiceGetter.getFileDownloaderBinder();
+                    FileUploaderBinder uploaderBinder = mTransferServiceGetter.getFileUploaderBinder();
+                    OperationsServiceBinder opsBinder = mTransferServiceGetter.getOperationsServiceBinder();
 
                     localStateView.setVisibility(View.INVISIBLE);   // default first
 

+ 101 - 4
src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -23,6 +23,7 @@ package com.owncloud.android.ui.fragment;
 
 import android.animation.LayoutTransition;
 import android.app.Activity;
+import android.content.res.Configuration;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
@@ -35,10 +36,13 @@ import android.support.v4.widget.SwipeRefreshLayout;
 import android.support.v7.widget.SearchView;
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
+import android.view.GestureDetector;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.ScaleGestureDetector;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.ViewTreeObserver;
@@ -58,6 +62,7 @@ import com.getbase.floatingactionbutton.FloatingActionsMenu;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.db.PreferenceManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.files.SearchOperation;
 import com.owncloud.android.ui.ExtendedListView;
@@ -77,8 +82,6 @@ import java.util.ArrayList;
 
 import third_parties.in.srain.cube.GridViewWithHeaderAndFooter;
 
-import static android.content.res.Configuration.ORIENTATION_LANDSCAPE;
-
 public class ExtendedListFragment extends Fragment
         implements OnItemClickListener, OnEnforceableRefreshListener, SearchView.OnQueryTextListener {
 
@@ -92,7 +95,13 @@ public class ExtendedListFragment extends Fragment
     private static final String KEY_HEIGHT_CELL = "HEIGHT_CELL";
     private static final String KEY_EMPTY_LIST_MESSAGE = "EMPTY_LIST_MESSAGE";
     private static final String KEY_IS_GRID_VISIBLE = "IS_GRID_VISIBLE";
+    public static final float minColumnSize = 2.0f;
+
+    private int maxColumnSize = 5;
+    private int maxColumnSizePortrait = 5;
+    private int maxColumnSizeLandscape = 10;
 
+    private ScaleGestureDetector mScaleGestureDetector = null;
     protected SwipeRefreshLayout mRefreshListLayout;
     protected SwipeRefreshLayout mRefreshGridLayout;
     protected SwipeRefreshLayout mRefreshEmptyLayout;
@@ -126,6 +135,8 @@ public class ExtendedListFragment extends Fragment
     protected SearchView searchView;
     private Handler handler = new Handler();
 
+    private float mScale = -1f;
+
     @Parcel
     public enum SearchType {
         NO_SEARCH,
@@ -208,7 +219,7 @@ public class ExtendedListFragment extends Fragment
         if ((activity = getActivity()) != null) {
             activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
             int width = displaymetrics.widthPixels;
-            if (getResources().getConfiguration().orientation == ORIENTATION_LANDSCAPE) {
+            if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
                 searchView.setMaxWidth((int) (width * 0.4));
             } else {
                 if (activity instanceof FolderPickerActivity) {
@@ -369,11 +380,40 @@ public class ExtendedListFragment extends Fragment
         mListFooterView = inflater.inflate(R.layout.list_footer, null, false);
 
         mGridView = (GridViewWithHeaderAndFooter) (v.findViewById(R.id.grid_root));
-        mGridView.setNumColumns(GridView.AUTO_FIT);
+
+        mScale = PreferenceManager.getGridColumns(getContext());
+        setGridViewColumns(1f);
+
         mGridView.setOnItemClickListener(this);
 
         mGridFooterView = inflater.inflate(R.layout.list_footer, null, false);
 
+        mScaleGestureDetector = new ScaleGestureDetector(MainApp.getAppContext(),new ScaleListener());
+
+        mGridView.setOnTouchListener(new View.OnTouchListener() {
+            @Override
+            public boolean onTouch(View view, MotionEvent motionEvent) {
+                mScaleGestureDetector.onTouchEvent(motionEvent);
+
+                if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
+                    view.performClick();
+                }
+
+                return false;
+            }
+        });
+
+        if (savedInstanceState != null) {
+            int referencePosition = savedInstanceState.getInt(KEY_SAVED_LIST_POSITION);
+            if (mCurrentListView!= null && mCurrentListView.equals(mListView)) {
+                Log_OC.v(TAG, "Setting and centering around list position " + referencePosition);
+                mListView.setAndCenterSelection(referencePosition);
+            } else {
+                Log_OC.v(TAG, "Setting grid position " + referencePosition);
+                mGridView.setSelection(referencePosition);
+            }
+        }
+
         // Pull-down to refresh layout
         mRefreshListLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_containing_list);
         mRefreshGridLayout = (SwipeRefreshLayout) v.findViewById(R.id.swipe_containing_grid);
@@ -430,6 +470,38 @@ public class ExtendedListFragment extends Fragment
         mEmptyListContainer.setVisibility(View.VISIBLE);
     }
 
+    private class SingleTapConfirm extends GestureDetector.SimpleOnGestureListener {
+        @Override
+        public boolean onSingleTapUp(MotionEvent e) {
+            return true;
+        }
+    }
+
+    private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
+        @Override
+        public boolean onScale(ScaleGestureDetector detector) {
+            setGridViewColumns(detector.getScaleFactor());
+
+            PreferenceManager.setGridColumns(getContext(), mScale);
+
+            mAdapter.notifyDataSetChanged();
+
+            return true;
+        }
+    }
+
+    private void setGridViewColumns(float scaleFactor) {
+        if (mScale == -1f) {
+            mGridView.setNumColumns(GridView.AUTO_FIT);
+            mScale = mGridView.getNumColumns();
+        }
+        mScale *= 1.f - (scaleFactor - 1.f);
+        mScale = Math.max(minColumnSize, Math.min(mScale, maxColumnSize));
+        Integer scaleInt = Math.round(mScale);
+        mGridView.setNumColumns(scaleInt);
+        mGridView.invalidateViews();
+    }
+
     protected void setupEmptyList(View view) {
         mEmptyListContainer = (LinearLayout) view.findViewById(R.id.empty_list_view);
         mEmptyListMessage = (TextView) view.findViewById(R.id.empty_list_view_text);
@@ -457,6 +529,8 @@ public class ExtendedListFragment extends Fragment
             mTops = new ArrayList<>();
             mHeightCell = 0;
         }
+
+        mScale = PreferenceManager.getGridColumns(getContext());
     }
 
 
@@ -471,6 +545,8 @@ public class ExtendedListFragment extends Fragment
         savedInstanceState.putIntegerArrayList(KEY_TOPS, mTops);
         savedInstanceState.putInt(KEY_HEIGHT_CELL, mHeightCell);
         savedInstanceState.putString(KEY_EMPTY_LIST_MESSAGE, getEmptyViewText());
+
+        PreferenceManager.setGridColumns(getContext(), mScale);
     }
 
     /**
@@ -493,6 +569,10 @@ public class ExtendedListFragment extends Fragment
         }
     }
 
+    public int getColumnSize() {
+        return Math.round(mScale);
+    }
+
 
     /*
      * Restore index and position
@@ -824,4 +904,21 @@ public class ExtendedListFragment extends Fragment
         }
     }
 
+    @Override
+    public void onConfigurationChanged(Configuration newConfig) {
+        super.onConfigurationChanged(newConfig);
+
+        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
+            maxColumnSize = maxColumnSizeLandscape;
+        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
+            maxColumnSize = maxColumnSizePortrait;
+        } else {
+            maxColumnSize = maxColumnSizePortrait;
+        }
+
+        if (mGridView.getNumColumns() > maxColumnSize) {
+            mGridView.setNumColumns(maxColumnSize);
+            mGridView.invalidateViews();
+        }
+    }
 }

+ 2 - 0
src/main/java/com/owncloud/android/ui/interfaces/OCFileListFragmentInterface.java

@@ -26,4 +26,6 @@ package com.owncloud.android.ui.interfaces;
 
 public interface OCFileListFragmentInterface {
     void finishedFiltering();
+
+    int getColumnSize();
 }