package com.nutomic.syncthingandroid.fragments; import android.content.Intent; import android.os.Bundle; import android.support.v4.app.ListFragment; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import com.nutomic.syncthingandroid.R; import com.nutomic.syncthingandroid.activities.FolderActivity; import com.nutomic.syncthingandroid.activities.SyncthingActivity; import com.nutomic.syncthingandroid.model.Folder; import com.nutomic.syncthingandroid.service.SyncthingService; import com.nutomic.syncthingandroid.views.FoldersAdapter; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Timer; import java.util.TimerTask; /** * Displays a list of all existing folders. */ public class FolderListFragment extends ListFragment implements SyncthingService.OnApiChangeListener, AdapterView.OnItemClickListener { /** * Compares folders by labels, uses the folder ID as fallback if the label is empty */ private final static Comparator<Folder> FOLDERS_COMPARATOR = (lhs, rhs) -> { String lhsLabel = lhs.label != null && !lhs.label.isEmpty() ? lhs.label : lhs.id; String rhsLabel = rhs.label != null && !rhs.label.isEmpty() ? rhs.label : rhs.id; return lhsLabel.compareTo(rhsLabel); }; private FoldersAdapter mAdapter; private Timer mTimer; @Override public void onPause() { super.onPause(); if (mTimer != null) { mTimer.cancel(); } } @Override public void onApiChange(SyncthingService.State currentState) { if (currentState != SyncthingService.State.ACTIVE) return; mTimer = new Timer(); mTimer.schedule(new TimerTask() { @Override public void run() { if (getActivity() == null) return; getActivity().runOnUiThread(FolderListFragment.this::updateList); } }, 0, SyncthingService.GUI_UPDATE_INTERVAL); } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setHasOptionsMenu(true); setEmptyText(getString(R.string.folder_list_empty)); getListView().setOnItemClickListener(this); } /** * Refreshes ListView by updating folders and info. * * Also creates adapter if it doesn't exist yet. */ private void updateList() { SyncthingActivity activity = (SyncthingActivity) getActivity(); if (activity.getApi() == null || getView() == null || activity.isFinishing()) return; if (mAdapter == null) { mAdapter = new FoldersAdapter(activity); setListAdapter(mAdapter); } // Prevent scroll position reset due to list update from clear(). mAdapter.setNotifyOnChange(false); mAdapter.clear(); List<Folder> folders = activity.getApi().getFolders(); Collections.sort(folders, FOLDERS_COMPARATOR); mAdapter.addAll(folders); mAdapter.updateModel(activity.getApi()); mAdapter.notifyDataSetChanged(); setListShown(true); } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Intent intent = new Intent(getActivity(), FolderActivity.class) .putExtra(FolderActivity.EXTRA_IS_CREATE, false) .putExtra(FolderActivity.EXTRA_FOLDER_ID, mAdapter.getItem(i).id); startActivity(intent); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.folder_list, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.add_folder: Intent intent = new Intent(getActivity(), FolderActivity.class) .putExtra(FolderActivity.EXTRA_IS_CREATE, true); startActivity(intent); return true; default: return super.onOptionsItemSelected(item); } } }