/*
* 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.login;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.transition.Fade;
import android.transition.Slide;
import android.transition.TransitionSet;
import android.view.Gravity;
import android.view.View;
import org.opensilk.common.core.dagger2.ScreenScope;
import org.opensilk.common.core.util.VersionUtils;
import org.opensilk.common.ui.mortar.ActivityResultsController;
import org.opensilk.common.ui.mortarfragment.FragmentManagerOwner;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import mortar.ViewPresenter;
import rx.Observable;
import rx.Subscriber;
import rx.Subscription;
import rx.functions.Func1;
import syncthing.android.identicon.IdenticonComponent;
import syncthing.android.settings.AppSettings;
import syncthing.android.identicon.IdenticonGenerator;
import syncthing.api.Credentials;
import timber.log.Timber;
/**
* Created by drew on 3/15/15.
*/
@ScreenScope
public class ManagePresenter extends ViewPresenter<ManageScreenView> implements
android.databinding.DataBindingComponent, IdenticonComponent {
final IdenticonGenerator identiconGenerator;
final FragmentManagerOwner fragmentManagerOwner;
final AppSettings appSettings;
final ActivityResultsController activityResultsController;
Subscription loaderSubscription;
boolean adapterDirty;
@Inject
public ManagePresenter(
IdenticonGenerator identiconGenerator,
FragmentManagerOwner fragmentManagerOwner,
AppSettings appSettings,
ActivityResultsController activityResultsController
) {
this.identiconGenerator = identiconGenerator;
this.fragmentManagerOwner = fragmentManagerOwner;
this.appSettings = appSettings;
this.activityResultsController = activityResultsController;
}
@Override
protected void onExitScope() {
super.onExitScope();
if (loaderSubscription != null) loaderSubscription.unsubscribe();
}
@Override
protected void onLoad(Bundle savedInstanceState) {
super.onLoad(savedInstanceState);
reload();
}
void reload() {
if (loaderSubscription != null) loaderSubscription.unsubscribe();
adapterDirty = true;
loaderSubscription = Observable.create(new Observable.OnSubscribe<List<Credentials>>() {
@Override
public void call(Subscriber<? super List<Credentials>> subscriber) {
subscriber.onNext(appSettings.getSavedCredentialsSorted());
subscriber.onCompleted();
}
}).map(new Func1<List<Credentials>, List<ManageDeviceCard>>() {
@Override
public List<ManageDeviceCard> call(List<Credentials> creds) {
List<ManageDeviceCard> cards = new ArrayList<>(creds.size());
Credentials defaultCredentials = appSettings.getDefaultCredentials();
for (Credentials c : creds) {
ManageDeviceCard card = new ManageDeviceCard(ManagePresenter.this, c);
card.setChecked(c.equals(defaultCredentials));
cards.add(card);
}
return cards;
}
}).subscribe(new Subscriber<List<ManageDeviceCard>>() {
@Override
public void onCompleted() {
if (hasView()) {
getView().onComplete();
}
}
@Override
public void onError(Throwable e) {
Timber.e(e, "loadCredentials");
//TODO notify
}
@Override
public void onNext(List<ManageDeviceCard> manageDeviceCards) {
if (hasView()) {
getView().addAll(manageDeviceCards, adapterDirty);
adapterDirty = false;
}
}
});
}
void openEditScreen(Credentials credentials) {
LoginFragment f = LoginFragment.newInstance(credentials);
applyFragmentTransitions(f);
fragmentManagerOwner.replaceMainContent(f, true);
}
void removeDevice(Credentials credentials) {
appSettings.removeCredentials(credentials);
reload();
}
void setAsDefault(Credentials credentials) {
appSettings.setDefaultCredentials(credentials);
reload();
}
public void openLoginScreen(View btn) {
LoginFragment f = LoginFragment.newInstance(Credentials.NONE);
applyFragmentTransitions(f);
fragmentManagerOwner.replaceMainContent(f, true);
}
public void closeDialog(View btn) {
activityResultsController.setResultAndFinish(Activity.RESULT_OK, null);
}
public IdenticonGenerator identiconGenerator() {
return identiconGenerator;
}
@TargetApi(21)
private void applyFragmentTransitions(Fragment f) {
if (VersionUtils.hasLollipop()) {
TransitionSet set = new TransitionSet();
set.addTransition(new Slide(Gravity.BOTTOM));
set.addTransition(new Fade(Fade.IN));
f.setEnterTransition(set);
}
}
}