/*
* Copyright (C) 2012-2016 The Android Money Manager Ex Project Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.money.manager.ex.sync;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.MaterialDialog;
import com.cloudrail.si.types.CloudMetaData;
import com.money.manager.ex.R;
import com.money.manager.ex.common.events.ListItemClickedEvent;
import com.money.manager.ex.core.Core;
import com.money.manager.ex.view.recycler.DividerItemDecoration;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import rx.SingleSubscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
import timber.log.Timber;
/**
* A simple {@link Fragment} subclass.
*/
public class CloudFilePickerFragment
extends Fragment {
public CloudFilePickerFragment() {
// Required empty public constructor
}
private SyncManager syncManager;
private RecyclerView mRecyclerView;
private CloudDataAdapter mAdapter;
private MaterialDialog progressDialog;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_cloud_file_picker, container, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// Separator
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), LinearLayoutManager.VERTICAL));
// get data
getFolderContents("/");
return view;
}
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
@Subscribe
public void onEvent(ListItemClickedEvent event) {
// get item
CloudMetaData item = mAdapter.mData.get(event.id);
if (item.getFolder()) {
// open folder
String folder = item.getPath();
getFolderContents(folder);
} else {
// check if the file is a valid database?
if (!isValidDatabase(item)) {
// show notification
new Core(getActivity()).alert(R.string.invalid_database);
}
// select file.
Intent data = new Intent();
data.putExtra(SyncPreferenceFragment.EXTRA_REMOTE_FILE, item.getPath());
getActivity().setResult(Activity.RESULT_OK, data);
getActivity().finish();
}
}
private void getFolderContents(String folder) {
// show progress bar
progressDialog = new MaterialDialog.Builder(getActivity())
.title(R.string.loading)
.content(R.string.please_wait)
.progress(true, 0)
.canceledOnTouchOutside(false)
.show();
getSyncManager().getRemoteFolderContentsSingle(folder)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Func1<List<CloudMetaData>, List<CloudMetaData>>() {
@Override
public List<CloudMetaData> call(List<CloudMetaData> cloudMetaDatas) {
// sort the items in the process.
return sortRemoteItems(cloudMetaDatas);
}
})
.subscribe(new SingleSubscriber<List<CloudMetaData>>() {
@Override
public void onSuccess(List<CloudMetaData> value) {
// hide the progress binaryDialog
progressDialog.dismiss();
// Refresh the data in the list.
mAdapter = new CloudDataAdapter(getActivity(), value);
mRecyclerView.setAdapter(mAdapter);
}
@Override
public void onError(Throwable error) {
progressDialog.dismiss();
Timber.e(error, "retrieving the remote folder contents");
// Close activity.
Activity activity = getActivity();
if (activity != null) {
activity.finish();
}
}
});
}
private boolean isValidDatabase(CloudMetaData item) {
return item.getName().endsWith(".mmb");
}
private SyncManager getSyncManager() {
if (syncManager == null) {
syncManager = new SyncManager(getActivity());
}
return syncManager;
}
private List<CloudMetaData> sortRemoteItems(List<CloudMetaData> items) {
// sort the retrieved items: folders first, order by name.
Comparator<CloudMetaData> nameComparator = new Comparator<CloudMetaData>() {
@Override
public int compare(CloudMetaData lhs, CloudMetaData rhs) {
// order by name
return lhs.getName().toLowerCase().compareTo(rhs.getName().toLowerCase());
}
};
Collections.sort(items, nameComparator);
Comparator<CloudMetaData> folderComparator = new Comparator<CloudMetaData>() {
@Override
public int compare(CloudMetaData lhs, CloudMetaData rhs) {
// folders before files
if (lhs.getFolder() && !rhs.getFolder()) return -1;
//if (lhs.getFolder() && rhs.getFolder()) return 0;
if (!lhs.getFolder() && rhs.getFolder()) return 1;
return 0;
}
};
Collections.sort(items, folderComparator);
return items;
}
}