FolderSyncActivity.java 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. /*
  2. * Nextcloud Android client application
  3. *
  4. * @author Andy Scherzinger
  5. * Copyright (C) 2016 Andy Scherzinger
  6. * Copyright (C) 2016 Nextcloud
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
  10. * License as published by the Free Software Foundation; either
  11. * version 3 of the License, or any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public
  19. * License along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. package com.owncloud.android.ui.activity;
  22. import android.accounts.Account;
  23. import android.content.Intent;
  24. import android.content.pm.PackageManager;
  25. import android.os.Bundle;
  26. import android.os.Handler;
  27. import android.support.annotation.NonNull;
  28. import android.support.design.widget.BottomNavigationView;
  29. import android.support.v4.app.FragmentManager;
  30. import android.support.v4.app.FragmentTransaction;
  31. import android.support.v4.widget.DrawerLayout;
  32. import android.support.v7.app.ActionBar;
  33. import android.support.v7.widget.GridLayoutManager;
  34. import android.support.v7.widget.RecyclerView;
  35. import android.util.Log;
  36. import android.view.MenuItem;
  37. import android.view.View;
  38. import android.widget.LinearLayout;
  39. import android.widget.TextView;
  40. import com.owncloud.android.MainApp;
  41. import com.owncloud.android.R;
  42. import com.owncloud.android.authentication.AccountUtils;
  43. import com.owncloud.android.datamodel.MediaFolder;
  44. import com.owncloud.android.datamodel.MediaProvider;
  45. import com.owncloud.android.datamodel.OCFile;
  46. import com.owncloud.android.datamodel.SyncedFolder;
  47. import com.owncloud.android.datamodel.SyncedFolderDisplayItem;
  48. import com.owncloud.android.datamodel.SyncedFolderProvider;
  49. import com.owncloud.android.files.services.FileUploader;
  50. import com.owncloud.android.lib.common.utils.Log_OC;
  51. import com.owncloud.android.ui.adapter.FolderSyncAdapter;
  52. import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
  53. import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment;
  54. import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable;
  55. import com.owncloud.android.ui.events.CustomFolderEvent;
  56. import com.owncloud.android.utils.AnalyticsUtils;
  57. import com.owncloud.android.utils.DisplayUtils;
  58. import com.owncloud.android.utils.PermissionUtil;
  59. import com.owncloud.android.utils.ThemeUtils;
  60. import org.greenrobot.eventbus.Subscribe;
  61. import org.greenrobot.eventbus.ThreadMode;
  62. import java.io.File;
  63. import java.util.ArrayList;
  64. import java.util.Collections;
  65. import java.util.Comparator;
  66. import java.util.HashMap;
  67. import java.util.List;
  68. import java.util.Map;
  69. import java.util.TimerTask;
  70. import static com.owncloud.android.datamodel.SyncedFolderDisplayItem.UNPERSISTED_ID;
  71. /**
  72. * Activity displaying all auto-synced folders and/or instant upload media folders.
  73. */
  74. public class FolderSyncActivity extends FileActivity implements FolderSyncAdapter.ClickListener,
  75. SyncedFolderPreferencesDialogFragment.OnSyncedFolderPreferenceListener {
  76. private static final String SYNCED_FOLDER_PREFERENCES_DIALOG_TAG = "SYNCED_FOLDER_PREFERENCES_DIALOG";
  77. public static final String PRIORITIZED_FOLDER = "Camera";
  78. public static final String EXTRA_SHOW_SIDEBAR = "SHOW_SIDEBAR";
  79. private static final String SCREEN_NAME = "Auto upload";
  80. private static final String TAG = FolderSyncActivity.class.getSimpleName();
  81. private RecyclerView mRecyclerView;
  82. private FolderSyncAdapter mAdapter;
  83. private LinearLayout mProgress;
  84. private TextView mEmpty;
  85. private SyncedFolderProvider mSyncedFolderProvider;
  86. private List<SyncedFolderDisplayItem> syncFolderItems;
  87. private SyncedFolderPreferencesDialogFragment mSyncedFolderPreferencesDialogFragment;
  88. private boolean showSidebar = true;
  89. @Override
  90. protected void onCreate(Bundle savedInstanceState) {
  91. super.onCreate(savedInstanceState);
  92. if (getIntent().getExtras() != null) {
  93. showSidebar = getIntent().getExtras().getBoolean(EXTRA_SHOW_SIDEBAR);
  94. }
  95. setContentView(R.layout.folder_sync_layout);
  96. // setup toolbar
  97. setupToolbar();
  98. // setup drawer
  99. setupDrawer(R.id.nav_folder_sync);
  100. if (!showSidebar) {
  101. setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
  102. mDrawerToggle.setDrawerIndicatorEnabled(false);
  103. }
  104. setupContent();
  105. ActionBar actionBar = getSupportActionBar();
  106. if (actionBar != null) {
  107. ThemeUtils.setColoredTitle(getSupportActionBar(), getString(R.string.drawer_folder_sync));
  108. actionBar.setDisplayHomeAsUpEnabled(true);
  109. }
  110. if (ThemeUtils.themingEnabled()) {
  111. setTheme(R.style.FallbackThemingTheme);
  112. }
  113. }
  114. @Override
  115. protected void onResume() {
  116. super.onResume();
  117. AnalyticsUtils.setCurrentScreenName(this, SCREEN_NAME, TAG);
  118. }
  119. /**
  120. * sets up the UI elements and loads all media/synced folders.
  121. */
  122. private void setupContent() {
  123. mRecyclerView = (RecyclerView) findViewById(android.R.id.list);
  124. mProgress = (LinearLayout) findViewById(android.R.id.progress);
  125. mEmpty = (TextView) findViewById(android.R.id.empty);
  126. final int gridWidth = getResources().getInteger(R.integer.media_grid_width);
  127. boolean lightVersion = getResources().getBoolean(R.bool.syncedFolder_light);
  128. mAdapter = new FolderSyncAdapter(this, gridWidth, this, lightVersion);
  129. mSyncedFolderProvider = new SyncedFolderProvider(getContentResolver());
  130. final GridLayoutManager lm = new GridLayoutManager(this, gridWidth);
  131. mAdapter.setLayoutManager(lm);
  132. int spacing = getResources().getDimensionPixelSize(R.dimen.media_grid_spacing);
  133. mRecyclerView.addItemDecoration(new MediaGridItemDecoration(spacing));
  134. mRecyclerView.setLayoutManager(lm);
  135. mRecyclerView.setAdapter(mAdapter);
  136. BottomNavigationView bottomNavigationView = (BottomNavigationView) findViewById(R.id.bottom_navigation_view);
  137. if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
  138. bottomNavigationView.setVisibility(View.VISIBLE);
  139. DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1);
  140. }
  141. load(gridWidth * 2, false);
  142. }
  143. /**
  144. * loads all media/synced folders, adds them to the recycler view adapter and shows the list.
  145. *
  146. * @param perFolderMediaItemLimit the amount of media items to be loaded/shown per media folder
  147. */
  148. private void load(final int perFolderMediaItemLimit, boolean force) {
  149. if (mAdapter.getItemCount() > 0 && !force) {
  150. return;
  151. }
  152. setListShown(false);
  153. final Handler mHandler = new Handler();
  154. new Thread(new Runnable() {
  155. @Override
  156. public void run() {
  157. final List<MediaFolder> mediaFolders = MediaProvider.getImageFolders(getContentResolver(),
  158. perFolderMediaItemLimit, FolderSyncActivity.this);
  159. Log_OC.w(TAG, "Picture Folders: " + mediaFolders.size());
  160. mediaFolders.addAll(MediaProvider.getVideoFolders(getContentResolver(), perFolderMediaItemLimit));
  161. Log_OC.w(TAG, "Picture+Video Folders: " + mediaFolders.size());
  162. //TODO properly merge image and video lists to remove duplicates
  163. List<SyncedFolder> syncedFolderArrayList = mSyncedFolderProvider.getSyncedFolders();
  164. List<SyncedFolder> currentAccountSyncedFoldersList = new ArrayList<>();
  165. Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(FolderSyncActivity.this);
  166. for (SyncedFolder syncedFolder : syncedFolderArrayList) {
  167. if (syncedFolder.getAccount().equals(currentAccount.name)) {
  168. currentAccountSyncedFoldersList.add(syncedFolder);
  169. }
  170. }
  171. syncFolderItems = sortSyncedFolderItems(mergeFolderData(currentAccountSyncedFoldersList,
  172. mediaFolders));
  173. mHandler.post(new TimerTask() {
  174. @Override
  175. public void run() {
  176. // strange hack to make everything work as expected
  177. if (syncFolderItems.size() > 0) {
  178. syncFolderItems.add(0, syncFolderItems.get(0));
  179. }
  180. mAdapter.setSyncFolderItems(syncFolderItems);
  181. setListShown(true);
  182. }
  183. });
  184. }
  185. }).start();
  186. }
  187. /**
  188. * merges two lists of {@link SyncedFolder} and {@link MediaFolder} items into one of SyncedFolderItems.
  189. *
  190. * @param syncedFolders the synced folders
  191. * @param mediaFolders the media folders
  192. * @return the merged list of SyncedFolderItems
  193. */
  194. @NonNull
  195. private List<SyncedFolderDisplayItem> mergeFolderData(List<SyncedFolder> syncedFolders,
  196. @NonNull List<MediaFolder> mediaFolders) {
  197. Map<String, SyncedFolder> syncedFoldersMap = createSyncedFoldersMap(syncedFolders);
  198. List<SyncedFolderDisplayItem> result = new ArrayList<>();
  199. for (MediaFolder mediaFolder : mediaFolders) {
  200. if (syncedFoldersMap.containsKey(mediaFolder.absolutePath)) {
  201. SyncedFolder syncedFolder = syncedFoldersMap.get(mediaFolder.absolutePath);
  202. syncedFoldersMap.remove(mediaFolder.absolutePath);
  203. result.add(createSyncedFolder(syncedFolder, mediaFolder));
  204. } else {
  205. result.add(createSyncedFolderFromMediaFolder(mediaFolder));
  206. }
  207. }
  208. for (SyncedFolder syncedFolder : syncedFoldersMap.values()) {
  209. SyncedFolderDisplayItem syncedFolderDisplayItem = createSyncedFolderWithoutMediaFolder(syncedFolder);
  210. result.add(syncedFolderDisplayItem);
  211. }
  212. return result;
  213. }
  214. /**
  215. * Sorts list of {@link SyncedFolderDisplayItem}s.
  216. *
  217. * @param syncFolderItemList list of items to be sorted
  218. * @return sorted list of items
  219. */
  220. public static List<SyncedFolderDisplayItem> sortSyncedFolderItems(List<SyncedFolderDisplayItem>
  221. syncFolderItemList) {
  222. Collections.sort(syncFolderItemList, new Comparator<SyncedFolderDisplayItem>() {
  223. public int compare(SyncedFolderDisplayItem f1, SyncedFolderDisplayItem f2) {
  224. if (f1 == null && f2 == null) {
  225. return 0;
  226. } else if (f1 == null) {
  227. return -1;
  228. } else if (f2 == null) {
  229. return 1;
  230. } else if (f1.isEnabled() && f2.isEnabled()) {
  231. return f1.getFolderName().toLowerCase().compareTo(f2.getFolderName().toLowerCase());
  232. } else if (f1.isEnabled()) {
  233. return -1;
  234. } else if (f2.isEnabled()) {
  235. return 1;
  236. } else if (f1.getFolderName() == null && f2.getFolderName() == null) {
  237. return 0;
  238. } else if (f1.getFolderName() == null) {
  239. return -1;
  240. } else if (f2.getFolderName() == null) {
  241. return 1;
  242. } else if (PRIORITIZED_FOLDER.equals(f1.getFolderName())) {
  243. return -1;
  244. } else if (PRIORITIZED_FOLDER.equals(f2.getFolderName())) {
  245. return 1;
  246. } else {
  247. return f1.getFolderName().toLowerCase().compareTo(f2.getFolderName().toLowerCase());
  248. }
  249. }
  250. });
  251. return syncFolderItemList;
  252. }
  253. @NonNull
  254. private SyncedFolderDisplayItem createSyncedFolderWithoutMediaFolder(@NonNull SyncedFolder syncedFolder) {
  255. return new SyncedFolderDisplayItem(
  256. syncedFolder.getId(),
  257. syncedFolder.getLocalPath(),
  258. syncedFolder.getRemotePath(),
  259. syncedFolder.getWifiOnly(),
  260. syncedFolder.getChargingOnly(),
  261. syncedFolder.getSubfolderByDate(),
  262. syncedFolder.getAccount(),
  263. syncedFolder.getUploadAction(),
  264. syncedFolder.isEnabled(),
  265. new File(syncedFolder.getLocalPath()).getName(),
  266. syncedFolder.getType());
  267. }
  268. /**
  269. * creates a SyncedFolderDisplayItem merging a {@link SyncedFolder} and a {@link MediaFolder} object instance.
  270. *
  271. * @param syncedFolder the synced folder object
  272. * @param mediaFolder the media folder object
  273. * @return the created SyncedFolderDisplayItem
  274. */
  275. @NonNull
  276. private SyncedFolderDisplayItem createSyncedFolder(@NonNull SyncedFolder syncedFolder, @NonNull MediaFolder mediaFolder) {
  277. return new SyncedFolderDisplayItem(
  278. syncedFolder.getId(),
  279. syncedFolder.getLocalPath(),
  280. syncedFolder.getRemotePath(),
  281. syncedFolder.getWifiOnly(),
  282. syncedFolder.getChargingOnly(),
  283. syncedFolder.getSubfolderByDate(),
  284. syncedFolder.getAccount(),
  285. syncedFolder.getUploadAction(),
  286. syncedFolder.isEnabled(),
  287. mediaFolder.filePaths,
  288. mediaFolder.folderName,
  289. mediaFolder.numberOfFiles,
  290. mediaFolder.type);
  291. }
  292. /**
  293. * creates a {@link SyncedFolderDisplayItem} based on a {@link MediaFolder} object instance.
  294. *
  295. * @param mediaFolder the media folder object
  296. * @return the created SyncedFolderDisplayItem
  297. */
  298. @NonNull
  299. private SyncedFolderDisplayItem createSyncedFolderFromMediaFolder(@NonNull MediaFolder mediaFolder) {
  300. return new SyncedFolderDisplayItem(
  301. UNPERSISTED_ID,
  302. mediaFolder.absolutePath,
  303. getString(R.string.instant_upload_path) + "/" + mediaFolder.folderName,
  304. true,
  305. false,
  306. false,
  307. AccountUtils.getCurrentOwnCloudAccount(this).name,
  308. FileUploader.LOCAL_BEHAVIOUR_FORGET,
  309. false,
  310. mediaFolder.filePaths,
  311. mediaFolder.folderName,
  312. mediaFolder.numberOfFiles,
  313. mediaFolder.type);
  314. }
  315. /**
  316. * creates a lookup map for a list of given {@link SyncedFolder}s with their local path as the key.
  317. *
  318. * @param syncFolders list of {@link SyncedFolder}s
  319. * @return the lookup map for {@link SyncedFolder}s
  320. */
  321. @NonNull
  322. private Map<String, SyncedFolder> createSyncedFoldersMap(List<SyncedFolder> syncFolders) {
  323. Map<String, SyncedFolder> result = new HashMap<>();
  324. if (syncFolders != null) {
  325. for (SyncedFolder syncFolder : syncFolders) {
  326. result.put(syncFolder.getLocalPath(), syncFolder);
  327. }
  328. }
  329. return result;
  330. }
  331. /**
  332. * show/hide recycler view list or the empty message / progress info.
  333. *
  334. * @param shown flag if list should be shown
  335. */
  336. private void setListShown(boolean shown) {
  337. if (mRecyclerView != null) {
  338. mRecyclerView.setVisibility(shown ? View.VISIBLE : View.GONE);
  339. mProgress.setVisibility(shown ? View.GONE : View.VISIBLE);
  340. mEmpty.setVisibility(shown && mAdapter.getItemCount() == 0 ? View.VISIBLE : View.GONE);
  341. }
  342. }
  343. @Override
  344. public boolean onOptionsItemSelected(MenuItem item) {
  345. boolean result = true;
  346. switch (item.getItemId()) {
  347. case android.R.id.home: {
  348. if (showSidebar) {
  349. if (isDrawerOpen()) {
  350. closeDrawer();
  351. } else {
  352. openDrawer();
  353. }
  354. } else {
  355. Intent settingsIntent = new Intent(getApplicationContext(), Preferences.class);
  356. startActivity(settingsIntent);
  357. }
  358. break;
  359. }
  360. default:
  361. result = super.onOptionsItemSelected(item);
  362. break;
  363. }
  364. return result;
  365. }
  366. @Override
  367. public void restart() {
  368. Intent i = new Intent(this, FileDisplayActivity.class);
  369. i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  370. startActivity(i);
  371. }
  372. @Override
  373. public void showFiles(boolean onDeviceOnly) {
  374. MainApp.showOnlyFilesOnDevice(onDeviceOnly);
  375. Intent fileDisplayActivity = new Intent(getApplicationContext(), FileDisplayActivity.class);
  376. fileDisplayActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  377. startActivity(fileDisplayActivity);
  378. }
  379. @Override
  380. public void onSyncStatusToggleClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem) {
  381. if (syncedFolderDisplayItem.getId() > UNPERSISTED_ID) {
  382. mSyncedFolderProvider.updateFolderSyncEnabled(syncedFolderDisplayItem.getId(),
  383. syncedFolderDisplayItem.isEnabled());
  384. } else {
  385. long storedId = mSyncedFolderProvider.storeFolderSync(syncedFolderDisplayItem);
  386. if (storedId != -1) {
  387. syncedFolderDisplayItem.setId(storedId);
  388. }
  389. }
  390. }
  391. @Override
  392. public void onSyncFolderSettingsClick(int section, SyncedFolderDisplayItem syncedFolderDisplayItem) {
  393. FragmentManager fm = getSupportFragmentManager();
  394. FragmentTransaction ft = fm.beginTransaction();
  395. ft.addToBackStack(null);
  396. mSyncedFolderPreferencesDialogFragment = SyncedFolderPreferencesDialogFragment.newInstance(
  397. syncedFolderDisplayItem, section);
  398. mSyncedFolderPreferencesDialogFragment.show(ft, SYNCED_FOLDER_PREFERENCES_DIALOG_TAG);
  399. }
  400. @Override
  401. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  402. if (requestCode == SyncedFolderPreferencesDialogFragment.REQUEST_CODE__SELECT_REMOTE_FOLDER
  403. && resultCode == RESULT_OK && mSyncedFolderPreferencesDialogFragment != null) {
  404. OCFile chosenFolder = data.getParcelableExtra(FolderPickerActivity.EXTRA_FOLDER);
  405. mSyncedFolderPreferencesDialogFragment.setRemoteFolderSummary(chosenFolder.getRemotePath());
  406. } if (requestCode == SyncedFolderPreferencesDialogFragment.REQUEST_CODE__SELECT_LOCAL_FOLDER
  407. && resultCode == RESULT_OK && mSyncedFolderPreferencesDialogFragment != null) {
  408. String localPath = data.getStringExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES);
  409. mSyncedFolderPreferencesDialogFragment.setLocalFolderSummary(localPath);
  410. }
  411. else {
  412. super.onActivityResult(requestCode, resultCode, data);
  413. }
  414. }
  415. @Override
  416. public void onSaveSyncedFolderPreference(SyncedFolderParcelable syncedFolder) {
  417. // custom folders newly created aren't in the list already,
  418. // so triggering a refresh
  419. if (MediaFolder.CUSTOM.equals(syncedFolder.getType()) && syncedFolder.getId() == UNPERSISTED_ID) {
  420. SyncedFolderDisplayItem newCustomFolder = new SyncedFolderDisplayItem(
  421. SyncedFolder.UNPERSISTED_ID, syncedFolder.getLocalPath(), syncedFolder.getRemotePath(),
  422. syncedFolder.getWifiOnly(), syncedFolder.getChargingOnly(), syncedFolder.getSubfolderByDate(),
  423. syncedFolder.getAccount(), syncedFolder.getUploadAction(), syncedFolder.getEnabled(),
  424. new File(syncedFolder.getLocalPath()).getName(), syncedFolder.getType());
  425. long storedId = mSyncedFolderProvider.storeFolderSync(newCustomFolder);
  426. if (storedId != -1) {
  427. newCustomFolder.setId(storedId);
  428. }
  429. mAdapter.addSyncFolderItem(newCustomFolder);
  430. } else {
  431. SyncedFolderDisplayItem item = syncFolderItems.get(syncedFolder.getSection()-1);
  432. boolean dirty = item.isEnabled() != syncedFolder.getEnabled();
  433. item = updateSyncedFolderItem(item, syncedFolder.getLocalPath(), syncedFolder.getRemotePath(), syncedFolder
  434. .getWifiOnly(), syncedFolder.getChargingOnly(), syncedFolder.getSubfolderByDate(), syncedFolder
  435. .getUploadAction(), syncedFolder.getEnabled());
  436. if (syncedFolder.getId() == UNPERSISTED_ID) {
  437. // newly set up folder sync config
  438. long storedId = mSyncedFolderProvider.storeFolderSync(item);
  439. if (storedId != -1) {
  440. item.setId(storedId);
  441. }
  442. } else {
  443. // existing synced folder setup to be updated
  444. mSyncedFolderProvider.updateSyncFolder(item);
  445. }
  446. if(dirty) {
  447. mAdapter.setSyncFolderItem(syncedFolder.getSection(), item);
  448. }
  449. }
  450. mSyncedFolderPreferencesDialogFragment = null;
  451. }
  452. @Override
  453. public void onCancelSyncedFolderPreference() {
  454. mSyncedFolderPreferencesDialogFragment = null;
  455. }
  456. @Override
  457. public void onDeleteSyncedFolderPreference(SyncedFolderParcelable syncedFolder) {
  458. // TODO refresh recycler view
  459. mSyncedFolderProvider.deleteSyncedFolder(syncedFolder.getId());
  460. mAdapter.removeItem(syncedFolder.getSection());
  461. }
  462. /**
  463. * update given synced folder with the given values.
  464. *
  465. * @param item the synced folder to be updated
  466. * @param localPath the local path
  467. * @param remotePath the remote path
  468. * @param wifiOnly upload on wifi only
  469. * @param chargingOnly upload on charging only
  470. * @param subfolderByDate created sub folders
  471. * @param uploadAction upload action
  472. * @param enabled is sync enabled
  473. * @return the updated item
  474. */
  475. private SyncedFolderDisplayItem updateSyncedFolderItem(SyncedFolderDisplayItem item,
  476. String localPath,
  477. String remotePath,
  478. Boolean wifiOnly,
  479. Boolean chargingOnly,
  480. Boolean subfolderByDate,
  481. Integer uploadAction,
  482. Boolean enabled) {
  483. item.setLocalPath(localPath);
  484. item.setRemotePath(remotePath);
  485. item.setWifiOnly(wifiOnly);
  486. item.setChargingOnly(chargingOnly);
  487. item.setSubfolderByDate(subfolderByDate);
  488. item.setUploadAction(uploadAction);
  489. item.setEnabled(enabled);
  490. return item;
  491. }
  492. @Override
  493. public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
  494. @NonNull int[] grantResults) {
  495. switch (requestCode) {
  496. case PermissionUtil.PERMISSIONS_WRITE_EXTERNAL_STORAGE: {
  497. // If request is cancelled, result arrays are empty.
  498. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  499. // permission was granted
  500. int gridWidth = getResources().getInteger(R.integer.media_grid_width);
  501. load(gridWidth * 2, true);
  502. } else {
  503. // permission denied --> do nothing
  504. return;
  505. }
  506. return;
  507. }
  508. default:
  509. super.onRequestPermissionsResult(requestCode, permissions, grantResults);
  510. }
  511. }
  512. @Subscribe(threadMode = ThreadMode.MAIN)
  513. public void onMessageEvent(CustomFolderEvent event) {
  514. Log.d(TAG, "Show custom folder magic here");
  515. SyncedFolderDisplayItem emptyCustomFolder = new SyncedFolderDisplayItem(
  516. SyncedFolder.UNPERSISTED_ID, null, null, true, false,
  517. false, AccountUtils.getCurrentOwnCloudAccount(this).name,
  518. FileUploader.LOCAL_BEHAVIOUR_FORGET, false, null, MediaFolder.CUSTOM);
  519. onSyncFolderSettingsClick(0, emptyCustomFolder);
  520. };
  521. }