You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MainActivity.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. package com.rthoni.stssaguenay.ui.activities;
  2. import android.app.ProgressDialog;
  3. import android.content.DialogInterface;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.support.design.widget.FloatingActionButton;
  7. import android.support.design.widget.NavigationView;
  8. import android.support.v4.widget.DrawerLayout;
  9. import android.support.v7.app.ActionBarDrawerToggle;
  10. import android.support.v7.app.AlertDialog;
  11. import android.support.v7.app.AppCompatActivity;
  12. import android.support.v7.widget.Toolbar;
  13. import android.text.InputType;
  14. import android.view.Menu;
  15. import android.view.MenuItem;
  16. import android.view.View;
  17. import android.widget.EditText;
  18. import android.widget.TextView;
  19. import android.widget.Toast;
  20. import com.facebook.CallbackManager;
  21. import com.facebook.FacebookCallback;
  22. import com.facebook.FacebookException;
  23. import com.facebook.FacebookSdk;
  24. import com.facebook.GraphRequest;
  25. import com.facebook.GraphResponse;
  26. import com.facebook.login.LoginManager;
  27. import com.facebook.login.LoginResult;
  28. import com.facebook.login.widget.LoginButton;
  29. import com.google.android.gms.ads.AdRequest;
  30. import com.google.android.gms.ads.AdView;
  31. import com.google.android.gms.ads.MobileAds;
  32. import com.luticate.utils.business.LuPromise;
  33. import com.luticate.utils.business.LuRequest;
  34. import com.luticate.utils.dbo.LuVoidDbo;
  35. import com.rthoni.stssaguenay.R;
  36. import com.rthoni.stssaguenay.business.STSBusiness;
  37. import com.rthoni.stssaguenay.business.UsersSettingsBusiness;
  38. import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
  39. import com.rthoni.stssaguenay.dbo.UserDbo;
  40. import com.rthoni.stssaguenay.dbo.UsersSettingsDbo;
  41. import com.rthoni.stssaguenay.ui.fragments.HomeFragment;
  42. import org.json.JSONException;
  43. import org.json.JSONObject;
  44. import java.util.List;
  45. import butterknife.BindView;
  46. import butterknife.ButterKnife;
  47. public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
  48. public static int ADD_FAVOURITE_STOP_REQUEST_CODE = 1;
  49. private boolean _goToHome = false;
  50. @BindView(R.id.fab)
  51. FloatingActionButton _fab;
  52. @BindView(R.id.nav_view)
  53. NavigationView _navigationView;
  54. private LoginButton _btnLogin;
  55. private TextView _textUserName;
  56. private TextView _textUserEmail;
  57. private TextView _textHelpMessage;
  58. private CallbackManager _callbackManager;
  59. @Override
  60. protected void onCreate(Bundle savedInstanceState) {
  61. super.onCreate(savedInstanceState);
  62. LuRequest.init(this);
  63. FacebookSdk.sdkInitialize(getApplicationContext());
  64. setContentView(R.layout.activity_main);
  65. ButterKnife.bind(this);
  66. MobileAds.initialize(getApplicationContext(), getString(R.string.ad_init));
  67. AdView mAdView = (AdView) findViewById(R.id.adView);
  68. AdRequest adRequest = new AdRequest.Builder().build();
  69. mAdView.loadAd(adRequest);
  70. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  71. setSupportActionBar(toolbar);
  72. DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
  73. ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
  74. this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
  75. drawer.setDrawerListener(toggle);
  76. toggle.syncState();
  77. _navigationView.setNavigationItemSelectedListener(this);
  78. View headerView = _navigationView.getHeaderView(0);
  79. _textUserName = ButterKnife.findById(headerView, R.id.textUserName);
  80. _textUserEmail = ButterKnife.findById(headerView, R.id.textUserEmail);
  81. _textHelpMessage = ButterKnife.findById(headerView, R.id.text_help_message);
  82. _fab.setOnClickListener(new View.OnClickListener() {
  83. @Override
  84. public void onClick(View view) {
  85. goToAddStop();
  86. }
  87. });
  88. _callbackManager = CallbackManager.Factory.create();
  89. _btnLogin = ButterKnife.findById(headerView, R.id.btnLogin);
  90. _btnLogin.setReadPermissions("email");
  91. _btnLogin.registerCallback(_callbackManager, new FacebookCallback<LoginResult>() {
  92. @Override
  93. public void onSuccess(LoginResult loginResult) {
  94. GraphRequest request = GraphRequest.newMeRequest(
  95. loginResult.getAccessToken(),
  96. new GraphRequest.GraphJSONObjectCallback() {
  97. @Override
  98. public void onCompleted(JSONObject object, GraphResponse response) {
  99. try {
  100. UserDbo userDbo = new UserDbo();
  101. userDbo.fromJson(object);
  102. onUserLogged(userDbo);
  103. } catch (JSONException e) {
  104. e.printStackTrace();
  105. }
  106. }
  107. });
  108. Bundle parameters = new Bundle();
  109. parameters.putString("fields", "id,email,name");
  110. request.setParameters(parameters);
  111. request.executeAsync();
  112. loginResult.getAccessToken();
  113. }
  114. @Override
  115. public void onCancel() {
  116. }
  117. @Override
  118. public void onError(FacebookException error) {
  119. Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
  120. }
  121. });
  122. updateLoginState();
  123. goToHome();
  124. }
  125. @Override
  126. protected void onResume() {
  127. if (_goToHome) {
  128. _goToHome = false;
  129. goToHome();
  130. }
  131. super.onResume();
  132. }
  133. public void goToHome()
  134. {
  135. _fab.show();
  136. HomeFragment f = new HomeFragment();
  137. getSupportFragmentManager().beginTransaction().replace(R.id.container, f).commit();
  138. }
  139. public void goToStop()
  140. {
  141. _fab.hide();
  142. }
  143. public void goToAddStop()
  144. {
  145. Intent intent = new Intent(this, StopPickerActivity.class);
  146. startActivityForResult(intent, ADD_FAVOURITE_STOP_REQUEST_CODE);
  147. }
  148. @Override
  149. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  150. if (requestCode == ADD_FAVOURITE_STOP_REQUEST_CODE && resultCode == RESULT_OK) {
  151. UserFavouriteStopsDbo favouriteStopDbo = new UserFavouriteStopsDbo();
  152. try {
  153. JSONObject obj = new JSONObject(data.getStringExtra(StopPickerActivity.STOP_EXTRA_NAME));
  154. favouriteStopDbo.fromJson(obj);
  155. } catch (JSONException e) {
  156. e.printStackTrace();
  157. return;
  158. }
  159. List<UserFavouriteStopsDbo> favouriteStopDbos = STSBusiness.getFavouriteStops(this);
  160. favouriteStopDbos.add(favouriteStopDbo);
  161. STSBusiness.setFavouriteStops(this, favouriteStopDbos);
  162. _goToHome = true;
  163. }
  164. else {
  165. _callbackManager.onActivityResult(requestCode, resultCode, data);
  166. }
  167. super.onActivityResult(requestCode, resultCode, data);
  168. }
  169. @Override
  170. public boolean onNavigationItemSelected(MenuItem item) {
  171. if (item.getItemId() == R.id.nav_restore) {
  172. restoreSettings();
  173. }
  174. else if (item.getItemId() == R.id.nav_backup) {
  175. backupSettings();
  176. }
  177. else if (item.getItemId() == R.id.nav_logout) {
  178. LoginManager.getInstance().logOut();
  179. STSBusiness.setLoggedUser(this, null);
  180. updateLoginState();
  181. }
  182. else {
  183. return false;
  184. }
  185. return true;
  186. }
  187. public void updateLoginState()
  188. {
  189. UserDbo user = STSBusiness.getLoggedUser(this);
  190. _btnLogin.setVisibility(user == null ? View.VISIBLE : View.GONE);
  191. Menu menu = _navigationView.getMenu();
  192. for (int i = 0; i < menu.size(); i++) {
  193. menu.getItem(i).setVisible(user != null);
  194. }
  195. _textUserName.setText(user == null ? "" : user.getName());
  196. _textUserName.setVisibility(user == null ? View.GONE : View.VISIBLE);
  197. _textUserEmail.setText(user == null ? "" : user.getEmail());
  198. _textUserEmail.setVisibility(user == null ? View.GONE : View.VISIBLE);
  199. _textHelpMessage.setVisibility(user == null ? View.VISIBLE : View.GONE);
  200. }
  201. public void onUserLogged(UserDbo userDbo)
  202. {
  203. STSBusiness.setLoggedUser(this, userDbo);
  204. updateLoginState();
  205. }
  206. public LuPromise<String> askPassword(boolean encrypt)
  207. {
  208. final LuPromise<String> promise = new LuPromise<>();
  209. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  210. builder.setTitle(R.string.encryption_password);
  211. builder.setMessage(encrypt ? R.string.encryption_password_encrypt : R.string.encryption_password_decrypt);
  212. final EditText input = new EditText(this);
  213. input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
  214. builder.setView(input);
  215. builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
  216. @Override
  217. public void onClick(DialogInterface dialog, int which) {
  218. promise.resolve(input.getText().toString());
  219. }
  220. });
  221. builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
  222. @Override
  223. public void onClick(DialogInterface dialog, int which) {
  224. dialog.cancel();
  225. }
  226. });
  227. builder.show();
  228. return promise;
  229. }
  230. public void restoreSettings()
  231. {
  232. final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
  233. progressDialog.setIndeterminate(true);
  234. progressDialog.setCancelable(false);
  235. progressDialog.show();
  236. progressDialog.setTitle(R.string.loading);
  237. progressDialog.setMessage(getString(R.string.settings_restoring));
  238. UserDbo user = STSBusiness.getLoggedUser(MainActivity.this);
  239. UsersSettingsBusiness.get(STSBusiness.getConfig(), user.getId())
  240. .then(new LuPromise.LuConsumer<String>() {
  241. @Override
  242. public void execute(final String data) {
  243. progressDialog.dismiss();
  244. if (data == null) {
  245. Toast.makeText(MainActivity.this, R.string.encryption_empty, Toast.LENGTH_LONG).show();
  246. return;
  247. }
  248. askPassword(false).then(new LuPromise.LuConsumer<String>() {
  249. @Override
  250. public void execute(String password) {
  251. UsersSettingsDbo settingsDbo = UsersSettingsBusiness.decryptSettings(data, password);
  252. if (settingsDbo == null) {
  253. Toast.makeText(MainActivity.this, R.string.encryption_bad_password, Toast.LENGTH_LONG).show();
  254. }
  255. else {
  256. Toast.makeText(MainActivity.this, R.string.settings_restored, Toast.LENGTH_LONG).show();
  257. STSBusiness.setUserSettings(MainActivity.this, settingsDbo);
  258. goToHome();
  259. }
  260. }
  261. });
  262. }
  263. }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
  264. @Override
  265. public void execute(LuPromise.LuPromiseError data) {
  266. progressDialog.dismiss();
  267. Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_LONG).show();
  268. }
  269. });
  270. }
  271. public void backupSettings()
  272. {
  273. askPassword(true).then(new LuPromise.LuConsumer<String>() {
  274. @Override
  275. public void execute(String password) {
  276. UserDbo user = STSBusiness.getLoggedUser(MainActivity.this);
  277. UsersSettingsDbo settingsDbo = STSBusiness.getUserSettings(MainActivity.this);
  278. String data = UsersSettingsBusiness.encryptSettings(settingsDbo, password);
  279. final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
  280. progressDialog.setIndeterminate(true);
  281. progressDialog.setCancelable(false);
  282. progressDialog.show();
  283. progressDialog.setTitle(R.string.loading);
  284. progressDialog.setMessage(getString(R.string.settings_backing_up));
  285. UsersSettingsBusiness.put(STSBusiness.getConfig(), data, user.getId())
  286. .then(new LuPromise.LuConsumer<LuVoidDbo>() {
  287. @Override
  288. public void execute(LuVoidDbo data) {
  289. progressDialog.dismiss();
  290. Toast.makeText(MainActivity.this, R.string.settings_backed_up, Toast.LENGTH_LONG).show();
  291. }
  292. }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
  293. @Override
  294. public void execute(LuPromise.LuPromiseError data) {
  295. progressDialog.dismiss();
  296. Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_LONG).show();
  297. }
  298. });
  299. }
  300. });
  301. }
  302. }