/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.eugene.fithealthmaingit.UI.NavFragments;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.speech.RecognizerIntent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.widget.CardView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.FatSecretSearchList.SearchAdapterItemResult;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.FatSecretSearchList.SearchItemResult;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogQuickSearchData.LogQuickSearch;
import com.eugene.fithealthmaingit.Databases_Adapters_ListViews.LogQuickSearchData.LogQuickSearchAdapter;
import com.eugene.fithealthmaingit.FatSecretSearchAndGet.FatSecretSearchMethod;
import com.eugene.fithealthmaingit.R;
import com.eugene.fithealthmaingit.UI.SaveSearchAddItemActivityMain;
import com.eugene.fithealthmaingit.Utilities.Globals;
import com.eugene.fithealthmaingit.Utilities.InitiateSearch;
import com.eugene.fithealthmaingit.Utilities.NetworkConnectionStatus;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
/**
* Search Fragment
* Searched Fat Secret Rest Api
* Overlays FragmentJournalMain
*/
public class FragmentSearch extends Fragment {
private View line_divider;
private RelativeLayout view_search;
private CardView card_search;
private ImageView image_search_back, clearSearch;
private EditText edit_text_search;
private ListView listView, listContainer;
LinearLayout searchBack;
private LogQuickSearchAdapter logQuickSearchAdapter;
private Set<String> set;
private ArrayList<SearchItemResult> mItem;
private FatSecretSearchMethod mFatSecretSearch;
private SearchAdapterItemResult searchAdapter;
private String brand;
private AsyncTask<String, String, String> mAsyncTask;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_search, container, false);
view_search = (RelativeLayout) v.findViewById(R.id.view_search);
edit_text_search = (EditText) v.findViewById(R.id.edit_text_search);
edit_text_search.requestFocus();
card_search = (CardView) v.findViewById(R.id.card_search);
image_search_back = (ImageView) v.findViewById(R.id.image_search_back);
listView = (ListView) v.findViewById(R.id.listNaviationDrawer);
listView.setVisibility(View.GONE);
listContainer = (ListView) v.findViewById(R.id.listContainer);
ViewGroup header = (ViewGroup) inflater.inflate(R.layout.list_search_header, listContainer, false);
listContainer.addHeaderView(header, null, false);
clearSearch = (ImageView) v.findViewById(R.id.clearSearch);
line_divider = v.findViewById(R.id.line_divider);
logQuickSearchAdapter = new LogQuickSearchAdapter(getActivity(), 0, LogQuickSearch.all());
mItem = new ArrayList<>();
searchAdapter = new SearchAdapterItemResult(getActivity(), mItem);
listView.setAdapter(logQuickSearchAdapter);
listContainer.setAdapter(searchAdapter);
set = new HashSet<>();
mFatSecretSearch = new FatSecretSearchMethod();
searchBack = (LinearLayout) v.findViewById(R.id.searchBack);
InitiateSearch();
HandleSearch();
view_search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
InitiateSearch.handleToolBar(getActivity(), card_search, view_search, listView, edit_text_search, line_divider);
endFragment();
}
});
InitiateClick();
return v;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
}
String mealType = "";
String mealId1 = "";
String mealBrand = "";
String mealFaborite = "";
private void InitiateClick() {
listContainer.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
mealId1 = mItem.get(position - 1).getID();
mealBrand = mItem.get(position - 1).getBrand();
mealFaborite = "false";
AlertDialog.Builder builderSingle = new AlertDialog.Builder(getActivity()).setTitle("Choose Meal: ");
final ArrayAdapter<String> mAdapterMoveMeal = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1);
mAdapterMoveMeal.add("Snack");
mAdapterMoveMeal.add("Breakfast");
mAdapterMoveMeal.add("Lunch");
mAdapterMoveMeal.add("Dinner");
builderSingle.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builderSingle.setAdapter(mAdapterMoveMeal, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String strName = mAdapterMoveMeal.getItem(which);
Intent i = new Intent(getActivity(), SaveSearchAddItemActivityMain.class);
i.putExtra(Globals.MEAL_TYPE, strName);
i.putExtra(Globals.MEAL_FAVORITE, "false");
i.putExtra(Globals.MEAL_ID, mealId1);
i.putExtra(Globals.MEAL_BRAND, mealBrand);
startActivity(i);
}
});
builderSingle.show();
}
});
}
private void InitiateSearch() {
card_search.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
v.removeOnLayoutChangeListener(this);
InitiateSearch.handleToolBar(getActivity(), card_search, view_search, listView, edit_text_search, line_divider);
}
});
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
LogQuickSearch logQuickSearch = logQuickSearchAdapter.getItem(position);
edit_text_search.setText(logQuickSearch.getName());
listView.setVisibility(View.GONE);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(edit_text_search.getWindowToken(), 0);
searchFood(logQuickSearch.getName(), 0);
}
});
edit_text_search.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (edit_text_search.getText().toString().length() == 0) {
logQuickSearchAdapter = new LogQuickSearchAdapter(getActivity(), 0, LogQuickSearch.all());
listView.setAdapter(logQuickSearchAdapter);
clearSearch.setImageResource(R.mipmap.ic_keyboard_voice);
IsAdapterEmpty();
} else {
logQuickSearchAdapter = new LogQuickSearchAdapter(getActivity(), 0, LogQuickSearch.FilterByName(edit_text_search.getText().toString()));
listView.setAdapter(logQuickSearchAdapter);
clearSearch.setImageResource(R.mipmap.ic_close);
IsAdapterEmpty();
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
clearSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (edit_text_search.getText().toString().length() != 0) {
edit_text_search.setText("");
searchBack.setVisibility(View.GONE);
listView.setVisibility(View.VISIBLE);
clearItems();
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
IsAdapterEmpty();
} else {
promptSpeechInput(edit_text_search);
}
}
});
}
private void HandleSearch() {
image_search_back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clearItems();
InitiateSearch.handleToolBar(getActivity(), card_search, view_search, listView, edit_text_search, line_divider);
searchBack.setVisibility(View.GONE);
endFragment();
}
});
edit_text_search.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
if (edit_text_search.getText().toString().trim().length() > 0) {
clearItems();
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(edit_text_search.getWindowToken(), 0);
UpdateQuickSearch(edit_text_search.getText().toString());
listView.setVisibility(View.GONE);
searchFood(edit_text_search.getText().toString(), 0);
}
return true;
}
return false;
}
});
}
private void UpdateQuickSearch(String item) {
for (int i = 0; i < logQuickSearchAdapter.getCount(); i++) {
LogQuickSearch ls = logQuickSearchAdapter.getItem(i);
String name = ls.getName();
set.add(name.toUpperCase());
}
if (set.add(item.toUpperCase())) {
LogQuickSearch recentLog = new LogQuickSearch();
recentLog.setName(item);
recentLog.setDate(new Date());
recentLog.save();
logQuickSearchAdapter.add(recentLog);
logQuickSearchAdapter.notifyDataSetChanged();
}
}
private void IsAdapterEmpty() {
if (logQuickSearchAdapter.getCount() == 0) {
line_divider.setVisibility(View.GONE);
} else {
line_divider.setVisibility(View.VISIBLE);
}
}
private void clearItems() {
listContainer.setVisibility(View.GONE);
mItem.clear();
searchAdapter.notifyDataSetChanged();
}
private void endFragment() {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
}, 300);
}
private void searchFood(final String item, final int page_num) {
if (!NetworkConnectionStatus.isNetworkAvailable(getActivity())) {
Toast.makeText(getActivity(), "Check your connection and try again", Toast.LENGTH_LONG).show();
} else {
mAsyncTask = new AsyncTask<String, String, String>() {
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... arg0) {
JSONObject food = mFatSecretSearch.searchFood(item, page_num);
JSONArray FOODS_ARRAY;
try {
if (food != null) {
FOODS_ARRAY = food.getJSONArray("food");
if (FOODS_ARRAY != null) {
for (int i = 0; i < FOODS_ARRAY.length(); i++) {
JSONObject food_items = FOODS_ARRAY.optJSONObject(i);
String food_name = food_items.getString("food_name");
String food_description = food_items.getString("food_description");
String[] row = food_description.split("-");
String id = food_items.getString("food_type");
if (id.equals("Brand")) {
brand = food_items.getString("brand_name");
}
if (id.equals("Generic")) {
brand = "Generic";
}
String food_id = food_items.getString("food_id");
mItem.add(new SearchItemResult(food_name, row[1].substring(1),
"" + brand, food_id));
}
}
}
} catch (JSONException exception) {
exception.printStackTrace();
return "Error";
}
return "";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
searchAdapter.notifyDataSetChanged();
if (listContainer.getCount() > 0) {
searchBack.setVisibility(View.VISIBLE);
TranslateAnimation slide = new TranslateAnimation(0, 0, listContainer.getHeight(), 0);
slide.setStartTime(1000);
listContainer.setVisibility(View.VISIBLE);
slide.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
slide.setDuration(400);
listContainer.startAnimation(slide);
} else {
searchBack.setVisibility(View.GONE);
listContainer.setVisibility(View.GONE);
}
}
@Override
protected void onCancelled() {
}
};
mAsyncTask.execute();
}
}
/**
* Speech Input
* Voice search then implements search method based on result
*/
public static int REQ_CODE_SPEECH_INPUT = 100;
public static String SEARCH_VOICE = "";
private void promptSpeechInput(EditText e) {
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(e.getWindowToken(), 0);
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Say Something");
try {
startActivityForResult(intent, REQ_CODE_SPEECH_INPUT);
} catch (ActivityNotFoundException a) {
Toast.makeText(getActivity().getApplicationContext(), "Not Supported", Toast.LENGTH_SHORT).show();
}
}
/**
* Set the text based on google voice then implement search
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQ_CODE_SPEECH_INPUT) {
if (resultCode == Activity.RESULT_OK && null != data) {
ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
edit_text_search.setText(result.get(0));
}
}
}
}