/* * 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.sessionsettings; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.databinding.PropertyChangeRegistry; import android.databinding.adapters.ViewBindingAdapter; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Toast; import org.opensilk.common.core.rx.RxUtils; import org.opensilk.common.ui.mortar.ActionBarConfig; import org.opensilk.common.ui.mortar.ActivityResultsController; import org.opensilk.common.ui.mortar.DialogPresenter; import org.opensilk.common.ui.mortar.ToolbarOwner; import mortar.MortarScope; import mortar.ViewPresenter; import rx.Scheduler; import rx.Subscription; import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; import syncthing.android.R; import syncthing.android.ui.binding.BindingSubscriptionsHolder; import syncthing.api.Credentials; import syncthing.api.Session; import syncthing.api.SessionController; import syncthing.api.SessionManager; import timber.log.Timber; /** * Created by drew on 3/23/15. */ public class EditPresenter<V extends View> extends ViewPresenter<V> implements android.databinding.Observable, BindingSubscriptionsHolder { protected final SessionManager manager; protected final SessionController controller; protected final String folderId; protected final String deviceId; protected final boolean isAdd; protected final Session session; protected final DialogPresenter dialogPresenter; protected final ActivityResultsController activityResultsController; protected final Credentials credentials; protected final ToolbarOwner toolbarOwner; protected final PropertyChangeRegistry registry = new PropertyChangeRegistry(); protected CompositeSubscription bindingSubscriptions; protected Subscription saveSubscription; protected int titleRes; protected boolean wasPreviouslyLoaded; public EditPresenter( SessionManager manager, DialogPresenter dialogPresenter, ActivityResultsController activityResultContoller, ToolbarOwner toolbarOwner, EditPresenterConfig config ) { this.manager = manager; this.dialogPresenter = dialogPresenter; this.activityResultsController = activityResultContoller; this.toolbarOwner = toolbarOwner; this.session = manager.acquire(config.credentials); this.controller = this.session.controller(); this.folderId = config.folderId; this.deviceId = config.deviceId; this.isAdd = config.isAdd; this.credentials = config.credentials; } @Override protected void onEnterScope(MortarScope scope) { titleRes = EditFragment2.TitleService.getTitle(scope); } @Override protected void onExitScope() { super.onExitScope(); unsubscribe(saveSubscription); manager.release(session); } //TODO save saving state and restore protected void onSaveStart() { dialogPresenter.showDialog( context -> { ProgressDialog mProgressDialog = new ProgressDialog(context); mProgressDialog.setMessage(context.getResources().getString(R.string.saving_config_dots)); return mProgressDialog; } ); } protected void onSaveSuccessfull() { dialogPresenter.dismissDialog(); if (hasView()) { Toast.makeText(getView().getContext(), R.string.config_saved, Toast.LENGTH_SHORT).show(); } dismissDialog(); } protected void onSavefailed(Throwable e) { final String msg = e.getMessage(); dialogPresenter.showDialog(context -> new AlertDialog.Builder(context) .setTitle(R.string.error) .setMessage(msg) .setPositiveButton(android.R.string.ok, null) .create() ); } public void dismissDialog(View btn) { dismissDialog(); } protected void dismissDialog() { activityResultsController.setResultAndFinish(Activity.RESULT_OK, null); } protected void unsubscribe(final Subscription s) { if (s != null) { final Scheduler.Worker worker = Schedulers.io().createWorker(); worker.schedule(() -> { s.unsubscribe(); worker.unsubscribe(); }); } } public ActionBarConfig getToolbarConfig() { return ActionBarConfig.builder() .setTitle(titleRes).build(); } @Override public void addOnPropertyChangedCallback(OnPropertyChangedCallback callback) { registry.add(callback); } @Override public void removeOnPropertyChangedCallback(OnPropertyChangedCallback callback) { registry.remove(callback); } protected void notifyChange(int val) { registry.notifyChange(this, val); } @Override public CompositeSubscription bindingSubscriptions() { return (bindingSubscriptions != null) ? bindingSubscriptions : (bindingSubscriptions = new CompositeSubscription()); } public final ViewBindingAdapter.OnViewAttachedToWindow toolbarAttachedListener = new ViewBindingAdapter.OnViewAttachedToWindow() { @Override public void onViewAttachedToWindow(View v) { Toolbar toolbar = (Toolbar)v; toolbarOwner.attachToolbar(toolbar); toolbarOwner.setConfig(getToolbarConfig()); } }; public final ViewBindingAdapter.OnViewDetachedFromWindow toolbarDetachedListener = new ViewBindingAdapter.OnViewDetachedFromWindow() { @Override public void onViewDetachedFromWindow(View v) { Toolbar toolbar = (Toolbar) v; toolbarOwner.detachToolbar(toolbar); } }; public final ViewBindingAdapter.OnViewDetachedFromWindow dropViewListener = new ViewBindingAdapter.OnViewDetachedFromWindow() { @Override @SuppressWarnings("unchecked") public void onViewDetachedFromWindow(View v) { Timber.d("Dropping view %s"); dropView((V) v); RxUtils.unsubscribe(bindingSubscriptions); bindingSubscriptions = null; } }; }