blob: 8e95fa569e26924d1e89ce68355430c2cd0c05a5 [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package io.v.baku.toolkit.blessings;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.os.Bundle;
import io.v.android.v23.services.blessing.BlessingService;
import io.v.baku.toolkit.ErrorReporters;
import io.v.v23.security.Blessings;
import lombok.experimental.Accessors;
import lombok.experimental.Delegate;
import lombok.extern.slf4j.Slf4j;
import rx.Observable;
import rx.subjects.ReplaySubject;
@Accessors(prefix = "m")
@Slf4j
public class AccountManagerBlessingsFragment extends Fragment
implements RefreshableBlessingsProvider {
public static final String TAG = AccountManagerBlessingsFragment.class.getName();
private static final int BLESSING_REQUEST = 0;
private static final String SEEKING =
AccountManagerBlessingsFragment.class.getName() + ".seeking";
public static AccountManagerBlessingsFragment find(final FragmentManager mgr) {
return (AccountManagerBlessingsFragment)mgr.findFragmentByTag(TAG);
}
@Delegate(types = RefreshableBlessingsProvider.class, excludes = BlessingsProvider.class)
private ActivityBlessingsSeeker mSeeker;
private ReplaySubject<ActivityBlessingsSeeker> mSeekers = ReplaySubject.createWithSize(1);
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final boolean resumingSeek = savedInstanceState != null &&
savedInstanceState.getBoolean(SEEKING);
mSeeker = new ActivityBlessingsSeeker(
getActivity(), ErrorReporters.forFragment(this), resumingSeek) {
@Override
protected void seekBlessings() {
final Intent intent = BlessingService.newBlessingIntent(getActivity());
startActivityForResult(intent, BLESSING_REQUEST);
}
};
mSeekers.onNext(mSeeker);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean(SEEKING, mSeeker.isAwaitingBlessings());
}
@Override
public void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case BLESSING_REQUEST:
try {
mSeeker.setBlessings(BlessingsUtils.fromActivityResult(resultCode, data));
} catch (final Exception e) {
mSeeker.handleBlessingsError(e);
}
break;
default:
}
}
@Override
public Observable<Blessings> getRxBlessings() {
return mSeekers.switchMap(ActivityBlessingsSeeker::getRxBlessings);
}
@Override
public Observable<Blessings> getPassiveRxBlessings() {
return mSeekers.switchMap(ActivityBlessingsSeeker::getPassiveRxBlessings);
}
}