From 764f82bc584973352d09439df3d7d551569072e7 Mon Sep 17 00:00:00 2001 From: Riberto Junior Date: Thu, 8 Dec 2016 18:38:01 -0200 Subject: [PATCH] Accessibility, localization corrections and add new History Activity --- app/build.gradle | 9 +- app/src/main/AndroidManifest.xml | 9 ++ .../udacity/stockhawk/ui/HistoryActivity.java | 31 ++++++ .../udacity/stockhawk/ui/HistoryFragment.java | 105 ++++++++++++++++++ .../udacity/stockhawk/ui/MainActivity.java | 11 +- app/src/main/res/layout/activity_history.xml | 11 ++ app/src/main/res/layout/activity_main.xml | 49 +++++--- app/src/main/res/layout/fragment_history.xml | 19 ++++ app/src/main/res/layout/list_item_quote.xml | 6 +- .../main/res/menu/main_activity_settings.xml | 2 +- app/src/main/res/menu/menu_history.xml | 10 ++ app/src/main/res/values-w820dp/dimens.xml | 6 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 48 +++++--- build.gradle | 3 +- 15 files changed, 280 insertions(+), 40 deletions(-) create mode 100644 app/src/main/java/com/udacity/stockhawk/ui/HistoryActivity.java create mode 100644 app/src/main/java/com/udacity/stockhawk/ui/HistoryFragment.java create mode 100644 app/src/main/res/layout/activity_history.xml create mode 100644 app/src/main/res/layout/fragment_history.xml create mode 100644 app/src/main/res/menu/menu_history.xml create mode 100644 app/src/main/res/values-w820dp/dimens.xml diff --git a/app/build.gradle b/app/build.gradle index 6d2780d..a4f4c64 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,9 +51,9 @@ check { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' - compile 'com.android.support:appcompat-v7:25.0.0' - compile 'com.android.support:recyclerview-v7:25.0.0' - compile 'com.android.support:design:25.0.0' + compile 'com.android.support:appcompat-v7:25.0.1' + compile 'com.android.support:recyclerview-v7:25.0.1' + compile 'com.android.support:design:25.0.1' compile 'com.jakewharton:butterknife:8.1.0' apt 'com.jakewharton:butterknife-compiler:8.1.0' compile 'com.google.guava:guava:19.0' @@ -64,4 +64,7 @@ dependencies { compile 'com.melnykov:floatingactionbutton:1.3.0' compile 'net.sf.opencsv:opencsv:2.3' compile 'com.github.PhilJay:MPAndroidChart:v2.2.5' + + compile 'com.android.support:support-v4:25.0.1' + compile 'com.android.support:support-annotations:25.0.1' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 1d2192d..cb577d3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -36,6 +36,15 @@ android:enabled="true" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" /> + + + + \ No newline at end of file diff --git a/app/src/main/java/com/udacity/stockhawk/ui/HistoryActivity.java b/app/src/main/java/com/udacity/stockhawk/ui/HistoryActivity.java new file mode 100644 index 0000000..67f5370 --- /dev/null +++ b/app/src/main/java/com/udacity/stockhawk/ui/HistoryActivity.java @@ -0,0 +1,31 @@ +package com.udacity.stockhawk.ui; + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +import com.udacity.stockhawk.R; + +import static com.udacity.stockhawk.ui.HistoryFragment.SYMBOL_URI; + +public class HistoryActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_history); + /*Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true);*/ + if (savedInstanceState == null) { + Bundle args = new Bundle(); + args.putParcelable(SYMBOL_URI, getIntent().getData()); + HistoryFragment historyFragment = new HistoryFragment(); + historyFragment.setArguments(args); + getSupportFragmentManager().beginTransaction() + .add(R.id.hystory_fragment, historyFragment) + .commit(); + + } + } + +} diff --git a/app/src/main/java/com/udacity/stockhawk/ui/HistoryFragment.java b/app/src/main/java/com/udacity/stockhawk/ui/HistoryFragment.java new file mode 100644 index 0000000..97ddb23 --- /dev/null +++ b/app/src/main/java/com/udacity/stockhawk/ui/HistoryFragment.java @@ -0,0 +1,105 @@ +package com.udacity.stockhawk.ui; + +import android.database.Cursor; +import android.net.Uri; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.app.LoaderManager; +import android.support.v4.content.CursorLoader; +import android.support.v4.content.Loader; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.github.mikephil.charting.charts.LineChart; +import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; +import com.github.mikephil.charting.data.LineDataSet; +import com.udacity.stockhawk.R; +import com.udacity.stockhawk.data.Contract; + +import java.util.ArrayList; +import java.util.StringTokenizer; + + +public class HistoryFragment extends Fragment implements LoaderManager.LoaderCallbacks { + public static final String SYMBOL_URI = "URI"; + private static final int STOCK_LOADER = 1; + private Uri mSymbolUri; + + LineChart mChart; + + + private static final String[] HISTORY_COLUMNS ={ + Contract.Quote.COLUMN_SYMBOL, + Contract.Quote.COLUMN_HISTORY + }; + static final int COL_SYMBOL_ID = 0; + static final int COL_HISTORY_ID = 1; + + public HistoryFragment() { + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + Bundle args = getArguments(); + mSymbolUri = args.getParcelable(SYMBOL_URI); + View rootView = inflater.inflate(R.layout.fragment_history, container, false); + mChart = (LineChart) rootView.findViewById(R.id.chart); + mChart.setDescription(getString(R.string.chart_description)); + + return rootView; + } + + @Override + public void onActivityCreated(@Nullable Bundle savedInstanceState) { + getLoaderManager().initLoader(STOCK_LOADER, null, this); + super.onActivityCreated(savedInstanceState); + } + + @Override + public Loader onCreateLoader(int id, Bundle args) { + if (mSymbolUri != null) { + return new CursorLoader(getActivity(), mSymbolUri, HISTORY_COLUMNS, null, null, null); + } + return null; + } + + @Override + public void onLoadFinished(Loader loader, Cursor data) { + + if (data.moveToFirst()) { + ArrayList entries = new ArrayList<>(); + ArrayList xValues = new ArrayList<>(); + String history = data.getString(COL_HISTORY_ID); + String value; + StringTokenizer tokenizer = new StringTokenizer(history, "\n"); + int x = 0; + int count = tokenizer.countTokens() - 1; + while (tokenizer.hasMoreTokens()){ + xValues.add(""+(count-x)); + value = tokenizer.nextToken(); + value = value.split(",")[1]; + entries.add(new Entry(Float.parseFloat(value), x)); + x++; + } + LineDataSet dataSet = new LineDataSet(entries, Contract.Quote.getStockFromUri(mSymbolUri)); + dataSet.setColors(new int[]{R.color.white}, getContext()); + dataSet.setValueTextColor(R.color.white); + + LineData lineData = new LineData(xValues, dataSet); + + mChart.setData(lineData); + + + + } + } + + @Override + public void onLoaderReset(Loader loader) { + + } +} diff --git a/app/src/main/java/com/udacity/stockhawk/ui/MainActivity.java b/app/src/main/java/com/udacity/stockhawk/ui/MainActivity.java index 3a53096..d18efb8 100644 --- a/app/src/main/java/com/udacity/stockhawk/ui/MainActivity.java +++ b/app/src/main/java/com/udacity/stockhawk/ui/MainActivity.java @@ -1,11 +1,14 @@ package com.udacity.stockhawk.ui; import android.content.Context; +import android.content.Intent; import android.database.Cursor; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.net.Uri; import android.os.Bundle; import android.support.design.widget.FloatingActionButton; +import android.support.v4.app.ActivityCompat; import android.support.v4.app.LoaderManager; import android.support.v4.content.CursorLoader; import android.support.v4.content.Loader; @@ -47,6 +50,12 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa @Override public void onClick(String symbol) { Timber.d("Symbol clicked: %s", symbol); + Uri symbolUri = Contract.Quote.makeUriForStock(symbol); + Intent intent = + new Intent(this, HistoryActivity.class).setData(symbolUri); + ActivityCompat.startActivity(this, intent, null); + + } @Override @@ -84,7 +93,7 @@ public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { } - private boolean networkUp() { + public boolean networkUp() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); diff --git a/app/src/main/res/layout/activity_history.xml b/app/src/main/res/layout/activity_history.xml new file mode 100644 index 0000000..d3223a0 --- /dev/null +++ b/app/src/main/res/layout/activity_history.xml @@ -0,0 +1,11 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 40f6e87..f8ac3a5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -7,25 +7,44 @@ android:orientation="vertical" tools:context="com.udacity.stockhawk.ui.MainActivity"> - - + android:layout_height="match_parent"> + + + + + + + - + app:pressedTranslationZ="12dp" + android:contentDescription="@string/add_a_stock"/> + - diff --git a/app/src/main/res/layout/fragment_history.xml b/app/src/main/res/layout/fragment_history.xml new file mode 100644 index 0000000..123f0e2 --- /dev/null +++ b/app/src/main/res/layout/fragment_history.xml @@ -0,0 +1,19 @@ + + + + + + diff --git a/app/src/main/res/layout/list_item_quote.xml b/app/src/main/res/layout/list_item_quote.xml index 91c5d51..f19c1c6 100644 --- a/app/src/main/res/layout/list_item_quote.xml +++ b/app/src/main/res/layout/list_item_quote.xml @@ -13,21 +13,21 @@ style="@style/StockSymbolTextStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:gravity="left|center_vertical" + android:gravity="start|center_vertical" tools:text="GOOG" /> + android:gravity="end"> + app:showAsAction="always" /> diff --git a/app/src/main/res/menu/menu_history.xml b/app/src/main/res/menu/menu_history.xml new file mode 100644 index 0000000..e3989ad --- /dev/null +++ b/app/src/main/res/menu/menu_history.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/values-w820dp/dimens.xml b/app/src/main/res/values-w820dp/dimens.xml new file mode 100644 index 0000000..63fc816 --- /dev/null +++ b/app/src/main/res/values-w820dp/dimens.xml @@ -0,0 +1,6 @@ + + + 64dp + diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 756a300..b8552d4 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -9,5 +9,6 @@ #2196F3 #D50000 #00C853 + #FFFFFF diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 910735b..780fbaa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,39 +1,61 @@ - Stock Hawk - initialized + Stock Hawk + + + History + + + Settings - stocks + initialized - No data + stocks + No data + Display Mode - displayMode - @string/pref_display_mode_percentage_key + displayMode + @string/pref_display_mode_percentage_key - absolute - percentage + absolute + percentage - YHOO - AAPL - MSFT - FB + + YHOO + AAPL + MSFT + FB - @string/pref_display_mode_key + @string/pref_display_mode_key + Add Stock + Symbol (e.g. GOOG) + Cancel + Add + Symbol %s is invalid! + No network connectivity! Will load stock cursor when the network is available. + No stocks added! Hit the floating action button to add one. + Symbol %s added. Will refresh when network available. + Will refresh when network available. + + Add a stock + + + Days ago x USD diff --git a/build.gradle b/build.gradle index 6ed72f0..9035a56 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath 'com.github.ben-manes:gradle-versions-plugin:0.12.0' classpath 'com.noveogroup.android:check:1.2.3' @@ -15,6 +15,7 @@ buildscript { allprojects { repositories { jcenter() + maven { url "https://jitpack.io" } } }