Java tutorial
/* * Copyright 2016. Julia Kozhukhovskaya * * 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.julia.android.stockhawk.ui; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkCapabilities; import android.net.NetworkRequest; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.support.v7.widget.helper.ItemTouchHelper; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.julia.android.stockhawk.R; import com.julia.android.stockhawk.data.Contract; import com.julia.android.stockhawk.data.PrefUtils; import com.julia.android.stockhawk.sync.QuoteSyncJob; import com.julia.android.stockhawk.util.NetworkCallback; import com.julia.android.stockhawk.util.NetworkUtility; import butterknife.BindView; import butterknife.ButterKnife; import static com.julia.android.stockhawk.sync.QuoteSyncJob.ACTION_ADD_STOCK; import static com.julia.android.stockhawk.sync.QuoteSyncJob.EXTRA_MESSAGE; public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>, SwipeRefreshLayout.OnRefreshListener, StockAdapter.StockAdapterOnClickHandler { @BindView(R.id.recycler_view) RecyclerView recyclerView; @BindView(R.id.fab) FloatingActionButton fab; @BindView(R.id.swipe_refresh) SwipeRefreshLayout swipeRefreshLayout; @BindView(R.id.error) TextView error; @BindView(R.id.toolbar) Toolbar toolbar; private StockAdapter adapter; private static final int STOCK_LOADER = 0; // Listen for network status changes via ConnectivityManager.NetworkCallback subclass. private NetworkCallback networkCallback; @Override public void onClick(String symbol) { Intent intent = new Intent(this, StockDetailActivity.class); intent.putExtra(StockDetailActivity.EXTRA_SYMBOL, symbol); recyclerView.setContentDescription(symbol); startActivity(intent); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); setSupportActionBar(toolbar); adapter = new StockAdapter(this, this); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); swipeRefreshLayout.setOnRefreshListener(this); swipeRefreshLayout.setRefreshing(true); onRefresh(); QuoteSyncJob.initialize(this); getSupportLoaderManager().initLoader(STOCK_LOADER, null, this); new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) { @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { return false; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { String symbol = adapter.getSymbolAtPosition(viewHolder.getAdapterPosition()); PrefUtils.removeStock(MainActivity.this, symbol); getContentResolver().delete(Contract.Quote.makeUriForStock(symbol), null, null); // check if all stocks had been removed, then show a message 'no stocks'. if (PrefUtils.getStocks(getApplicationContext()).size() == 0) { swipeRefreshLayout.setRefreshing(false); error.setText(getString(R.string.error_no_stocks)); error.setVisibility(View.VISIBLE); } QuoteSyncJob.updateWidget(getApplicationContext()); } }).attachToRecyclerView(recyclerView); // Add separation lines between items in RecyclerView recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); registerReceiver(broadcastReceiver, new IntentFilter(ACTION_ADD_STOCK)); } /** * Receive that a non-existing stock name was added by the user */ BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); String message = extras.getString(EXTRA_MESSAGE); Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } }; @Override protected void onResume() { super.onResume(); // Register network callbacks ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); networkCallback = new NetworkCallback(this); NetworkRequest.Builder networkRequestBuilder = new NetworkRequest.Builder(); networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); connectivityManager.registerNetworkCallback(networkRequestBuilder.build(), networkCallback); } @Override protected void onPause() { try { if (broadcastReceiver != null) { unregisterReceiver(broadcastReceiver); broadcastReceiver = null; } ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); connectivityManager.unregisterNetworkCallback(networkCallback); } catch (IllegalArgumentException e) { e.printStackTrace(); } super.onStop(); } @Override public void onRefresh() { QuoteSyncJob.syncImmediately(this); if (!NetworkUtility.isNetworkAvailable(getApplicationContext()) && adapter.getItemCount() == 0) { swipeRefreshLayout.setRefreshing(false); error.setText(getString(R.string.error_no_network)); error.setVisibility(View.VISIBLE); } else if (!NetworkUtility.isNetworkAvailable(getApplicationContext())) { swipeRefreshLayout.setRefreshing(false); Toast.makeText(this, R.string.toast_no_connectivity, Toast.LENGTH_LONG).show(); } else if (PrefUtils.getStocks(this).size() == 0) { swipeRefreshLayout.setRefreshing(false); error.setText(getString(R.string.error_no_stocks)); error.setVisibility(View.VISIBLE); } else { error.setVisibility(View.GONE); } } public void button(View view) { new AddStockDialog().show(getFragmentManager(), "StockDialogFragment"); } void addStock(String symbol) { if (symbol != null && !symbol.isEmpty()) { if (NetworkUtility.isNetworkAvailable(getApplicationContext())) { swipeRefreshLayout.setRefreshing(true); } else { String message = getString(R.string.toast_stock_added_no_connectivity, symbol); Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } PrefUtils.addStock(this, symbol); QuoteSyncJob.syncImmediately(this); } } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new CursorLoader(this, Contract.Quote.uri, Contract.Quote.QUOTE_COLUMNS, null, null, Contract.Quote.COLUMN_SYMBOL); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { swipeRefreshLayout.setRefreshing(false); if (data.getCount() != 0) { error.setVisibility(View.GONE); } adapter.setCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { swipeRefreshLayout.setRefreshing(false); adapter.setCursor(null); } private void setDisplayModeMenuItemIcon(MenuItem item) { if (PrefUtils.getDisplayMode(this).equals(getString(R.string.pref_display_mode_absolute_key))) { item.setIcon(R.drawable.ic_percentage); } else { item.setIcon(R.drawable.ic_dollar); } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_activity_settings, menu); MenuItem item = menu.findItem(R.id.action_change_units); setDisplayModeMenuItemIcon(item); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_change_units) { PrefUtils.toggleDisplayMode(this); setDisplayModeMenuItemIcon(item); adapter.notifyDataSetChanged(); return true; } return super.onOptionsItemSelected(item); } }