From: tobiasKaminsky Date: Thu, 21 May 2015 19:12:44 +0000 (+0200) Subject: Merge remote-tracking branch 'upstream/develop' into navigationDrawer_update X-Git-Tag: oc-android-1.7.2~1^2~23^2~42 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/6d4207a06bfa0a1bb19b8d5942b799dadfbbe608?hp=07acad20b58883a1f90611c14d3d8d7ddc35e7d5 Merge remote-tracking branch 'upstream/develop' into navigationDrawer_update --- diff --git a/res/drawable-hdpi/ic_drawer.png b/res/drawable-hdpi/ic_drawer.png new file mode 100644 index 00000000..6614ea4f Binary files /dev/null and b/res/drawable-hdpi/ic_drawer.png differ diff --git a/res/layout/drawer_account_group.xml b/res/layout/drawer_account_group.xml new file mode 100644 index 00000000..85a1c753 --- /dev/null +++ b/res/layout/drawer_account_group.xml @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/res/layout/drawer_list_item.xml b/res/layout/drawer_list_item.xml new file mode 100644 index 00000000..630366e0 --- /dev/null +++ b/res/layout/drawer_list_item.xml @@ -0,0 +1,25 @@ + + + diff --git a/res/layout/drawer_radiobutton.xml b/res/layout/drawer_radiobutton.xml new file mode 100644 index 00000000..917d8944 --- /dev/null +++ b/res/layout/drawer_radiobutton.xml @@ -0,0 +1,9 @@ + \ No newline at end of file diff --git a/res/layout/files.xml b/res/layout/files.xml index 5d62c131..5d87b126 100644 --- a/res/layout/files.xml +++ b/res/layout/files.xml @@ -1,5 +1,5 @@ - - + - - - - - - \ No newline at end of file + android:clickable="true" > + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/listrow_details.xml b/res/layout/listrow_details.xml new file mode 100644 index 00000000..01651bf9 --- /dev/null +++ b/res/layout/listrow_details.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/res/layout/listrow_group.xml b/res/layout/listrow_group.xml new file mode 100644 index 00000000..735a11e4 --- /dev/null +++ b/res/layout/listrow_group.xml @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/res/layout/uploader_layout.xml b/res/layout/uploader_layout.xml index 60a21112..a5351f04 100644 --- a/res/layout/uploader_layout.xml +++ b/res/layout/uploader_layout.xml @@ -22,11 +22,11 @@ android:layout_width="wrap_content" android:background="#fefefe" android:gravity="center"> + android:layout_below="@+id/drawer_username" android:layout_above="@+id/linearLayout1"> diff --git a/res/layout/uploader_list_item_layout.xml b/res/layout/uploader_list_item_layout.xml index e0932690..d2d0005b 100644 --- a/res/layout/uploader_list_item_layout.xml +++ b/res/layout/uploader_list_item_layout.xml @@ -35,7 +35,7 @@ - - - + android:contentDescription="@string/actionbar_sort"/>/> diff --git a/res/values/colors.xml b/res/values/colors.xml index 6aeb6acf..b42538fd 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -22,6 +22,7 @@ #DDDDDD #00ddff #989898 + #000000 #303030 #fff0f0f0 diff --git a/res/values/strings.xml b/res/values/strings.xml index 0e2e9458..b9aeea49 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -20,6 +20,14 @@ + + Accounts + All Files + On device + Settings + + ownCloud + Close General More Accounts @@ -330,10 +338,14 @@ Upload Video Path Download of %1$s folder could not be completed - %1$s shared \"%2$s\" with you + shared + with you + + %1$s %2$s >>%3$s<< %4$s Refresh connection Server address Not enough memory + Username diff --git a/res/xml/preferences.xml b/res/xml/preferences.xml index 4823a83f..e1d0a476 100644 --- a/res/xml/preferences.xml +++ b/res/xml/preferences.xml @@ -56,6 +56,7 @@ + diff --git a/src/com/owncloud/android/MainApp.java b/src/com/owncloud/android/MainApp.java index 657469ef..0d725e5a 100644 --- a/src/com/owncloud/android/MainApp.java +++ b/src/com/owncloud/android/MainApp.java @@ -54,6 +54,10 @@ public class MainApp extends Application { private static Context mContext; + // TODO better place + private static boolean mOnlyOnDevice = false; + + public void onCreate(){ super.onCreate(); MainApp.mContext = getApplicationContext(); @@ -170,6 +174,14 @@ public class MainApp extends Application { public static String getLogName() { return getAppContext().getResources().getString(R.string.log_name); } + + public static void showOnlyFilesOnDevice(boolean state){ + mOnlyOnDevice = state; + } + + public static boolean getOnlyOnDevice(){ + return mOnlyOnDevice; + } // user agent public static String getUserAgent() { diff --git a/src/com/owncloud/android/datamodel/FileDataStorageManager.java b/src/com/owncloud/android/datamodel/FileDataStorageManager.java index c32dbbce..42f2c780 100644 --- a/src/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/src/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -28,14 +28,6 @@ import java.util.Iterator; import java.util.List; import java.util.Vector; -import com.owncloud.android.MainApp; -import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.shares.OCShare; -import com.owncloud.android.lib.resources.shares.ShareType; -import com.owncloud.android.lib.resources.files.FileUtils; -import com.owncloud.android.utils.FileStorageUtils; - import android.accounts.Account; import android.content.ContentProviderClient; import android.content.ContentProviderOperation; @@ -50,6 +42,14 @@ import android.net.Uri; import android.os.RemoteException; import android.provider.MediaStore; +import com.owncloud.android.MainApp; +import com.owncloud.android.db.ProviderMeta.ProviderTableMeta; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.files.FileUtils; +import com.owncloud.android.lib.resources.shares.OCShare; +import com.owncloud.android.lib.resources.shares.ShareType; +import com.owncloud.android.utils.FileStorageUtils; + public class FileDataStorageManager { public static final int ROOT_PARENT_ID = 0; @@ -142,9 +142,9 @@ public class FileDataStorageManager { } - public Vector getFolderContent(OCFile f) { + public Vector getFolderContent(OCFile f, boolean onlyOnDevice) { if (f != null && f.isFolder() && f.getFileId() != -1) { - return getFolderContent(f.getFileId()); + return getFolderContent(f.getFileId(), onlyOnDevice); } else { return new Vector(); @@ -152,11 +152,11 @@ public class FileDataStorageManager { } - public Vector getFolderImages(OCFile folder) { + public Vector getFolderImages(OCFile folder, boolean onlyOnDevice) { Vector ret = new Vector(); if (folder != null) { // TODO better implementation, filtering in the access to database instead of here - Vector tmp = getFolderContent(folder); + Vector tmp = getFolderContent(folder, onlyOnDevice); OCFile current = null; for (int i=0; i files = getFolderContent(folder.getFileId()); + Vector files = getFolderContent(folder.getFileId(), false); if (files != null) { for (OCFile file : files) { if (file.isFolder()) { @@ -731,7 +731,7 @@ public class FileDataStorageManager { } - private Vector getFolderContent(long parentId) { + private Vector getFolderContent(long parentId, boolean onlyOnDevice) { Vector ret = new Vector(); @@ -758,7 +758,9 @@ public class FileDataStorageManager { if (c.moveToFirst()) { do { OCFile child = createFileInstance(c); - ret.add(child); + if (child.isFolder() || !onlyOnDevice || onlyOnDevice && child.isDown()){ + ret.add(child); + } } while (c.moveToNext()); } @@ -1435,14 +1437,13 @@ public class FileDataStorageManager { } private ArrayList prepareRemoveSharesInFolder( - OCFile folder, ArrayList preparedOperations - ) { + OCFile folder, ArrayList preparedOperations) { if (folder != null) { String where = ProviderTableMeta.OCSHARES_PATH + "=?" + " AND " + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?"; String [] whereArgs = new String[]{ "", mAccount.name }; - Vector files = getFolderContent(folder); + Vector files = getFolderContent(folder, false); for (OCFile file : files) { whereArgs[0] = file.getRemotePath(); diff --git a/src/com/owncloud/android/operations/RefreshFolderOperation.java b/src/com/owncloud/android/operations/RefreshFolderOperation.java index 50a35fdb..ecc642e9 100644 --- a/src/com/owncloud/android/operations/RefreshFolderOperation.java +++ b/src/com/owncloud/android/operations/RefreshFolderOperation.java @@ -201,7 +201,7 @@ public class RefreshFolderOperation extends RemoteOperation { if (mRemoteFolderChanged) { result = fetchAndSyncRemoteFolder(client); } else { - mChildren = mStorageManager.getFolderContent(mLocalFolder); + mChildren = mStorageManager.getFolderContent(mLocalFolder, false); } } @@ -341,7 +341,7 @@ public class RefreshFolderOperation extends RemoteOperation { List filesToSyncContents = new Vector(); // get current data about local contents of the folder to synchronize - List localFiles = mStorageManager.getFolderContent(mLocalFolder); + List localFiles = mStorageManager.getFolderContent(mLocalFolder, true); Map localFilesMap = new HashMap(localFiles.size()); for (OCFile file : localFiles) { localFilesMap.put(file.getRemotePath(), file); diff --git a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java index 286b5ea9..9e1d13b9 100644 --- a/src/com/owncloud/android/operations/SynchronizeFolderOperation.java +++ b/src/com/owncloud/android/operations/SynchronizeFolderOperation.java @@ -20,6 +20,20 @@ package com.owncloud.android.operations; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +import org.apache.http.HttpStatus; + import android.accounts.Account; import android.content.Context; import android.content.Intent; @@ -31,12 +45,17 @@ import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.operations.OperationCancelledException; +import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation; import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation; import com.owncloud.android.lib.resources.files.RemoteFile; +import com.owncloud.android.lib.resources.shares.GetRemoteSharesForFileOperation; +import com.owncloud.android.lib.resources.shares.OCShare; +import com.owncloud.android.syncadapter.FileSyncAdapter; import com.owncloud.android.operations.common.SyncOperation; import com.owncloud.android.services.OperationsService; import com.owncloud.android.utils.FileStorageUtils; @@ -297,7 +316,7 @@ public class SynchronizeFolderOperation extends SyncOperation { } // get current data about local contents of the folder to synchronize - List localFiles = storageManager.getFolderContent(mLocalFolder); + List localFiles = storageManager.getFolderContent(mLocalFolder, true); Map localFilesMap = new HashMap(localFiles.size()); for (OCFile file : localFiles) { localFilesMap.put(file.getRemotePath(), file); @@ -392,7 +411,8 @@ public class SynchronizeFolderOperation extends SyncOperation { private void prepareOpsFromLocalKnowledge() throws OperationCancelledException { - List children = getStorageManager().getFolderContent(mLocalFolder); + // TODO TOBI ist das richtig? + List children = getStorageManager().getFolderContent(mLocalFolder, true); for (OCFile child : children) { /// classify file to sync/download contents later if (child.isFolder()) { diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index 3061ff44..48336d79 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java @@ -27,6 +27,7 @@ import java.io.File; import android.accounts.Account; import android.accounts.AccountManager; import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; import android.annotation.TargetApi; import android.app.AlertDialog; import android.content.BroadcastReceiver; @@ -39,6 +40,7 @@ import android.content.IntentFilter; import android.content.ServiceConnection; import android.content.SharedPreferences; import android.content.SyncRequest; +import android.content.res.Configuration; import android.content.res.Resources.NotFoundException; import android.database.Cursor; import android.net.Uri; @@ -47,12 +49,21 @@ import android.os.Bundle; import android.os.IBinder; import android.preference.PreferenceManager; import android.provider.OpenableColumns; +import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.util.Log; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; @@ -62,9 +73,9 @@ import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; -import com.owncloud.android.BuildConfig; import com.owncloud.android.MainApp; import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileDownloader; import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder; @@ -90,6 +101,8 @@ import com.owncloud.android.operations.RefreshFolderOperation; import com.owncloud.android.operations.UnshareLinkOperation; import com.owncloud.android.services.observer.FileObserverService; import com.owncloud.android.syncadapter.FileSyncAdapter; +import com.owncloud.android.ui.adapter.FileListListAdapter; +import com.owncloud.android.ui.adapter.NavigationDrawerListAdapter; import com.owncloud.android.ui.dialog.ConfirmationDialogFragment; import com.owncloud.android.ui.dialog.CreateFolderDialogFragment; import com.owncloud.android.ui.dialog.SslUntrustedCertDialog; @@ -154,11 +167,15 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private OCFile mWaitingToSend; + private DrawerLayout mDrawerLayout; + private ActionBarDrawerToggle mDrawerToggle; + private boolean showAccounts = false; + @Override protected void onCreate(Bundle savedInstanceState) { Log_OC.v(TAG, "onCreate() start"); requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); - + super.onCreate(savedInstanceState); // this calls onAccountChanged() when ownCloud Account is valid /// grant that FileObserverService is watching favorite files @@ -182,7 +199,89 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { /// USER INTERFACE // Inflate and set the layout view - setContentView(R.layout.files); + setContentView(R.layout.files); + + // TODO move to another place that all activity can use it + mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + + mDrawerToggle = new ActionBarDrawerToggle( + this, + mDrawerLayout, + R.drawable.ic_drawer, + R.string.drawer_open, + R.string.empty + ) { + + /** Called when a drawer has settled in a completely closed state. */ + public void onDrawerClosed(View view) { + super.onDrawerClosed(view); + getSupportActionBar().setDisplayShowTitleEnabled(true); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); + initFragmentsWithFile(); + invalidateOptionsMenu(); + } + + /** Called when a drawer has settled in a completely open state. */ + public void onDrawerOpened(View drawerView) { + super.onDrawerOpened(drawerView); + getSupportActionBar().setTitle(R.string.drawer_open); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); + invalidateOptionsMenu(); + } + }; + + mDrawerToggle.setDrawerIndicatorEnabled(true); + + // Notification Drawer + LinearLayout notificatonDrawer = (LinearLayout) findViewById(R.id.left_drawer); + + // ListView + ListView listView = (ListView) notificatonDrawer.findViewById(R.id.drawer_list); + final NavigationDrawerListAdapter adapter = new NavigationDrawerListAdapter(getApplicationContext(), this); + + listView.setAdapter(adapter); + + listView.setOnItemClickListener(new OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (showAccounts && position > 0){ + position = position - 1; + } + switch (position){ + case 0: + showAccounts = !showAccounts; + adapter.setShowAccounts(showAccounts); + adapter.notifyDataSetChanged(); + break; + case 1: + MainApp.showOnlyFilesOnDevice(false); + mDrawerLayout.closeDrawers(); + break; + case 2: + MainApp.showOnlyFilesOnDevice(true); + mDrawerLayout.closeDrawers(); + break; + case 3: + Intent settingsIntent = new Intent(getApplicationContext(), Preferences.class); + startActivity(settingsIntent); + break; + } + } + }); + + // User-Icon + ImageView userIcon = (ImageView) notificatonDrawer.findViewById(R.id.drawer_userIcon); + userIcon.setImageResource(DisplayUtils.getSeasonalIconId()); + + // Username + TextView username = (TextView) notificatonDrawer.findViewById(R.id.drawer_username); + Account account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()); + int lastAtPos = account.name.lastIndexOf("@"); + username.setText(account.name.substring(0, lastAtPos)); + + // Set the drawer toggle as the DrawerListener + mDrawerLayout.setDrawerListener(mDrawerToggle); + mDualPane = getResources().getBoolean(R.bool.large_land_layout); mLeftFragmentContainer = findViewById(R.id.left_fragment_container); mRightFragmentContainer = findViewById(R.id.right_fragment_container); @@ -192,9 +291,14 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { // Action bar setup mDirectories = new CustomArrayAdapter(this, R.layout.sherlock_spinner_dropdown_item); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); // mandatory since Android ICS, according to the official documentation + getSupportActionBar().setDisplayShowCustomEnabled(true); // CRUCIAL - for displaying your custom actionbar + getSupportActionBar().setDisplayShowTitleEnabled(true); setSupportProgressBarIndeterminateVisibility(mSyncInProgress /*|| mRefreshSharesInProgress*/); // always AFTER setContentView(...) ; to work around bug in its implementation + mDrawerToggle.syncState(); + setBackgroundText(); Log_OC.v(TAG, "onCreate() end"); @@ -207,6 +311,19 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { getSupportActionBar().setIcon(DisplayUtils.getSeasonalIconId()); Log_OC.v(TAG, "onStart() end"); } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mDrawerToggle.onConfigurationChanged(newConfig); + } @Override protected void onDestroy() { @@ -287,7 +404,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { /// First fragment OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { - listOfFiles.listDirectory(getCurrentDir()); + listOfFiles.listDirectory(getCurrentDir(), MainApp.getOnlyOnDevice()); } else { Log_OC.e(TAG, "Still have a chance to lose the initializacion of list fragment >("); } @@ -407,7 +524,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { protected void refreshListOfFilesFragment() { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(); + fileListFragment.listDirectory(MainApp.getOnlyOnDevice()); } } @@ -450,11 +567,11 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { @Override public boolean onPrepareOptionsMenu(Menu menu) { - if (BuildConfig.DEBUG) { - menu.findItem(R.id.action_logger).setVisible(true); - } else { - menu.findItem(R.id.action_logger).setVisible(false); - } + boolean drawerOpen = mDrawerLayout.isDrawerOpen(GravityCompat.START); + menu.findItem(R.id.action_upload).setVisible(!drawerOpen); + menu.findItem(R.id.action_create_dir).setVisible(!drawerOpen); + menu.findItem(R.id.action_sort).setVisible(!drawerOpen); + return super.onPrepareOptionsMenu(menu); } @@ -464,6 +581,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { inflater.inflate(R.menu.main_menu, menu); return true; } + @Override public boolean onOptionsItemSelected(MenuItem item) { @@ -474,34 +592,19 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { dialog.show(getSupportFragmentManager(), DIALOG_CREATE_FOLDER); break; } - case R.id.action_sync_account: { - startSynchronization(); - break; - } case R.id.action_upload: { UploadSourceDialogFragment dialog = UploadSourceDialogFragment.newInstance(getAccount()); dialog.show(getSupportFragmentManager(), DIALOG_UPLOAD_SOURCE); break; } - case R.id.action_settings: { - Intent settingsIntent = new Intent(this, Preferences.class); - startActivity(settingsIntent); - break; - } - case R.id.action_logger: { - Intent loggerIntent = new Intent(getApplicationContext(),LogHistoryActivity.class); - startActivity(loggerIntent); - break; - } case android.R.id.home: { - FileFragment second = getSecondFragment(); - OCFile currentDir = getCurrentDir(); - if((currentDir != null && currentDir.getParentId() != 0) || - (second != null && second.getFile() != null)) { - onBackPressed(); - + if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { + mDrawerLayout.closeDrawer(GravityCompat.START); + } else { + mDrawerLayout.openDrawer(GravityCompat.START); } + // TODO add hamburger to left of android.R.id.home break; } case R.id.action_sort: { @@ -936,7 +1039,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { if (synchFolderRemotePath != null && currentDir.getRemotePath().equals(synchFolderRemotePath)) { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(currentDir); + fileListFragment.listDirectory(currentDir, MainApp.getOnlyOnDevice()); } } setFile(currentFile); @@ -1165,7 +1268,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { popDirname(); } OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH); - listOfFiles.listDirectory(root); + listOfFiles.listDirectory(root, MainApp.getOnlyOnDevice()); setFile(listOfFiles.getCurrentFile()); startSyncFolderOperation(root, false); } @@ -1180,7 +1283,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { setNavigationListWithFolder(folder); - listOfFiles.listDirectory(folder); + listOfFiles.listDirectory(folder, MainApp.getOnlyOnDevice()); setFile(listOfFiles.getCurrentFile()); startSyncFolderOperation(folder, false); } else { @@ -1234,8 +1337,10 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { // only list of files - set for browsing through folders OCFile currentDir = getCurrentDir(); boolean noRoot = (currentDir != null && currentDir.getParentId() != 0); - actionBar.setDisplayHomeAsUpEnabled(noRoot); - actionBar.setDisplayShowTitleEnabled(!noRoot); +// actionBar.setDisplayHomeAsUpEnabled(noRoot); +// actionBar.setDisplayShowTitleEnabled(!noRoot); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setDisplayShowTitleEnabled(true); if (!noRoot) { actionBar.setTitle(getString(R.string.default_display_name_for_root_folder)); View actionBarTitleView = getWindow().getDecorView().findViewById(actionBarTitleId); @@ -1290,7 +1395,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { // a new chance to get the mDownloadBinder through getFileDownloadBinder() - THIS IS A MESS OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { - listOfFiles.listDirectory(); + listOfFiles.listDirectory(MainApp.getOnlyOnDevice()); } FileFragment secondFragment = getSecondFragment(); if (secondFragment != null && secondFragment instanceof FileDetailFragment) { @@ -1635,7 +1740,7 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { public void showUntrustedCertDialog(RemoteOperationResult result) { // Show a dialog with the certificate info SslUntrustedCertDialog dialog = SslUntrustedCertDialog.newInstanceForFullSslError( - (CertificateCombinedException)result.getException()); + (CertificateCombinedException) result.getException()); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); dialog.show(ft, DIALOG_UNTRUSTED_CERT); @@ -1763,5 +1868,15 @@ OnSslUntrustedCertListener, OnEnforceableRefreshListener { private void sortByName(boolean ascending){ getListOfFilesFragment().sortByName(ascending); } + + public void restart(){ + Intent i = new Intent(this, FileDisplayActivity.class); + i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(i); + } + + public void closeDrawer() { + mDrawerLayout.closeDrawers(); + } } diff --git a/src/com/owncloud/android/ui/activity/FolderPickerActivity.java b/src/com/owncloud/android/ui/activity/FolderPickerActivity.java index 62299f27..6dec67d2 100644 --- a/src/com/owncloud/android/ui/activity/FolderPickerActivity.java +++ b/src/com/owncloud/android/ui/activity/FolderPickerActivity.java @@ -142,7 +142,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C if (!stateWasRecovered) { OCFileListFragment listOfFolders = getListOfFilesFragment(); - listOfFolders.listDirectory(folder); + listOfFolders.listDirectory(folder, false); startSyncFolderOperation(folder, false); } @@ -265,9 +265,6 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C MenuInflater inflater = getSherlock().getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); menu.findItem(R.id.action_upload).setVisible(false); - menu.findItem(R.id.action_settings).setVisible(false); - menu.findItem(R.id.action_sync_account).setVisible(false); - menu.findItem(R.id.action_logger).setVisible(false); menu.findItem(R.id.action_sort).setVisible(false); return true; } @@ -314,7 +311,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C protected void refreshListOfFilesFragment() { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(); + fileListFragment.listDirectory(false); } } @@ -322,7 +319,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C OCFileListFragment listOfFiles = getListOfFilesFragment(); if (listOfFiles != null) { // should never be null, indeed OCFile root = getStorageManager().getFileByPath(OCFile.ROOT_PATH); - listOfFiles.listDirectory(root); + listOfFiles.listDirectory(root, false); setFile(listOfFiles.getCurrentFile()); updateNavigationElementsInActionBar(); startSyncFolderOperation(root, false); @@ -474,7 +471,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C equals(synchFolderRemotePath)) { OCFileListFragment fileListFragment = getListOfFilesFragment(); if (fileListFragment != null) { - fileListFragment.listDirectory(currentDir); + fileListFragment.listDirectory(currentDir, false); } } setFile(currentFile); diff --git a/src/com/owncloud/android/ui/activity/Preferences.java b/src/com/owncloud/android/ui/activity/Preferences.java index 33542085..e7e76790 100644 --- a/src/com/owncloud/android/ui/activity/Preferences.java +++ b/src/com/owncloud/android/ui/activity/Preferences.java @@ -54,6 +54,7 @@ import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.SherlockPreferenceActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; +import com.owncloud.android.BuildConfig; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; @@ -203,7 +204,20 @@ public class Preferences extends SherlockPreferenceActivity } - + if (BuildConfig.DEBUG) { + Preference pLog = findPreference("log"); + if (pLog != null ){ + pLog.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + Intent loggerIntent = new Intent(getApplicationContext(),LogHistoryActivity.class); + startActivity(loggerIntent); + return true; + } + }); + } + } + boolean recommendEnabled = getResources().getBoolean(R.bool.recommend_enabled); Preference pRecommend = findPreference("recommend"); if (pRecommend != null){ diff --git a/src/com/owncloud/android/ui/activity/UploadPathActivity.java b/src/com/owncloud/android/ui/activity/UploadPathActivity.java index d1509f95..a4e9cb73 100644 --- a/src/com/owncloud/android/ui/activity/UploadPathActivity.java +++ b/src/com/owncloud/android/ui/activity/UploadPathActivity.java @@ -20,7 +20,6 @@ package com.owncloud.android.ui.activity; import android.accounts.Account; - import android.os.Bundle; import android.view.View.OnClickListener; @@ -68,7 +67,7 @@ public class UploadPathActivity extends FolderPickerActivity implements FileFrag if (!stateWasRecovered) { OCFileListFragment listOfFolders = getListOfFilesFragment(); - listOfFolders.listDirectory(folder); + listOfFolders.listDirectory(folder, false); startSyncFolderOperation(folder, false); } diff --git a/src/com/owncloud/android/ui/activity/Uploader.java b/src/com/owncloud/android/ui/activity/Uploader.java index 9e56a30b..7336af96 100644 --- a/src/com/owncloud/android/ui/activity/Uploader.java +++ b/src/com/owncloud/android/ui/activity/Uploader.java @@ -70,6 +70,13 @@ import com.actionbarsherlock.view.MenuItem; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountAuthenticator; +import com.owncloud.android.datamodel.FileDataStorageManager; +import com.owncloud.android.datamodel.OCFile; +import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountAuthenticator; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.lib.common.operations.RemoteOperation; @@ -325,7 +332,7 @@ public class Uploader extends FileActivity public void onItemClick(AdapterView parent, View view, int position, long id) { // click on folder in the list Log_OC.d(TAG, "on item click"); - Vector tmpfiles = getStorageManager().getFolderContent(mFile); + Vector tmpfiles = getStorageManager().getFolderContent(mFile, false); if (tmpfiles.size() <= 0) return; // filter on dirtype Vector files = new Vector(); @@ -410,7 +417,7 @@ public class Uploader extends FileActivity mFile = getStorageManager().getFileByPath(full_path); if (mFile != null) { - Vector files = getStorageManager().getFolderContent(mFile); + Vector files = getStorageManager().getFolderContent(mFile, false); List> data = new LinkedList>(); for (OCFile f : files) { HashMap h = new HashMap(); diff --git a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java index 2c1aa9e9..c03003b5 100644 --- a/src/com/owncloud/android/ui/adapter/FileListListAdapter.java +++ b/src/com/owncloud/android/ui/adapter/FileListListAdapter.java @@ -407,14 +407,14 @@ public class FileListListAdapter extends BaseAdapter implements ListAdapter { * @param updatedStorageManager Optional updated storage manager; used to replace * mStorageManager if is different (and not NULL) */ - public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager) { + public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager, boolean onlyOnDevice) { mFile = directory; if (updatedStorageManager != null && updatedStorageManager != mStorageManager) { mStorageManager = updatedStorageManager; mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); } if (mStorageManager != null) { - mFiles = mStorageManager.getFolderContent(mFile); + mFiles = mStorageManager.getFolderContent(mFile, false); mFilesOrig.clear(); mFilesOrig.addAll(mFiles); diff --git a/src/com/owncloud/android/ui/adapter/Group.java b/src/com/owncloud/android/ui/adapter/Group.java new file mode 100644 index 00000000..b01d29c6 --- /dev/null +++ b/src/com/owncloud/android/ui/adapter/Group.java @@ -0,0 +1,15 @@ +package com.owncloud.android.ui.adapter; + +import java.util.ArrayList; +import java.util.List; + +public class Group { + + public String string; + public final List children = new ArrayList(); + + public Group(String string) { + this.string = string; + } + +} \ No newline at end of file diff --git a/src/com/owncloud/android/ui/adapter/MyExpandableListAdapter.java b/src/com/owncloud/android/ui/adapter/MyExpandableListAdapter.java new file mode 100644 index 00000000..20cfdff5 --- /dev/null +++ b/src/com/owncloud/android/ui/adapter/MyExpandableListAdapter.java @@ -0,0 +1,120 @@ +package com.owncloud.android.ui.adapter; + +import android.app.Activity; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.BaseExpandableListAdapter; +import android.widget.TextView; +import android.widget.Toast; + +import com.owncloud.android.R; + +public class MyExpandableListAdapter extends BaseExpandableListAdapter { + + private final SparseArray groups; + public LayoutInflater inflater; + public Activity activity; + + public MyExpandableListAdapter(Activity act, SparseArray groups) { + activity = act; + this.groups = groups; + inflater = act.getLayoutInflater(); + + } + + + @Override + public Object getChild(int groupPosition, int childPosition) { + return groups.get(groupPosition).children.get(childPosition); + } + + @Override + public long getChildId(int groupPosition, int childPosition) { + return 0; + } + + @Override + public View getChildView(int groupPosition, final int childPosition, + boolean isLastChild, View convertView, ViewGroup parent) { + final String children = (String) getChild(groupPosition, childPosition); + TextView text = null; + if (convertView == null) { + convertView = inflater.inflate(R.layout.listrow_details, null); + } + + + text = (TextView) convertView.findViewById(R.id.textView1); + text.setText(children); + convertView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(activity, children, Toast.LENGTH_SHORT).show(); + } + }); + return convertView; + } + + @Override + public View getGroupView(int groupPosition, boolean isExpanded, + View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = inflater.inflate(R.layout.listrow_group, null); + } + + final Group group = (Group) getGroup(groupPosition); + if (group.children.size() == 0){ + convertView.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText(activity, group.string, Toast.LENGTH_SHORT).show(); + } + }); + } + ((TextView) convertView).setText(group.string); + + return convertView; + } + + @Override + public int getChildrenCount(int groupPosition) { + return groups.get(groupPosition).children.size(); + } + + @Override + public Object getGroup(int groupPosition) { + return groups.get(groupPosition); + } + + @Override + public int getGroupCount() { + return groups.size(); + } + + @Override + public void onGroupCollapsed(int groupPosition) { + super.onGroupCollapsed(groupPosition); + } + + @Override + public void onGroupExpanded(int groupPosition) { + super.onGroupExpanded(groupPosition); + } + + @Override + public long getGroupId(int groupPosition) { + return 0; + } + + @Override + public boolean hasStableIds() { + return false; + } + + @Override + public boolean isChildSelectable(int groupPosition, int childPosition) { + return false; + } +} \ No newline at end of file diff --git a/src/com/owncloud/android/ui/adapter/NavigationDrawerListAdapter.java b/src/com/owncloud/android/ui/adapter/NavigationDrawerListAdapter.java new file mode 100644 index 00000000..5793454e --- /dev/null +++ b/src/com/owncloud/android/ui/adapter/NavigationDrawerListAdapter.java @@ -0,0 +1,169 @@ +package com.owncloud.android.ui.adapter; + +import java.nio.ByteBuffer; +import java.security.MessageDigest; +import java.util.ArrayList; + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.content.Context; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.RadioButton; +import android.widget.RadioGroup; +import android.widget.RadioGroup.LayoutParams; +import android.widget.TextView; + +import com.owncloud.android.MainApp; +import com.owncloud.android.R; +import com.owncloud.android.authentication.AccountUtils; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.ui.activity.FileDisplayActivity; +import com.owncloud.android.utils.BitmapUtils; + +public class NavigationDrawerListAdapter extends BaseAdapter { + + private final static String TAG = "NavigationDrawerListAdapter"; + private Context mContext; + private ArrayList mDrawerItems = new ArrayList(); + ArrayList all = new ArrayList(); + private Account[] mAccounts; + private boolean mShowAccounts; + private Account currentAccount; + private FileDisplayActivity mFileDisplayActivity; + + + public NavigationDrawerListAdapter(Context context, FileDisplayActivity fileDisplayActivity){ + mFileDisplayActivity = fileDisplayActivity; + mContext = context; + + for (String string : mContext.getResources().getStringArray(R.array.drawer_items)) { + mDrawerItems.add(string); + } + + AccountManager am = (AccountManager) mContext.getSystemService(mContext.ACCOUNT_SERVICE); + mAccounts = am.getAccountsByType(MainApp.getAccountType()); + currentAccount = AccountUtils.getCurrentOwnCloudAccount(mContext); + + all.addAll(mDrawerItems); + } + + @Override + public int getCount() { + if (mShowAccounts){ + return mDrawerItems.size() + 1; + } else { + return mDrawerItems.size(); + } + } + + @Override + public Object getItem(int position) { + //return all.get(position); + return null; + } + + @Override + public long getItemId(int position) { + return 0; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + + LayoutInflater inflator = (LayoutInflater) mContext + .getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + if (all.size() > position) { + // Normal entry + if (all.get(position) instanceof String){ + View view = inflator.inflate(R.layout.drawer_list_item, null); + view.setMinimumHeight(40); + TextView textView = (TextView) view.findViewById(R.id.drawer_textView); + + String entry = (String) all.get(position); + textView.setText(entry); + + return view; + } + + // Account + if (all.get(position) instanceof Account[]){ + final View view = inflator.inflate(R.layout.drawer_account_group, null); + + final RadioGroup group = (RadioGroup) view.findViewById(R.id.drawer_radio_group); + + for (Account account : mAccounts) { + RadioButton rb = new RadioButton(mContext); + rb.setText(account.name); + + try { + byte[] bytesOfMessage = account.name.substring(0,5).getBytes("UTF-8"); + MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] digest = md.digest(bytesOfMessage); + int result = Math.abs(ByteBuffer.wrap(digest).getInt()); + + Log_OC.d(TAG, "Integer: " + result % 100000); + Log_OC.d(TAG, "length: " + digest.length); + + + Double hue = (result % 100000) / 99999.0; + + Log_OC.d(TAG, "hue: " + hue); + + int[] rgb = BitmapUtils.hslToRgb(hue, 0.9, 0.65); + rb.setTextColor(Color.rgb(rgb[0], rgb[1], rgb[2])); + Log_OC.d(TAG, "Color: " + rgb[0] + " " + rgb[1] + rgb[2]); + + } catch (Exception e){ + Log_OC.d(TAG, e.toString()); + rb.setTextColor(mContext.getResources().getColor(R.color.black)); + } + RadioGroup.LayoutParams params = new RadioGroup.LayoutParams( + LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); + params.weight=1.0f; + params.setMargins(15, 5, 5, 5); + + // Check the current account that is being used + if (account.name.equals(currentAccount.name)) { + rb.setChecked(true); + } else { + rb.setChecked(false); + } + + group.addView(rb, params); + } + + group.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){ + public void onCheckedChanged(RadioGroup group, int checkedId) { + // checkedId is the RadioButton selected + RadioButton rb = (RadioButton) view.findViewById(checkedId); + + AccountUtils.setCurrentOwnCloudAccount(mContext,rb.getText().toString()); + notifyDataSetChanged(); + mFileDisplayActivity.closeDrawer(); + + // restart the main activity + mFileDisplayActivity.restart(); + } + }); + + return view; + } + } + return convertView; + } + + public void setShowAccounts(boolean value){ + all.clear(); + all.addAll(mDrawerItems); + + if (value){ + all.add(1, mAccounts); + } + mShowAccounts = value; + } +} diff --git a/src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java b/src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java index c3b7ed1e..179ab962 100644 --- a/src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java +++ b/src/com/owncloud/android/ui/dialog/RemoveFileDialogFragment.java @@ -112,7 +112,7 @@ implements ConfirmationDialogFragmentListener { boolean containsKeepInSync = false; if (mTargetFile.isFolder()) { - Vector files = storageManager.getFolderContent(mTargetFile); + Vector files = storageManager.getFolderContent(mTargetFile, false); for(OCFile file: files) { containsKeepInSync = file.keepInSync() || containsKeepInSync; diff --git a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java index 60ac78d9..9430f112 100644 --- a/src/com/owncloud/android/ui/fragment/OCFileListFragment.java +++ b/src/com/owncloud/android/ui/fragment/OCFileListFragment.java @@ -29,12 +29,15 @@ import android.content.Intent; import android.os.Bundle; import android.support.v4.widget.SwipeRefreshLayout; import android.view.ContextMenu; +import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.TextView; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; @@ -77,7 +80,8 @@ public class OCFileListFragment extends ExtendedListFragment { private boolean mJustFolders; private OCFile mTargetFile; - + + /** * {@inheritDoc} @@ -183,7 +187,7 @@ public class OCFileListFragment extends ExtendedListFragment { } // exit is granted because storageManager.getFileByPath("/") never returns null mFile = parentDir; - listDirectory(mFile); + listDirectory(mFile, MainApp.getOnlyOnDevice()); onRefresh(false); @@ -201,7 +205,7 @@ public class OCFileListFragment extends ExtendedListFragment { if (file != null) { if (file.isFolder()) { // update state and view of this fragment - listDirectory(file); + listDirectory(file, MainApp.getOnlyOnDevice()); // then, notify parent activity to let it update its state and view mContainerActivity.onBrowsedDownTo(file); // save index and top position @@ -355,8 +359,12 @@ public class OCFileListFragment extends ExtendedListFragment { /** * Calls {@link OCFileListFragment#listDirectory(OCFile)} with a null parameter */ - public void listDirectory(){ - listDirectory(null); + public void listDirectory(boolean onlyOnDevice){ + listDirectory(null, onlyOnDevice); + } + + public void refreshDirectory(){ + listDirectory(getCurrentFile(), MainApp.getOnlyOnDevice()); } /** @@ -366,7 +374,7 @@ public class OCFileListFragment extends ExtendedListFragment { * * @param directory File to be listed */ - public void listDirectory(OCFile directory) { + public void listDirectory(OCFile directory, boolean onlyOnDevice) { FileDataStorageManager storageManager = mContainerActivity.getStorageManager(); if (storageManager != null) { @@ -387,7 +395,7 @@ public class OCFileListFragment extends ExtendedListFragment { directory = storageManager.getFileById(directory.getParentId()); } - mAdapter.swapDirectory(directory, storageManager); + mAdapter.swapDirectory(directory, storageManager, onlyOnDevice); if (mFile == null || !mFile.equals(directory)) { mCurrentListView.setSelection(0); } @@ -459,5 +467,7 @@ public class OCFileListFragment extends ExtendedListFragment { public void sortBySize(boolean descending) { mAdapter.setSortOrder(FileStorageUtils.SORT_SIZE, descending); } - + + + } diff --git a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java index f3b2ddc7..3af7992b 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImageActivity.java +++ b/src/com/owncloud/android/ui/preview/PreviewImageActivity.java @@ -38,6 +38,7 @@ import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.Window; import com.ortiz.touch.ExtendedViewPager; +import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; @@ -139,7 +140,7 @@ ViewPager.OnPageChangeListener, OnRemoteOperationListener { // should not be necessary parentFolder = getStorageManager().getFileByPath(OCFile.ROOT_PATH); } - mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), getStorageManager()); + mPreviewImagePagerAdapter = new PreviewImagePagerAdapter(getSupportFragmentManager(), parentFolder, getAccount(), getStorageManager(), MainApp.getOnlyOnDevice()); mViewPager = (ExtendedViewPager) findViewById(R.id.fragmentPager); int position = mHasSavedPosition ? mSavedPosition : mPreviewImagePagerAdapter.getFilePosition(getFile()); position = (position >= 0) ? position : 0; diff --git a/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java b/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java index 6e7f19d4..fc99d289 100644 --- a/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java +++ b/src/com/owncloud/android/ui/preview/PreviewImagePagerAdapter.java @@ -62,7 +62,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter { * @param parentFolder Folder where images will be searched for. * @param storageManager Bridge to database. */ - public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder, Account account, FileDataStorageManager storageManager) { + public PreviewImagePagerAdapter(FragmentManager fragmentManager, OCFile parentFolder, Account account, FileDataStorageManager storageManager, boolean onlyOnDevice) { super(fragmentManager); if (fragmentManager == null) { @@ -77,7 +77,7 @@ public class PreviewImagePagerAdapter extends FragmentStatePagerAdapter { mAccount = account; mStorageManager = storageManager; - mImageFiles = mStorageManager.getFolderImages(parentFolder); + mImageFiles = mStorageManager.getFolderImages(parentFolder, false); mImageFiles = FileStorageUtils.sortFolder(mImageFiles); diff --git a/src/com/owncloud/android/utils/BitmapUtils.java b/src/com/owncloud/android/utils/BitmapUtils.java index 7b9382e6..7af6960f 100644 --- a/src/com/owncloud/android/utils/BitmapUtils.java +++ b/src/com/owncloud/android/utils/BitmapUtils.java @@ -178,6 +178,46 @@ public class BitmapUtils { } /** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h, s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * from: http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c + * + * @param integer h The hue + * @param Integer s The saturation + * @param Integer l The lightness + * @return Array The RGB representation + */ + public static int[] hslToRgb(Double h, Double s, Double l){ + Double r, g, b; + + if(s == 0){ + r = g = b = l; // achromatic + } else { + Double q = l < 0.5 ? l * (1 + s) : l + s - l * s; + Double p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3) * 255; + g = hue2rgb(p, q, h) * 255; + b = hue2rgb(p, q, h - 1/3) * 255; + } + + + int[] array = {r.intValue(), g.intValue(), b.intValue()}; + return array; + } + + private static Double hue2rgb(Double p, Double q, Double t){ + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + + /** * Checks if file passed is an image * @param file * @return true/false