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 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. package com.rthoni.stssaguenay.ui.activities;
  2. import android.app.ProgressDialog;
  3. import android.content.Context;
  4. import android.content.DialogInterface;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.support.design.widget.NavigationView;
  8. import android.support.multidex.MultiDex;
  9. import android.support.v4.app.FragmentManager;
  10. import android.support.v4.widget.DrawerLayout;
  11. import android.support.v7.app.ActionBarDrawerToggle;
  12. import android.support.v7.app.AlertDialog;
  13. import android.support.v7.app.AppCompatActivity;
  14. import android.support.v7.widget.Toolbar;
  15. import android.text.InputType;
  16. import android.view.Menu;
  17. import android.view.MenuItem;
  18. import android.view.View;
  19. import android.widget.EditText;
  20. import android.widget.TextView;
  21. import android.widget.Toast;
  22. import com.facebook.CallbackManager;
  23. import com.facebook.FacebookCallback;
  24. import com.facebook.FacebookException;
  25. import com.facebook.FacebookSdk;
  26. import com.facebook.GraphRequest;
  27. import com.facebook.GraphResponse;
  28. import com.facebook.login.LoginManager;
  29. import com.facebook.login.LoginResult;
  30. import com.facebook.login.widget.LoginButton;
  31. import com.github.clans.fab.FloatingActionButton;
  32. import com.github.clans.fab.FloatingActionMenu;
  33. import com.google.android.gms.ads.AdRequest;
  34. import com.google.android.gms.ads.AdView;
  35. import com.google.android.gms.ads.MobileAds;
  36. import com.luticate.utils.business.LuPromise;
  37. import com.luticate.utils.dataaccess.LuRequest;
  38. import com.luticate.utils.dbo.LuVoidDbo;
  39. import com.rthoni.stssaguenay.R;
  40. import com.rthoni.stssaguenay.business.STSBusiness;
  41. import com.rthoni.stssaguenay.business.UsersSettingsBusiness;
  42. import com.rthoni.stssaguenay.dbo.StopsDbo;
  43. import com.rthoni.stssaguenay.dbo.UserFavouriteStopsDbo;
  44. import com.rthoni.stssaguenay.dbo.UserDbo;
  45. import com.rthoni.stssaguenay.dbo.UsersSettingsDbo;
  46. import com.rthoni.stssaguenay.ui.fragments.HomeFragment;
  47. import com.rthoni.stssaguenay.ui.fragments.StopViewerFragment;
  48. import org.json.JSONObject;
  49. import java.util.List;
  50. import butterknife.BindView;
  51. import butterknife.ButterKnife;
  52. public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
  53. public static int ADD_FAVOURITE_STOP_REQUEST_CODE = 1;
  54. public static int SEARCH_STOP_REQUEST_CODE = 2;
  55. @BindView(R.id.fab)
  56. FloatingActionMenu _fab;
  57. @BindView(R.id.fab_item_add_map)
  58. FloatingActionButton _fabMap;
  59. @BindView(R.id.fab_item_add_list)
  60. FloatingActionButton _fabList;
  61. @BindView(R.id.nav_view)
  62. NavigationView _navigationView;
  63. private LoginButton _btnLogin;
  64. private TextView _textUserName;
  65. private TextView _textUserEmail;
  66. private TextView _textHelpMessage;
  67. private CallbackManager _callbackManager;
  68. private FragmentManager _fragmentManager;
  69. private DrawerLayout _drawer;
  70. private Runnable _onResumeAction;
  71. @Override
  72. protected void onCreate(Bundle savedInstanceState) {
  73. super.onCreate(savedInstanceState);
  74. LuRequest.init(this);
  75. FacebookSdk.sdkInitialize(getApplicationContext());
  76. setContentView(R.layout.activity_main);
  77. ButterKnife.bind(this);
  78. MobileAds.initialize(getApplicationContext(), getString(R.string.ad_init));
  79. AdView mAdView = (AdView) findViewById(R.id.adView);
  80. AdRequest adRequest = new AdRequest.Builder().build();
  81. mAdView.loadAd(adRequest);
  82. Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  83. setSupportActionBar(toolbar);
  84. _drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
  85. ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
  86. this, _drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
  87. _drawer.addDrawerListener(toggle);
  88. toggle.syncState();
  89. _navigationView.setNavigationItemSelectedListener(this);
  90. View headerView = _navigationView.getHeaderView(0);
  91. _textUserName = ButterKnife.findById(headerView, R.id.textUserName);
  92. _textUserEmail = ButterKnife.findById(headerView, R.id.textUserEmail);
  93. _textHelpMessage = ButterKnife.findById(headerView, R.id.text_help_message);
  94. _fabMap.setOnClickListener(new View.OnClickListener() {
  95. @Override
  96. public void onClick(View v) {
  97. goToAddStop(true);
  98. }
  99. });
  100. _fabList.setOnClickListener(new View.OnClickListener() {
  101. @Override
  102. public void onClick(View v) {
  103. goToAddStop(false);
  104. }
  105. });
  106. _callbackManager = CallbackManager.Factory.create();
  107. _btnLogin = ButterKnife.findById(headerView, R.id.btnLogin);
  108. _btnLogin.setReadPermissions("email");
  109. _btnLogin.registerCallback(_callbackManager, new FacebookCallback<LoginResult>() {
  110. @Override
  111. public void onSuccess(LoginResult loginResult) {
  112. GraphRequest request = GraphRequest.newMeRequest(
  113. loginResult.getAccessToken(),
  114. new GraphRequest.GraphJSONObjectCallback() {
  115. @Override
  116. public void onCompleted(JSONObject object, GraphResponse response) {
  117. try {
  118. UserDbo userDbo = new UserDbo();
  119. userDbo.fromJson(object);
  120. onUserLogged(userDbo);
  121. } catch (Exception e) {
  122. e.printStackTrace();
  123. }
  124. }
  125. });
  126. Bundle parameters = new Bundle();
  127. parameters.putString("fields", "id,email,name");
  128. request.setParameters(parameters);
  129. request.executeAsync();
  130. loginResult.getAccessToken();
  131. }
  132. @Override
  133. public void onCancel() {
  134. }
  135. @Override
  136. public void onError(FacebookException error) {
  137. Toast.makeText(MainActivity.this, error.toString(), Toast.LENGTH_LONG).show();
  138. }
  139. });
  140. _fragmentManager = getSupportFragmentManager();
  141. _fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  142. @Override
  143. public void onBackStackChanged() {
  144. if (_fragmentManager.getBackStackEntryCount() == 0) {
  145. goToHome();
  146. }
  147. }
  148. });
  149. updateLoginState();
  150. goToHome();
  151. }
  152. @Override
  153. protected void attachBaseContext(Context newBase) {
  154. super.attachBaseContext(newBase);
  155. MultiDex.install(this);
  156. }
  157. @Override
  158. public boolean onSupportNavigateUp() {
  159. if (_fragmentManager.getBackStackEntryCount() == 0) {
  160. return super.onSupportNavigateUp();
  161. }
  162. _fragmentManager.popBackStack();
  163. return true;
  164. }
  165. @Override
  166. protected void onResume() {
  167. if (_onResumeAction != null) {
  168. _onResumeAction.run();
  169. }
  170. super.onResume();
  171. }
  172. public void goToHome()
  173. {
  174. _fab.setVisibility(View.VISIBLE);
  175. HomeFragment f = new HomeFragment();
  176. f.setOnFavouriteStopClicked(new LuPromise.LuConsumer<UserFavouriteStopsDbo>() {
  177. @Override
  178. public void execute(UserFavouriteStopsDbo data) {
  179. goToStop(data.getStop());
  180. }
  181. });
  182. getSupportFragmentManager().beginTransaction().replace(R.id.container, f).commit();
  183. }
  184. public void goToStop(StopsDbo stopsDbo)
  185. {
  186. _fab.setVisibility(View.GONE);
  187. StopViewerFragment f = new StopViewerFragment();
  188. f.setStopsDbo(stopsDbo);
  189. getSupportFragmentManager()
  190. .beginTransaction()
  191. .replace(R.id.container, f)
  192. .addToBackStack("StopViewerFragment")
  193. .commit();
  194. }
  195. public void goToAddStop(boolean map)
  196. {
  197. _fab.close(true);
  198. Intent intent = new Intent(this, StopPickerActivity.class);
  199. intent.putExtra(StopPickerActivity.MAP_EXTRA_NAME, map);
  200. startActivityForResult(intent, ADD_FAVOURITE_STOP_REQUEST_CODE);
  201. }
  202. public void goToSearchStop(boolean map)
  203. {
  204. _fab.close(true);
  205. Intent intent = new Intent(this, StopPickerActivity.class);
  206. intent.putExtra(StopPickerActivity.MAP_EXTRA_NAME, map);
  207. intent.putExtra(StopPickerActivity.SELECT_ROUTES_EXTRA_NAME, false);
  208. startActivityForResult(intent, SEARCH_STOP_REQUEST_CODE);
  209. }
  210. public void goToSearchStop()
  211. {
  212. final int item[] = new int[1];
  213. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  214. String[] array = new String[]{getString(R.string.stop_add_map), getString(R.string.stop_add_list)};
  215. builder.setSingleChoiceItems(array, 0, new DialogInterface.OnClickListener() {
  216. @Override
  217. public void onClick(DialogInterface dialog, int which) {
  218. item[0] = which;
  219. }
  220. });
  221. builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
  222. @Override
  223. public void onClick(DialogInterface dialog, int which) {
  224. dialog.dismiss();
  225. goToSearchStop(item[0] == 0);
  226. }
  227. });
  228. builder.show();
  229. }
  230. @Override
  231. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  232. if (requestCode == ADD_FAVOURITE_STOP_REQUEST_CODE && resultCode == RESULT_OK) {
  233. UserFavouriteStopsDbo favouriteStopDbo = new UserFavouriteStopsDbo();
  234. try {
  235. favouriteStopDbo.fromJson(data.getStringExtra(StopPickerActivity.FAVOURITE_STOP_EXTRA_NAME));
  236. } catch (Exception e) {
  237. e.printStackTrace();
  238. return;
  239. }
  240. List<UserFavouriteStopsDbo> favouriteStopDbos = STSBusiness.getFavouriteStops(this);
  241. favouriteStopDbos.add(favouriteStopDbo);
  242. STSBusiness.setFavouriteStops(this, favouriteStopDbos);
  243. _onResumeAction = new Runnable() {
  244. @Override
  245. public void run() {
  246. goToHome();
  247. }
  248. };
  249. }
  250. else if (requestCode == SEARCH_STOP_REQUEST_CODE && resultCode == RESULT_OK) {
  251. final StopsDbo stopDbo = new StopsDbo();
  252. try {
  253. stopDbo.fromJson(data.getStringExtra(StopPickerActivity.STOP_EXTRA_NAME));
  254. } catch (Exception e) {
  255. e.printStackTrace();
  256. return;
  257. }
  258. _onResumeAction = new Runnable() {
  259. @Override
  260. public void run() {
  261. goToStop(stopDbo);
  262. }
  263. };
  264. }
  265. else {
  266. _callbackManager.onActivityResult(requestCode, resultCode, data);
  267. }
  268. super.onActivityResult(requestCode, resultCode, data);
  269. }
  270. @Override
  271. public boolean onNavigationItemSelected(MenuItem item) {
  272. if (item.getItemId() == R.id.nav_search_stop) {
  273. goToSearchStop();
  274. }
  275. else if (item.getItemId() == R.id.nav_restore) {
  276. restoreSettings();
  277. }
  278. else if (item.getItemId() == R.id.nav_backup) {
  279. backupSettings();
  280. }
  281. else if (item.getItemId() == R.id.nav_logout) {
  282. LoginManager.getInstance().logOut();
  283. STSBusiness.setLoggedUser(this, null);
  284. updateLoginState();
  285. }
  286. else {
  287. return false;
  288. }
  289. _drawer.closeDrawers();
  290. return true;
  291. }
  292. public void updateLoginState()
  293. {
  294. UserDbo user = STSBusiness.getLoggedUser(this);
  295. _btnLogin.setVisibility(user == null ? View.VISIBLE : View.GONE);
  296. Menu menu = _navigationView.getMenu();
  297. menu.findItem(R.id.nav_restore).setVisible(user != null);
  298. menu.findItem(R.id.nav_backup).setVisible(user != null);
  299. menu.findItem(R.id.nav_logout).setVisible(user != null);
  300. _textUserName.setText(user == null ? "" : user.getName());
  301. _textUserName.setVisibility(user == null ? View.GONE : View.VISIBLE);
  302. _textUserEmail.setText(user == null ? "" : user.getEmail());
  303. _textUserEmail.setVisibility(user == null ? View.GONE : View.VISIBLE);
  304. _textHelpMessage.setVisibility(user == null ? View.VISIBLE : View.GONE);
  305. }
  306. public void onUserLogged(UserDbo userDbo)
  307. {
  308. STSBusiness.setLoggedUser(this, userDbo);
  309. updateLoginState();
  310. }
  311. public LuPromise<String> askPassword(boolean encrypt)
  312. {
  313. final LuPromise<String> promise = new LuPromise<>();
  314. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  315. builder.setTitle(R.string.encryption_password);
  316. builder.setMessage(encrypt ? R.string.encryption_password_encrypt : R.string.encryption_password_decrypt);
  317. final EditText input = new EditText(this);
  318. input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
  319. builder.setView(input);
  320. builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
  321. @Override
  322. public void onClick(DialogInterface dialog, int which) {
  323. promise.resolve(input.getText().toString());
  324. }
  325. });
  326. builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
  327. @Override
  328. public void onClick(DialogInterface dialog, int which) {
  329. dialog.cancel();
  330. }
  331. });
  332. builder.show();
  333. return promise;
  334. }
  335. public void restoreSettings()
  336. {
  337. final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
  338. progressDialog.setIndeterminate(true);
  339. progressDialog.setCancelable(false);
  340. progressDialog.show();
  341. progressDialog.setTitle(R.string.loading);
  342. progressDialog.setMessage(getString(R.string.settings_restoring));
  343. UserDbo user = STSBusiness.getLoggedUser(MainActivity.this);
  344. UsersSettingsBusiness.get(STSBusiness.getConfig(this), user.getId())
  345. .then(new LuPromise.LuConsumer<String>() {
  346. @Override
  347. public void execute(final String data) {
  348. progressDialog.dismiss();
  349. if (data == null) {
  350. Toast.makeText(MainActivity.this, R.string.encryption_empty, Toast.LENGTH_LONG).show();
  351. return;
  352. }
  353. askPassword(false).then(new LuPromise.LuConsumer<String>() {
  354. @Override
  355. public void execute(String password) {
  356. UsersSettingsDbo settingsDbo = UsersSettingsBusiness.decryptSettings(data, password);
  357. if (settingsDbo == null) {
  358. Toast.makeText(MainActivity.this, R.string.encryption_bad_password, Toast.LENGTH_LONG).show();
  359. }
  360. else {
  361. Toast.makeText(MainActivity.this, R.string.settings_restored, Toast.LENGTH_LONG).show();
  362. STSBusiness.setUserSettings(MainActivity.this, settingsDbo);
  363. goToHome();
  364. }
  365. }
  366. });
  367. }
  368. }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
  369. @Override
  370. public void execute(LuPromise.LuPromiseError data) {
  371. progressDialog.dismiss();
  372. Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_LONG).show();
  373. }
  374. });
  375. }
  376. public void backupSettings()
  377. {
  378. askPassword(true).then(new LuPromise.LuConsumer<String>() {
  379. @Override
  380. public void execute(String password) {
  381. UserDbo user = STSBusiness.getLoggedUser(MainActivity.this);
  382. UsersSettingsDbo settingsDbo = STSBusiness.getUserSettings(MainActivity.this);
  383. String data = UsersSettingsBusiness.encryptSettings(settingsDbo, password);
  384. final ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
  385. progressDialog.setIndeterminate(true);
  386. progressDialog.setCancelable(false);
  387. progressDialog.show();
  388. progressDialog.setTitle(R.string.loading);
  389. progressDialog.setMessage(getString(R.string.settings_backing_up));
  390. UsersSettingsBusiness.put(STSBusiness.getConfig(MainActivity.this), data, user.getId())
  391. .then(new LuPromise.LuConsumer<LuVoidDbo>() {
  392. @Override
  393. public void execute(LuVoidDbo data) {
  394. progressDialog.dismiss();
  395. Toast.makeText(MainActivity.this, R.string.settings_backed_up, Toast.LENGTH_LONG).show();
  396. }
  397. }, new LuPromise.LuConsumer<LuPromise.LuPromiseError>() {
  398. @Override
  399. public void execute(LuPromise.LuPromiseError data) {
  400. progressDialog.dismiss();
  401. Toast.makeText(MainActivity.this, data.toString(), Toast.LENGTH_LONG).show();
  402. }
  403. });
  404. }
  405. });
  406. }
  407. }