package io.github.project_travel_mate.travel; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Parcelable; import android.os.StrictMode; import android.preference.PreferenceManager; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; import com.airbnb.lottie.LottieAnimationView; import com.miguelcatalan.materialsearchview.MaterialSearchView; import org.json.JSONArray; import org.json.JSONException; import java.io.IOException; import java.util.Objects; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import io.github.project_travel_mate.R; import okhttp3.Call; import okhttp3.Callback; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import utils.Utils; import static utils.Constants.API_LINK_V2; import static utils.Constants.USER_TOKEN; public class ShoppingCurrentCityActivity extends AppCompatActivity { @BindView(R.id.shopping_list) ListView lv; @BindView(R.id.query) EditText q; @BindView(R.id.go) Button ok; @BindView(R.id.text_view) TextView textView; @BindView(R.id.animation_view) LottieAnimationView animationView; @BindView(R.id.layout) LinearLayout layout; @BindView(R.id.show_city_name) TextView showCityName; private MaterialSearchView mSearchView; private String mToken; private Handler mHandler; private JSONArray mFeedItems; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shopping_currentcity); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); ButterKnife.bind(this); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); mToken = sharedPreferences.getString(USER_TOKEN, null); mHandler = new Handler(Looper.getMainLooper()); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); setTitle(getResources().getString(R.string.text_shopping)); mSearchView = findViewById(R.id.search_view); mSearchView.setOnQueryTextListener(new MaterialSearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { //Do some magic Log.v("QUERY ITEM : ", query); try { getShoppingItems(query); } catch (Exception e) { networkError(); } return false; } @Override public boolean onQueryTextChange(String newText) { //Do some magic return false; } }); mSearchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() { @Override public void onSearchViewShown() { //Do some magic } @Override public void onSearchViewClosed() { //Do some magic } }); getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN ); Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true); getSupportActionBar().setHomeButtonEnabled(true); try { Parcelable listViewState = savedInstanceState.getParcelable("listview"); String showCityNameState = savedInstanceState.getString("showCityName"); String feedItemsState = savedInstanceState.getString("feedItems"); if (listViewState != null || showCityNameState != null || feedItemsState != null) { try { mFeedItems = new JSONArray(feedItemsState); } catch (JSONException e) { e.printStackTrace(); } lv.setAdapter(new ShoppingAdapter(ShoppingCurrentCityActivity.this, mFeedItems)); lv.onRestoreInstanceState(listViewState); showCityName.setText(showCityNameState); showCityName.setVisibility(View.VISIBLE); } } catch (NullPointerException e) { e.printStackTrace(); } } @OnClick(R.id.go) void onClick() { try { String item = q.getText().toString(); getShoppingItems(item); } catch (Exception e) { networkError(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search_menu, menu); MenuItem item = menu.findItem(R.id.action_search); mSearchView.setMenuItem(item); return true; } @Override public void onBackPressed() { if (mSearchView.isSearchOpen()) { mSearchView.closeSearch(); } else { super.onBackPressed(); } } @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == android.R.id.home) finish(); return super.onOptionsItemSelected(item); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("listview", lv.onSaveInstanceState()); outState.putString("showCityName", String.valueOf(showCityName.getText())); outState.putString("feedItems", mFeedItems.toString()); } private void getShoppingItems(final String item) { showCityName.setText(String.format(getString(R.string.showing_shopping_item), item)); showCityName.setVisibility(View.VISIBLE); String uri = API_LINK_V2 + "get-shopping-info/" + item; uri = uri.replace(" ", "+"); //Set up client OkHttpClient client = new OkHttpClient(); //Execute request Request request = new Request.Builder() .header("Authorization", "Token " + mToken) .url(uri) .build(); Log.v("EXECUTING : ", uri); //Setup callback client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.e("Request Failed", "Message : " + e.getMessage()); mHandler.post(() -> networkError()); } @Override public void onResponse(Call call, final Response response) { mHandler.post(() -> { if (response.isSuccessful()) { try { final String res = Objects.requireNonNull(response.body()).string(); mFeedItems = new JSONArray(res); Log.v("response", mFeedItems + " "); if (mFeedItems.length() == 0) { Utils.hideKeyboard(ShoppingCurrentCityActivity.this); } animationView.setVisibility(View.GONE); layout.setVisibility(View.VISIBLE); textView.setVisibility(View.GONE); lv.setAdapter(new ShoppingAdapter(ShoppingCurrentCityActivity.this, mFeedItems)); } catch (JSONException | IOException e) { e.printStackTrace(); networkError(); } } else { noResults(); } }); } }); } public static Intent getStartIntent(Context context) { Intent intent = new Intent(context, ShoppingCurrentCityActivity.class); return intent; } /** * Plays the network lost animation in the view */ private void networkError() { showCityName.setVisibility(View.GONE); animationView.setVisibility(View.VISIBLE); layout.setVisibility(View.GONE); animationView.setAnimation(R.raw.network_lost); animationView.playAnimation(); } /** * Plays the no results animation in the view */ private void noResults() { animationView.setVisibility(View.VISIBLE); layout.setVisibility(View.GONE); Toast.makeText(ShoppingCurrentCityActivity.this, R.string.no_results, Toast.LENGTH_LONG).show(); animationView.setAnimation(R.raw.empty_list); animationView.playAnimation(); } }