package what.whatandroid.barcode;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextThemeWrapper;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.Toast;
import java.util.Date;
import api.barcode.Barcode;
import api.products.ProductSearch;
import api.soup.MySoup;
import what.whatandroid.R;
import what.whatandroid.announcements.AnnouncementsActivity;
import what.whatandroid.bookmarks.BookmarksActivity;
import what.whatandroid.callbacks.ViewSearchCallbacks;
import what.whatandroid.forums.ForumActivity;
import what.whatandroid.inbox.InboxActivity;
import what.whatandroid.navdrawer.NavigationDrawerFragment;
import what.whatandroid.notifications.NotificationsActivity;
import what.whatandroid.profile.ProfileActivity;
import what.whatandroid.search.SearchActivity;
import what.whatandroid.settings.SettingsActivity;
import what.whatandroid.settings.SettingsFragment;
import what.whatandroid.subscriptions.SubscriptionsActivity;
import what.whatandroid.top10.Top10Activity;
/**
* Activity for receiving intents for loading barcodes, viewing scanned barcodes
* and launching searches with the terms
*/
public class BarcodeActivity extends AppCompatActivity implements NavigationDrawerFragment.NavigationDrawerCallbacks,
ScannerDialog.ScannerDialogListener, ViewSearchCallbacks {
private NavigationDrawerFragment navDrawer;
private CharSequence title;
private BarcodeFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frame);
navDrawer = (NavigationDrawerFragment)getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
navDrawer.setUp(R.id.navigation_drawer, (DrawerLayout)findViewById(R.id.drawer_layout));
title = getTitle();
if (savedInstanceState == null){
fragment = new BarcodeFragment();
getSupportFragmentManager().beginTransaction()
.add(R.id.container, fragment).commit();
}
else {
fragment = (BarcodeFragment)getSupportFragmentManager().findFragmentById(R.id.container);
}
//Setup our Semantics3 fallback API info
ProductSearch.setCredentials("",
"", false);
}
public void restoreActionBar(){
ActionBar actionBar = getSupportActionBar();
actionBar.setNavigationMode(android.support.v7.app.ActionBar.NAVIGATION_MODE_STANDARD);
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setTitle(title);
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
if (navDrawer == null || !navDrawer.isDrawerOpen()){
getMenuInflater().inflate(R.menu.what_android, menu);
if (!MySoup.isLoggedIn()){
MenuItem logout = menu.findItem(R.id.action_logout);
logout.setVisible(false);
}
restoreActionBar();
return true;
}
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
Intent intent;
switch (item.getItemId()){
case R.id.action_logout:
new LogoutTask().execute();
return true;
case R.id.action_settings:
intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
return true;
case R.id.action_feedback:
intent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "whatcdandroid@gmail.com", null));
intent.putExtra(Intent.EXTRA_SUBJECT, "WhatAndroid Feedback");
startActivity(Intent.createChooser(intent, "Send email"));
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void startSearch(int type, String terms, String tags){
Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.SEARCH, type);
intent.putExtra(SearchActivity.TERMS, terms);
intent.putExtra(SearchActivity.TAGS, tags);
startActivity(intent);
}
@Override
public void startSingleScan(){
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
//If ZXing is installed launch it, otherwise ask the user to install it
if (!getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY).isEmpty()){
intent.putExtra("SCAN_MODE", "PRODUCT_MODE");
startActivityForResult(intent, 0);
}
else {
noScannerAlert();
}
}
@Override
public void startBulkScan(){
Intent intent = getPackageManager().getLaunchIntentForPackage("com.google.zxing.client.android");
if (intent == null){
noScannerAlert();
}
else {
intent.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(intent);
}
}
/**
* Display a dialog to the user that they don't have the required scanner installed
* and prompt them to install it
*/
private void noScannerAlert(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("ZXing Barcode Scanner Not Found")
.setMessage("The ZXing Barcode scanner is required to use the scanning features, would you like to install it?")
.setPositiveButton("Install", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.google.zxing.client.android"));
startActivity(intent);
}
})
.setNegativeButton("Not now", null);
builder.create().show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
if (requestCode == 0){
if (resultCode == Activity.RESULT_OK){
fragment.addBarcode(new Barcode(data.getStringExtra("SCAN_RESULT"), new Date()));
}
else if (resultCode == Activity.RESULT_CANCELED){
Toast.makeText(this, "Scan canceled", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onNavigationDrawerItemSelected(int position){
if (navDrawer == null){
return;
}
String selection = navDrawer.getItem(position);
if (selection.equalsIgnoreCase(getString(R.string.announcements))){
Intent intent = new Intent(this, AnnouncementsActivity.class);
intent.putExtra(AnnouncementsActivity.SHOW, AnnouncementsActivity.ANNOUNCEMENTS);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.profile))){
Intent intent = new Intent(this, ProfileActivity.class);
//We may not be logged in at this point, so pass -1 which will indicate to the fragment
//to get the id from mysoup
intent.putExtra(ProfileActivity.USER_ID, -1);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.bookmarks))){
Intent intent = new Intent(this, BookmarksActivity.class);
startActivity(intent);
}
else if (selection.contains(getString(R.string.messages))){
Intent intent = new Intent(this, InboxActivity.class);
startActivity(intent);
}
else if (selection.contains(getString(R.string.notifications))){
Intent intent = new Intent(this, NotificationsActivity.class);
startActivity(intent);
}
else if (selection.contains(getString(R.string.subscriptions))){
Intent intent = new Intent(this, SubscriptionsActivity.class);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.forums))){
Intent intent = new Intent(this, ForumActivity.class);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.top10))){
Intent intent = new Intent(this, Top10Activity.class);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.blog))){
Intent intent = new Intent(this, AnnouncementsActivity.class);
intent.putExtra(AnnouncementsActivity.SHOW, AnnouncementsActivity.BLOGS);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.torrents))){
Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.SEARCH, SearchActivity.TORRENT);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.artists))){
Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.SEARCH, SearchActivity.ARTIST);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.requests))){
Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.SEARCH, SearchActivity.REQUEST);
startActivity(intent);
}
else if (selection.equalsIgnoreCase(getString(R.string.users))){
Intent intent = new Intent(this, SearchActivity.class);
intent.putExtra(SearchActivity.SEARCH, SearchActivity.USER);
startActivity(intent);
}
}
/**
* Async task for logging out the user
*/
private class LogoutTask extends AsyncTask<Void, Void, Boolean> {
private ProgressDialog dialog;
@Override
protected void onPreExecute(){
dialog = new ProgressDialog(BarcodeActivity.this);
dialog.setIndeterminate(true);
dialog.setMessage("Logging out...");
dialog.show();
}
/**
* Once we've logged out clear the saved cookie, name and password and head to the home screen
*/
@Override
protected void onPostExecute(Boolean status){
if (dialog.isShowing()){
dialog.dismiss();
}
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(BarcodeActivity.this);
preferences.edit()
.remove(SettingsFragment.USER_COOKIE)
.remove(SettingsFragment.USER_NAME)
.remove(SettingsFragment.USER_PASSWORD)
.apply();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
@Override
protected Boolean doInBackground(Void... params){
Boolean status = false;
try {
status = MySoup.logout("logout.php");
}
catch (Exception e){
e.printStackTrace();
}
return status;
}
public void dismissDialog(){
if (dialog.isShowing()){
dialog.dismiss();
}
}
}
}