/* * Copyright (c) linroid 2015. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.linroid.pushapp.ui.auth; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.Snackbar; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.View; import com.linroid.pushapp.App; import com.linroid.pushapp.Constants; import com.linroid.pushapp.R; import com.linroid.pushapp.api.AuthService; import com.linroid.pushapp.model.Auth; import com.linroid.pushapp.model.Pagination; import com.linroid.pushapp.ui.base.RefreshableFragment; import com.linroid.pushapp.ui.bind.ScanActivity; import com.squareup.picasso.Picasso; import java.util.List; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import retrofit.Callback; import retrofit.RetrofitError; import retrofit.client.Response; import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action1; import rx.functions.Func1; import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; /** * TODO 添加数据库支持 * Created by linroid on 8/15/15. */ public class AuthFragment extends RefreshableFragment implements AuthAdapter.OnActionListener, View.OnClickListener { public static final int MSG_REVOKE = 0x11; @Inject Picasso picasso; @Inject AuthService authApi; AuthAdapter adapter; FloatingActionButton fab; CompositeSubscription subscriptions = new CompositeSubscription(); public AuthFragment() { } @Override public void onAttach(Activity activity) { super.onAttach(activity); App.from(activity).component().inject(this); } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); fab = (FloatingActionButton) getActivity().findViewById(R.id.fab); fab.setOnClickListener(this); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); adapter = new AuthAdapter(picasso); adapter.setListener(this); forceRefresh(); } @Override public void onDestroy() { super.onDestroy(); subscriptions.unsubscribe(); } @Override protected int provideViewResourceId() { return R.layout.fragment_auth; } @Override public RecyclerView.Adapter<? extends RecyclerView.ViewHolder> getAdapter() { return adapter; } @Override public void loadData(int page) { subscriptions.add(authApi.listAuth(page) .map(new Func1<Pagination<Auth>, List<Auth>>() { @Override public List<Auth> call(Pagination<Auth> pagination) { loaderView.setPage(pagination.getCurrentPage(), pagination.getLastPage()); return pagination.getData(); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(adapter, new Action1<Throwable>() { @Override public void call(Throwable throwable) { Snackbar.make(fab, throwable.getMessage(), Snackbar.LENGTH_LONG).show(); loaderView.notifyLoadFailed(throwable); } })); } @Override public void onRevoke(final int position, final Auth auth) { adapter.remove(position); final Subscription subscription = authApi.revoke(auth.getId()) .delaySubscription(5, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<Void>() { @Override public void onCompleted() { Snackbar.make(fab, getString(R.string.msg_revoke_success, auth.getUser().getNickname()), Snackbar.LENGTH_SHORT).show(); } @Override public void onError(Throwable e) { Snackbar.make(fab, e.getMessage(), Snackbar.LENGTH_SHORT).show(); } @Override public void onNext(Void aVoid) { } }); subscriptions.add(subscription); Snackbar.make(fab, R.string.msg_revoke_progress, Snackbar.LENGTH_LONG) .setAction(R.string.btn_revoke_recall, new View.OnClickListener() { @Override public void onClick(View v) { subscriptions.remove(subscription); subscription.unsubscribe(); adapter.insertItem(position, auth); } }).show(); } // // /** // * 撤回 // * @param auth // */ // private void recallRevoke(final int position, Auth auth) { // final ProgressDialog dialog = new ProgressDialog(getActivity()); // dialog.setMessage(getString(R.string.msg_recall_revoke_progress)); // dialog.setIndeterminate(true); // dialog.show(); // authApi.recallRevoke(auth.getId(), new Callback<Auth>() { // @Override // public void success(Auth auth, Response response) { // adapter.insertItem(position, auth); // dialog.dismiss(); // } // // @Override // public void failure(RetrofitError error) { // dialog.dismiss(); // Snackbar.make(fab, error.getMessage(), Snackbar.LENGTH_SHORT).show(); // } // }); // } @Override public void onClick(View v) { Intent intent = ScanActivity.createNewScanIntent(getActivity(), getString(R.string.txt_scan_auth), Constants.QRCODE_KEY_AUTH); startActivityForResult(intent, ScanActivity.REQ_SCAN_QRCODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == ScanActivity.REQ_SCAN_QRCODE && resultCode == Activity.RESULT_OK) { String token = data.getStringExtra(ScanActivity.EXTRA_QRCODE_VALUE); if (!TextUtils.isEmpty(token)) { authUser(token); Snackbar.make(fab, R.string.msg_auth_snack, Snackbar.LENGTH_LONG).show(); } } } private void authUser(String token) { authApi.authUser(token, new Callback<Auth>() { @Override public void success(Auth auth, Response response) { adapter.insertItem(auth); Snackbar.make(fab, getString(R.string.msg_auth_success, auth.getUser().getNickname()), Snackbar.LENGTH_LONG).show(); } @Override public void failure(RetrofitError error) { Snackbar.make(fab, error.getMessage(), Snackbar.LENGTH_LONG).show(); } }); } }