diff --git a/.idea/libraries/firebase_core_10_0_1.xml b/.idea/libraries/firebase_core_10_0_1.xml new file mode 100644 index 0000000..5558c25 --- /dev/null +++ b/.idea/libraries/firebase_core_10_0_1.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 4a14b8f..00ed590 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,7 +12,6 @@ android { versionName "1.0" multiDexEnabled = true testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } buildTypes { release { @@ -32,9 +31,11 @@ dependencies { }) compile 'com.android.support:appcompat-v7:25.0.1' compile 'com.android.support:design:25.0.1' - compile 'com.google.android.gms:play-services:10.0.1' compile 'com.android.support:multidex:1.0.1' testCompile 'junit:junit:4.12' compile 'com.google.code.gson:gson:2.8.0' compile 'com.android.volley:volley:1.0.0' + compile 'com.google.android.gms:play-services:10.0.1' } + +apply plugin: 'com.google.gms.google-services' diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..7037821 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,48 @@ +{ + "project_info": { + "project_number": "203008384222", + "project_id": "privy-154513" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:203008384222:android:ae185500677abe13", + "android_client_info": { + "package_name": "com.pulkit4tech.privy" + } + }, + "oauth_client": [ + { + "client_id": "203008384222-oh1nnkreep3i88nbsj72be32ujmr56qs.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.pulkit4tech.privy", + "certificate_hash": "DDCEF282F60C4E45E0FC7D575AA76E6D9C214000" + } + }, + { + "client_id": "203008384222-5fvdfg6mt939sb650t6ukcde442jmrnl.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBcvpPGh9Ba9sOEg1YCyhA6dZ-plgePfeI" + } + ], + "services": { + "analytics_service": { + "status": 1 + }, + "appinvite_service": { + "status": 1, + "other_platform_oauth_client": [] + }, + "ads_service": { + "status": 1 + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/java/com/pulkit4tech/privy/MainActivity.java b/app/src/main/java/com/pulkit4tech/privy/MainActivity.java index dc2be91..31bbf8b 100644 --- a/app/src/main/java/com/pulkit4tech/privy/MainActivity.java +++ b/app/src/main/java/com/pulkit4tech/privy/MainActivity.java @@ -1,6 +1,8 @@ package com.pulkit4tech.privy; +import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.support.annotation.NonNull; import android.support.design.widget.CoordinatorLayout; @@ -19,8 +21,17 @@ import android.util.Log; import android.view.Menu; import android.view.MenuItem; -import android.widget.Toast; - +import android.view.View; +import android.widget.TextView; + +import com.google.android.gms.auth.api.Auth; +import com.google.android.gms.auth.api.signin.GoogleSignInAccount; +import com.google.android.gms.auth.api.signin.GoogleSignInOptions; +import com.google.android.gms.auth.api.signin.GoogleSignInResult; +import com.google.android.gms.common.ConnectionResult; +import com.google.android.gms.common.api.GoogleApiClient; +import com.google.android.gms.common.api.ResultCallback; +import com.google.android.gms.common.api.Status; import com.google.android.gms.location.places.Place; import com.google.android.gms.location.places.ui.PlacePicker; import com.pulkit4tech.privy.data.json.Location; @@ -32,17 +43,31 @@ import java.util.ArrayList; import static com.pulkit4tech.privy.constants.Constants.DEBUG; +import static com.pulkit4tech.privy.constants.Constants.LOG_PREF; import static com.pulkit4tech.privy.constants.Constants.MY_PERMISSIONS_REQUEST_FINE_LOCATIONS; import static com.pulkit4tech.privy.constants.Constants.PLACE_PICKER_REQUEST; +import static com.pulkit4tech.privy.constants.Constants.RC_SIGN_IN; +import static com.pulkit4tech.privy.constants.Constants.RC_SIGN_IN_NEW_PRIVY_REQUEST; -public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { +public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, GoogleApiClient.OnConnectionFailedListener { private NavigationView navigationView; + private GoogleApiClient mGoogleApiClient; + private Context mContext; + private FloatingActionButton fab; + private SharedPreferences mSharedPreferences; + private String NAME = "user_name"; + private String EMAIL = "email_id"; + private String LOGGED_IN = "logged_in"; + // private ImageView profileImg; + private TextView userName, emailId; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + mContext = this; + mSharedPreferences = getSharedPreferences(LOG_PREF, MODE_PRIVATE); if (savedInstanceState == null) { setUpInfo(); @@ -55,28 +80,96 @@ protected void onResume() { } private void setUpInfo() { - Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); - setSupportActionBar(toolbar); + setGoogleApiClientInfo(); + setUpFab(); + setUpNavigationDrawer(); + + if (checkIfLoggedIn()) { + fab.hide(); + } - FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); -// fab.setOnClickListener(new View.OnClickListener() { -// @Override -// public void onClick(View view) { -// Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) -// .setAction("Action", null); -// } -// }); + navigationView.getMenu().getItem(0).setChecked(true); + loadMapFragment(); + } + private void setUpNavigationDrawer() { + Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.setDrawerListener(toggle); toggle.syncState(); - navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); - navigationView.getMenu().getItem(0).setChecked(true); - loadMapFragment(); + setUpNavigationHeader(); + } + + private void setUpNavigationHeader() { + View nav_head = navigationView.getHeaderView(0); +// profileImg = (ImageView) nav_head.findViewById(R.id.profile_pic); + userName = (TextView) nav_head.findViewById(R.id.user_name); + emailId = (TextView) nav_head.findViewById(R.id.email_id); + + setUpNavigationHeaderValue(); + } + + private void setUpNavigationHeaderValue() { + // TODO : Set Profile Image + userName.setText(mSharedPreferences.getString(NAME, getResources().getString(R.string.sign_in))); + emailId.setText(mSharedPreferences.getString(EMAIL, "")); + } + + private void setUpFab() { + fab = (FloatingActionButton) findViewById(R.id.fab); + fab.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + startGoogleSignInActivity(RC_SIGN_IN); + } + }); + } + + private void startGoogleSignInActivity(int resultcode) { + Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); + startActivityForResult(signInIntent, resultcode); + } + + private void signOut() { + clearSharedPreference(); + setUpNavigationHeaderValue(); + + Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(new ResultCallback() { + @Override + public void onResult(@NonNull Status status) { + if (status.isSuccess()) { + snackMsg("Signed Out!!"); + } else { + snackMsg("Some error while signing out!"); + Log.d(DEBUG, "Sign out error : " + status.toString()); + } + } + }); + } + + private boolean checkIfLoggedIn() { + return mSharedPreferences.getBoolean(LOGGED_IN, false); + } + + private void setGoogleApiClientInfo() { + + // Testing Google Sign in + GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestEmail() + .requestProfile() + .build(); + + // Build a GoogleApiClient with access to the Google Sign-In API and the + // options specified by gso. + mGoogleApiClient = new GoogleApiClient.Builder(mContext) + .enableAutoManage(this, this) + .addApi(Auth.GOOGLE_SIGN_IN_API, gso) + .build(); } @Override @@ -91,6 +184,7 @@ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permis switch (requestCode) { case MY_PERMISSIONS_REQUEST_FINE_LOCATIONS: if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + loadMapFragment(); snackMsg("Permission granted!!"); } else { loadFragment(new NoLocationPermission()); @@ -147,14 +241,23 @@ public boolean onNavigationItemSelected(MenuItem item) { if (id == R.id.nav_nearby_privy) { loadMapFragment(); + closeDrawer(); } else if (id == R.id.nav_request_new) { loadAddNewPrivyActivity(); + closeDrawer(); + } else if (id == R.id.nav_sign_in_up) { + if (checkIfLoggedIn()) + signOut(); + else + startGoogleSignInActivity(RC_SIGN_IN); } //TODO : Add other conditions + return true; + } + private void closeDrawer() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); - return true; } @Override @@ -174,6 +277,64 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { navigationView.getMenu().getItem(0).setChecked(true); loadMapFragment(); } + + // Google Sign in Callback + if (requestCode == RC_SIGN_IN) { + GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); + handleSignInResult(result); + } + + if (requestCode == RC_SIGN_IN_NEW_PRIVY_REQUEST) { + GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); + handleSignInResultAndLaunchNewRequestPrivy(result); + } + } + + private void handleSignInResultAndLaunchNewRequestPrivy(GoogleSignInResult result) { + if (result.isSuccess()) { + // Signed in successfully, show authenticated UI. + GoogleSignInAccount acct = result.getSignInAccount(); + addLoginInfo(acct); + + //Launch NewRequestPrivy + loadAddNewPrivyActivity(); + + // Hide Fab button + fab.hide(); + } else { + clearSharedPreference(); + snackMsg("Please Sign in to request new Privy"); + } + setUpNavigationHeaderValue(); + } + + private void handleSignInResult(GoogleSignInResult result) { + Log.d(DEBUG, "handleSignInResult:" + result.isSuccess()); + if (result.isSuccess()) { + // Signed in successfully, show authenticated UI. + GoogleSignInAccount acct = result.getSignInAccount(); + addLoginInfo(acct); + // Hide Fab button + fab.hide(); + } else { + clearSharedPreference(); + snackMsg("Please Sign in to request new Privy"); + } + setUpNavigationHeaderValue(); + } + + private void addLoginInfo(GoogleSignInAccount acct) { + // TODO : add Profile Picture + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.putBoolean(LOGGED_IN, true); + editor.putString(NAME, acct.getDisplayName()); + editor.putString(EMAIL, acct.getEmail()); + editor.commit(); + } + + private void clearSharedPreference() { + SharedPreferences.Editor editor = mSharedPreferences.edit(); + editor.clear().commit(); } private void requestNewPrivy(Place placeToAdd) { @@ -188,16 +349,22 @@ private void requestNewPrivy(Place placeToAdd) { ArrayList types = new ArrayList(); types.add("establishment"); postdata.setTypes(types); + postdata.setAddress(mSharedPreferences.getString(EMAIL, "")); postdata.setLanguage("en"); new NetworkRequest(this, postdata).postRequest(); } private void loadAddNewPrivyActivity() { - PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); - try { - startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST); - } catch (Exception e) { - Log.d(DEBUG, e.toString()); + if (checkIfLoggedIn()) { + PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); + try { + startActivityForResult(builder.build(this), PLACE_PICKER_REQUEST); + } catch (Exception e) { + Log.d(DEBUG, e.toString()); + } + } else { + startGoogleSignInActivity(RC_SIGN_IN_NEW_PRIVY_REQUEST); + snackMsg("Please Sign In to add new Privy"); } } @@ -220,4 +387,12 @@ public void snackMsg(String msg) { private boolean checkLocationEnabledPermission() { return ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; } + + @Override + public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { + snackMsg("Some Error while Connecting to Google Service!!"); + Log.d(DEBUG, "OnConnectionFailed: " + connectionResult.toString()); + } + + } diff --git a/app/src/main/java/com/pulkit4tech/privy/constants/Constants.java b/app/src/main/java/com/pulkit4tech/privy/constants/Constants.java index 4b505f7..8dad84f 100644 --- a/app/src/main/java/com/pulkit4tech/privy/constants/Constants.java +++ b/app/src/main/java/com/pulkit4tech/privy/constants/Constants.java @@ -5,4 +5,7 @@ public class Constants { public static final int CAMERA_ANIMATION_DURATION = 2500; public static final int MY_PERMISSIONS_REQUEST_FINE_LOCATIONS = 1; public static final int PLACE_PICKER_REQUEST = 2; + public static final int RC_SIGN_IN = 9001; + public static final int RC_SIGN_IN_NEW_PRIVY_REQUEST = 9002; + public static final String LOG_PREF = "Login_preference"; } diff --git a/app/src/main/java/com/pulkit4tech/privy/data/json/PostPrivyRequest.java b/app/src/main/java/com/pulkit4tech/privy/data/json/PostPrivyRequest.java index e20531a..1d3b208 100644 --- a/app/src/main/java/com/pulkit4tech/privy/data/json/PostPrivyRequest.java +++ b/app/src/main/java/com/pulkit4tech/privy/data/json/PostPrivyRequest.java @@ -9,6 +9,15 @@ public class PostPrivyRequest { private String address; private ArrayList types; private String language; + private String website; + + public String getWebsite() { + return website; + } + + public void setWebsite(String website) { + this.website = website; + } public Location getLocation() { return location; @@ -67,6 +76,7 @@ public String toString() { ", address='" + address + '\'' + ", types=" + types + ", language='" + language + '\'' + + ", website='" + website + '\'' + '}'; } } diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml index 5eea9a6..c0b6ba3 100644 --- a/app/src/main/res/layout/nav_header_main.xml +++ b/app/src/main/res/layout/nav_header_main.xml @@ -13,7 +13,7 @@ android:theme="@style/ThemeOverlay.AppCompat.Dark"> + android:text="@string/sign_in" + android:id="@+id/user_name" + android:textAppearance="@style/TextAppearance.AppCompat.Body2" /> + android:text="" /> diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index a896f9d..56926df 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -10,14 +10,14 @@ android:id="@+id/nav_request_new" android:icon="@drawable/ic_menu_gallery" android:title="Add Privy" /> + + + + - + android:title="Sign In" /> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5f63ac2..68e7587 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,4 +9,5 @@ Open Navigation Drawer Close Navigation Drawer Settings + Sign In diff --git a/build.gradle b/build.gradle index 2b37f58..7fda1b3 100644 --- a/build.gradle +++ b/build.gradle @@ -5,6 +5,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.google.gms:google-services:3.0.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files