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

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