/* * Copyright 2013-2015 The GDG Frisbee Project * * 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 org.gdg.frisbee.android.onboarding; import android.app.backup.BackupManager; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.ViewPager; import android.widget.FrameLayout; import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.Tracker; import com.google.android.gms.appinvite.AppInvite; import com.google.android.gms.appinvite.AppInviteInvitationResult; import com.google.android.gms.appinvite.AppInviteReferral; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInResult; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResultCallback; import org.gdg.frisbee.android.R; import org.gdg.frisbee.android.api.model.Chapter; import org.gdg.frisbee.android.app.App; import org.gdg.frisbee.android.app.GoogleApiClientFactory; import org.gdg.frisbee.android.chapter.MainActivity; import org.gdg.frisbee.android.common.GdgActivity; import org.gdg.frisbee.android.utils.PrefUtils; import org.gdg.frisbee.android.widget.NonSwipeableViewPager; import butterknife.BindView; import butterknife.ButterKnife; import okhttp3.HttpUrl; public class FirstStartActivity extends GdgActivity implements FirstStartStep1Fragment.Step1Listener, FirstStartStep2Fragment.Step2Listener, FirstStartStep3Fragment.Step3Listener { private static final int RC_SIGN_IN = 101; public static final String ACTION_FIRST_START = "finish_first_start"; @BindView(R.id.pager) NonSwipeableViewPager mViewPager; @BindView(R.id.contentLayout) FrameLayout mContentLayout; private FirstStartPageAdapter mViewPagerAdapter; private GoogleApiClient signInClient; @Override protected GoogleApiClient createGoogleApiClient() { return GoogleApiClientFactory.createWithApi(this, AppInvite.API); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_first_start); ButterKnife.bind(this); App.from(this).updateLastLocation(); setupSignInClient(); mViewPagerAdapter = new FirstStartPageAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mViewPagerAdapter); mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int i, float v, int i2) { //To change body of implemented methods use File | Settings | File Templates. } @Override public void onPageSelected(int i) { Tracker t = App.from(FirstStartActivity.this).getTracker(); // Set screen name. // Where path is a String representing the screen name. t.setScreenName("/FirstStart/Step" + (1 + i)); // Send a screen view. t.send(new HitBuilders.AppViewBuilder().build()); } @Override public void onPageScrollStateChanged(int i) { //To change body of implemented methods use File | Settings | File Templates. } }); } private void setupSignInClient() { signInClient = GoogleApiClientFactory.createForSignIn(this, this); Auth.GoogleSignInApi.silentSignIn(signInClient).setResultCallback(new ResultCallback<GoogleSignInResult>() { @Override public void onResult(@NonNull GoogleSignInResult googleSignInResult) { if (googleSignInResult.isSuccess()) { PrefUtils.setSignedIn(getApplicationContext()); } } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); handleSignInResult(result); return; } mViewPagerAdapter.getItem(mViewPager.getCurrentItem()).onActivityResult(requestCode, resultCode, data); } private void handleSignInResult(GoogleSignInResult result) { if (result.isSuccess()) { PrefUtils.setSignedIn(this); moveToStep3(true); } } @Override protected void onStart() { super.onStart(); Tracker t = App.from(this).getTracker(); // Set screen name. // Where path is a String representing the screen name. t.setScreenName("/FirstStart/Step" + (1 + mViewPager.getCurrentItem())); // Send a screen view. t.send(new HitBuilders.AppViewBuilder().build()); } @Override public void onBackPressed() { if (mViewPager.getCurrentItem() > 0) { mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1); } else { super.finish(); } } @Override public void onConfirmedChapter(Chapter chapter) { PrefUtils.setHomeChapter(this, chapter); if (PrefUtils.isSignedIn(this)) { moveToStep3(true); } else if (GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this) == ConnectionResult.SERVICE_MISSING) { moveToStep3(false); } else { mViewPager.setCurrentItem(1); } } @Override public void onSignedIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(signInClient); startActivityForResult(signInIntent, RC_SIGN_IN); } @Override public void onConnected(Bundle bundle) { super.onConnected(bundle); AppInvite.AppInviteApi.getInvitation(getGoogleApiClient(), this, false) .setResultCallback(new ResultCallback<AppInviteInvitationResult>() { @Override public void onResult(@NonNull AppInviteInvitationResult result) { onInvitationLoaded(result); } }); } private void onInvitationLoaded(@NonNull AppInviteInvitationResult result) { if (result.getStatus().isSuccess()) { Intent intent = result.getInvitationIntent(); Invite invite = extractInvite(intent); if (invite != null) { FirstStartStep2Fragment loginFragment = (FirstStartStep2Fragment) mViewPagerAdapter.getItem(1); loginFragment.loadInvite(invite); sendAnalyticsEvent("AppInvite", "Installed", ""); } } } private static Invite extractInvite(Intent intent) { String deepLink = AppInviteReferral.getDeepLink(intent); if (deepLink == null) { return null; } HttpUrl httpUrl = HttpUrl.parse(deepLink); if (httpUrl == null) { return null; } String sender = AppInviteLinkGenerator.extractSender(httpUrl); return new Invite(sender); } @Override public void onSkippedSignIn() { PrefUtils.setSignedOut(this); moveToStep3(false); } private void moveToStep3(boolean isSignedIn) { FirstStartStep3Fragment step3 = (FirstStartStep3Fragment) mViewPagerAdapter.getItem(2); step3.setSignedIn(isSignedIn); mViewPager.setCurrentItem(2); } @Override public void onComplete(final boolean enableAnalytics, final boolean enableGcm) { PrefUtils.setInitialSettings(FirstStartActivity.this, enableAnalytics); requestBackup(); startMainActivity(); //TODO enable FCM only when the `enableGcm` param is true finish(); } private void requestBackup() { BackupManager bm = new BackupManager(this); bm.dataChanged(); } private void startMainActivity() { Intent resultData = new Intent(this, MainActivity.class); resultData.setAction(ACTION_FIRST_START); if (getIntent().getExtras() != null) { resultData.putExtras(getIntent().getExtras()); } startActivity(resultData); } public static class FirstStartPageAdapter extends FragmentStatePagerAdapter { private Fragment[] mFragments; FirstStartPageAdapter(FragmentManager fm) { super(fm); mFragments = new Fragment[]{ new FirstStartStep1Fragment(), new FirstStartStep2Fragment(), new FirstStartStep3Fragment() }; } @Override public int getItemPosition(Object object) { return POSITION_NONE; } @Override public int getCount() { return mFragments.length; } @Override public Fragment getItem(int position) { return mFragments[position]; } } }