package cz.destil.wearsquare.fragment;
import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.anjlab.android.iab.v3.BillingProcessor;
import com.anjlab.android.iab.v3.TransactionDetails;
import com.foursquare.android.nativeoauth.FoursquareOAuth;
import com.foursquare.android.nativeoauth.model.AccessTokenResponse;
import com.foursquare.android.nativeoauth.model.AuthCodeResponse;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import cz.destil.wearsquare.BuildConfig;
import cz.destil.wearsquare.R;
import cz.destil.wearsquare.activity.SettingsActivity;
import cz.destil.wearsquare.data.Preferences;
import cz.destil.wearsquare.util.ToastUtil;
import permissions.dispatcher.DeniedPermission;
import permissions.dispatcher.NeedsPermission;
import permissions.dispatcher.RuntimePermissions;
import permissions.dispatcher.ShowsRationale;
/**
* Main fragment in the phone.
*
* @author David Vávra (david@vavra.me)
*/
@RuntimePermissions
public class MainFragment extends Fragment implements BillingProcessor.IBillingHandler {
private static final int REQUEST_CODE_FSQ_CONNECT = 42;
private static final int REQUEST_CODE_FSQ_TOKEN_EXCHANGE = 43;
@Bind(R.id.about)
TextView vAbout;
@Bind(R.id.login_box)
LinearLayout vLoginBox;
@Bind(R.id.instructions_box)
LinearLayout vInstructionsBox;
@Bind(R.id.donation)
Button vDonation;
BillingProcessor mBilling;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setHasOptionsMenu(true);
return inflater.inflate(R.layout.fragment_phone, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ButterKnife.bind(this, view);
setupAbout();
mBilling = new BillingProcessor(getActivity(), null, this);
MainFragmentPermissionsDispatcher.initWithCheck(this);
}
@Override
public void onDestroyView() {
if (mBilling != null) {
mBilling.release();
}
super.onDestroyView();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_logout).setVisible(Preferences.hasFoursquareToken());
super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_logout:
Preferences.clearFoursquareToken();
init();
break;
case R.id.action_settings:
SettingsActivity.call(getActivity());
break;
}
return super.onOptionsItemSelected(item);
}
private void setupAbout() {
vAbout.setMovementMethod(LinkMovementMethod.getInstance());
}
@NeedsPermission(Manifest.permission.ACCESS_FINE_LOCATION)
void init() {
if (Preferences.hasFoursquareToken()) {
vLoginBox.setVisibility(View.GONE);
vInstructionsBox.setVisibility(View.VISIBLE);
if (mBilling.isInitialized()) {
vDonation.setVisibility(View.VISIBLE);
}
} else {
vLoginBox.setVisibility(View.VISIBLE);
vInstructionsBox.setVisibility(View.GONE);
vDonation.setVisibility(View.GONE);
}
getActivity().invalidateOptionsMenu();
}
@OnClick(R.id.foursquare_button)
void connectFoursquare() {
try {
Intent intent = FoursquareOAuth.getConnectIntent(getContext(), BuildConfig.CLIENT_ID);
startActivityForResult(intent, REQUEST_CODE_FSQ_CONNECT);
} catch (ActivityNotFoundException e) {
ToastUtil.show(R.string.no_google_play);
}
}
@OnClick(R.id.donation)
void donate() {
mBilling.purchase(getActivity(), "beer");
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (!mBilling.handleActivityResult(requestCode, resultCode, data)) {
switch (requestCode) {
case REQUEST_CODE_FSQ_CONNECT:
AuthCodeResponse codeResponse = FoursquareOAuth.getAuthCodeFromResult(resultCode, data);
if (!TextUtils.isEmpty(codeResponse.getCode())) {
Intent intent = FoursquareOAuth.getTokenExchangeIntent(getContext(), BuildConfig.CLIENT_ID,
BuildConfig.CLIENT_SECRET, codeResponse.getCode());
startActivityForResult(intent, REQUEST_CODE_FSQ_TOKEN_EXCHANGE);
}
break;
case REQUEST_CODE_FSQ_TOKEN_EXCHANGE:
AccessTokenResponse tokenResponse = FoursquareOAuth.getTokenFromResult(resultCode, data);
if (!TextUtils.isEmpty(tokenResponse.getAccessToken())) {
Preferences.setFoursquareToken(tokenResponse.getAccessToken());
init();
}
break;
}
}
}
@Override
public void onProductPurchased(String s, TransactionDetails transactionDetails) {
ToastUtil.show(R.string.thanks);
mBilling.consumePurchase("beer");
}
@Override
public void onPurchaseHistoryRestored() {
}
@Override
public void onBillingError(int i, Throwable throwable) {
}
@Override
public void onBillingInitialized() {
if (Preferences.hasFoursquareToken()) {
vDonation.setVisibility(View.VISIBLE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
MainFragmentPermissionsDispatcher.
onRequestPermissionsResult(this, requestCode, grantResults);
}
@ShowsRationale(Manifest.permission.ACCESS_FINE_LOCATION)
void showRationaleForLocation() {
ToastUtil.show(R.string.location_permission_rationale);
}
@DeniedPermission(Manifest.permission.ACCESS_FINE_LOCATION)
void showDeniedForLocation() {
ToastUtil.show(R.string.location_permission_denied);
}
}