/* * Copyright (c) 2015 OpenSilk Productions LLC * * 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 syncthing.android.ui.folderpicker; import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.text.Editable; import android.text.InputType; import android.widget.EditText; import org.apache.commons.lang3.StringUtils; import org.opensilk.common.core.dagger2.ScreenScope; import org.opensilk.common.ui.mortar.ActionBarMenuConfig; import org.opensilk.common.ui.mortar.ActionBarMenuHandler; import org.opensilk.common.ui.mortar.ActivityResultsController; import org.opensilk.common.ui.mortar.DialogPresenter; import org.opensilk.common.ui.mortarfragment.FragmentManagerOwner; import java.util.Arrays; import java.util.List; import javax.inject.Inject; import javax.inject.Named; import mortar.ViewPresenter; import rx.Scheduler; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import syncthing.android.R; import syncthing.api.Credentials; import syncthing.api.Session; import syncthing.api.SessionManager; import timber.log.Timber; /** * Created by drew on 11/3/15. */ @ScreenScope public class FolderPickerPresenter extends ViewPresenter<FolderPickerView> { final Credentials credentials; final String path; final SessionManager sessionManager; final Session session; final FragmentManagerOwner fm; final ActivityResultsController activityResultsController; final DialogPresenter dialogPresenter; Subscription loaderSub; @Inject public FolderPickerPresenter( Credentials credentials, @Named("path") String path, SessionManager sessionManager, FragmentManagerOwner fm, ActivityResultsController activityResultsController, DialogPresenter dialogPresenter ) { this.credentials = credentials; this.path = StringUtils.endsWith(path, "/") ? path : path + "/"; this.sessionManager = sessionManager; this.session = sessionManager.acquire(credentials); this.fm = fm; this.activityResultsController = activityResultsController; this.dialogPresenter = dialogPresenter; } @Override protected void onExitScope() { super.onExitScope(); unsubscribeLoader(); sessionManager.release(session); } @Override protected void onLoad(Bundle savedInstanceState) { super.onLoad(savedInstanceState); getView().showLoading(); if (loaderSub == null || loaderSub.isUnsubscribed()) { loaderSub = session.controller().getAutoCompleteDirectoryList(path) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<List<String>>() { @Override public void onCompleted() { if (hasView()) { getView().onComplete(); } else { unsubscribeLoader(); } } @Override public void onError(Throwable e) { if (hasView()) { getView().showEmpty(true); } else { unsubscribeLoader(); } } @Override public void onNext(List<String> strings) { Timber.d("Paths = %s", Arrays.toString(strings.toArray())); if (hasView()) { if (!strings.isEmpty()) { getView().addAll(strings); getView().showList(true); } } } }); } } void unsubscribeLoader() { if (loaderSub != null) { final Subscription s = loaderSub; final Scheduler.Worker worker = Schedulers.io().createWorker(); worker.schedule(() -> { s.unsubscribe(); worker.unsubscribe(); }); loaderSub = null; } } public void onOpenFolder(Context context, String path) { FolderPickerFragment f = FolderPickerFragment.ni(context, credentials, path); fm.replaceMainContent(f, true); } public void onFolderSelected(String path) { Intent i = new Intent().putExtra("path", path); activityResultsController.setResultAndFinish(Activity.RESULT_OK, i); } public void createNewFolder() { dialogPresenter.showDialog(context -> { final EditText editText = new EditText(context); editText.setSingleLine(true); editText.setInputType(editText.getInputType() | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS); return new AlertDialog.Builder(context) .setTitle(R.string.new_folder) .setView(editText) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Editable e = editText.getText(); if (e != null) { onFolderSelected(path + e.toString()); } } }) .setNegativeButton(android.R.string.cancel, null) .create(); }); } public ActionBarMenuHandler getToolbarConfig() { return ActionBarMenuConfig.builder() .withMenu(R.menu.new_folder) .setActionHandler((context, integer) -> { switch (integer) { case R.id.new_folder: createNewFolder(); return true; default: return false; } }) .build(); } }