Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,26 @@
<activity
android:name=".ui.DetailActivity"
android:label="@string/title_activity_detail"></activity>

<receiver
android:label="@string/app_name"
android:enabled="true"
android:name=".widget.StockWidgetProvider">

<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="com.udacity.android.stockhack.app.ACTION_DATA_UPDATED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/stock_widget_provider" />
</receiver>

<service
android:name=".widget.StockWidgetService"
android:exported="false"
android:enabled="true"
android:permission="android.permission.BIND_REMOTEVIEWS" />
</application>

</manifest>
3 changes: 3 additions & 0 deletions app/src/main/java/com/udacity/stockhawk/data/Contract.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ public static final class Quote implements BaseColumns {
public static final int POSITION_ABSOLUTE_CHANGE = 3;
public static final int POSITION_PERCENTAGE_CHANGE = 4;
public static final int POSITION_HISTORY = 5;
public static final String SORTORDER_ASCENDING = " ASC";
public static final String SORTORDER_DESCENDING = " DESC";

public static final ImmutableList<String> QUOTE_COLUMNS = ImmutableList.of(
_ID,
COLUMN_SYMBOL,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ public Cursor query(@NonNull Uri uri, String[] projection, String selection, Str
}

Context context = getContext();
if (context != null){
if (context != null) {
returnCursor.setNotificationUri(context.getContentResolver(), uri);
}

Expand Down Expand Up @@ -103,7 +103,7 @@ public Uri insert(@NonNull Uri uri, ContentValues values) {
}

Context context = getContext();
if (context != null){
if (context != null) {
context.getContentResolver().notifyChange(uri, null);
}

Expand Down Expand Up @@ -142,7 +142,7 @@ public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {

if (rowsDeleted != 0) {
Context context = getContext();
if (context != null){
if (context != null) {
context.getContentResolver().notifyChange(uri, null);
}
}
Expand Down
19 changes: 6 additions & 13 deletions app/src/main/java/com/udacity/stockhawk/ui/DetailActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,20 @@

public class DetailActivity extends AppCompatActivity {

String history="";
String symbol="";
String history = "";
String symbol = "";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail);


Bundle extras = getIntent().getExtras();
if(extras!=null) {
history = getIntent().getExtras().getString("history");
symbol = getIntent().getExtras().getString("symbol");
}
Bundle arguments = new Bundle();
arguments.putString("history",history);
arguments.putString("symbol",symbol);
DetailActivityFragment fragment = new DetailActivityFragment();
fragment.setArguments(arguments);
fragment.setArguments(extras);
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_detail_container, fragment)
.commit();
.add(R.id.fragment_detail_container, fragment)
.commit();

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.udacity.stockhawk.R;
import com.udacity.stockhawk.widget.StockWidgetProvider;

import java.util.ArrayList;
import java.util.Calendar;
Expand All @@ -33,8 +34,8 @@
*/
public class DetailActivityFragment extends Fragment implements IAxisValueFormatter {

String history="";
String symbol="";
String history = "";
String symbol = "";
String[] History;
List<Entry> entries;
String[] data;
Expand All @@ -44,6 +45,7 @@ public class DetailActivityFragment extends Fragment implements IAxisValueFormat
Legend legend;
@BindView(R.id.lineChart)
LineChart lineChart;

public DetailActivityFragment() {
}

Expand All @@ -54,28 +56,28 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
ButterKnife.bind(this, view);
Bundle arguments = getArguments();
if (arguments != null) {
history=arguments.getString("history");
symbol=arguments.getString("symbol");
history = arguments.getString(StockWidgetProvider.EXTRA_HISTORY);
symbol = arguments.getString(StockWidgetProvider.EXTRA_SYMBOL);
}

if(history==null){
if (history == null) {

}else{
} else {
entries = new ArrayList<>();
stockDates = new ArrayList<>();
History = history.split("\n"); // break up entries by the newline
int timeCount = 0;

for ( String historyDataItem : History ) {
for (String historyDataItem : History) {
data = historyDataItem.split(", ");
entries.add(new Entry( timeCount++, Float.parseFloat(data[1])) );
entries.add(new Entry(timeCount++, Float.parseFloat(data[1])));
stockDates.add(data[0]);
}

lineChartStock();
}
Log.d("Hello Vikas:=","Details = Symbol:"+symbol+" "+": "+history);
Toast.makeText(getActivity(),""+symbol+"-"+history,Toast.LENGTH_SHORT);
Log.d("Hello Vikas:=", "Details = Symbol:" + symbol + " " + ": " + history);
Toast.makeText(getActivity(), "" + symbol + "-" + history, Toast.LENGTH_SHORT);
return view;
}

Expand Down Expand Up @@ -105,24 +107,24 @@ private void lineChartStock() {
}

// This is used to store XY-axis Settings
private void XYAxis(){
private void XYAxis() {
XAxis XAxis = lineChart.getXAxis();
XAxis.setValueFormatter(this);
XAxis.setTextColor (Color.BLACK);
YAxis YAxisL = lineChart.getAxis( YAxis.AxisDependency.LEFT);
YAxis YAxisR = lineChart.getAxis( YAxis.AxisDependency.RIGHT);
YAxisL.setTextColor (Color.BLACK);
YAxisR.setTextColor (Color.BLACK);
XAxis.setTextColor(Color.BLACK);
YAxis YAxisL = lineChart.getAxis(YAxis.AxisDependency.LEFT);
YAxis YAxisR = lineChart.getAxis(YAxis.AxisDependency.RIGHT);
YAxisL.setTextColor(Color.BLACK);
YAxisR.setTextColor(Color.BLACK);

}

@Override
public String getFormattedValue(float value, AxisBase axis) {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis((long) Float.parseFloat(stockDates.get((int)Math.floor(value))));
calendar.setTimeInMillis((long) Float.parseFloat(stockDates.get((int) Math.floor(value))));
int mYear = calendar.get(Calendar.YEAR) - 2000;
int mMonth = calendar.get(Calendar.MONTH) + 1;
int mDay = calendar.get(Calendar.DAY_OF_MONTH);
return mDay+"/"+mMonth+"/"+mYear;
return mDay + "/" + mMonth + "/" + mYear;
}
}
20 changes: 12 additions & 8 deletions app/src/main/java/com/udacity/stockhawk/ui/MainActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,10 @@
import com.udacity.stockhawk.data.Contract;
import com.udacity.stockhawk.data.PrefUtils;
import com.udacity.stockhawk.sync.QuoteSyncJob;
import com.udacity.stockhawk.widget.StockWidgetProvider;

import butterknife.BindView;
import butterknife.ButterKnife;
import timber.log.Timber;

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>,
SwipeRefreshLayout.OnRefreshListener,
Expand All @@ -47,11 +47,12 @@ public class MainActivity extends AppCompatActivity implements LoaderManager.Loa

@Override
public void onClick(String symbol, String history) {
Intent intent=new Intent(MainActivity.this,com.udacity.stockhawk.ui.DetailActivity.class);
intent.putExtra("symbol",symbol);
intent.putExtra("history",history);
Bundle extras = new Bundle();
extras.putString(StockWidgetProvider.EXTRA_SYMBOL, symbol);
extras.putString(StockWidgetProvider.EXTRA_HISTORY, history);
Intent intent = new Intent(MainActivity.this, DetailActivity.class)
.putExtras(extras);
startActivity(intent);
Timber.d("Symbol clicked: %s", symbol);
}

@Override
Expand Down Expand Up @@ -121,7 +122,7 @@ public void button(@SuppressWarnings("UnusedParameters") View view) {
}

void addStock(String symbol) {
if (symbol != null && !symbol.isEmpty() && symbol.matches("^[A-Z]+$")) {
if (symbol != null && !symbol.isEmpty() && symbol.matches("^[A-Z]+$") || symbol.matches("^[a-z]+$")) {

if (networkUp()) {
swipeRefreshLayout.setRefreshing(true);
Expand All @@ -132,8 +133,8 @@ void addStock(String symbol) {

PrefUtils.addStock(this, symbol);
QuoteSyncJob.syncImmediately(this);
}else{
Toast.makeText(this,"Invalid Symbol", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "Invalid Symbol", Toast.LENGTH_LONG).show();

}

Expand All @@ -155,6 +156,9 @@ public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
error.setVisibility(View.GONE);
}
adapter.setCursor(data);

// Send update broadcast to update the widget
sendBroadcast(new Intent("android.appwidget.action.APPWIDGET_UPDATE"));
}


Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/com/udacity/stockhawk/ui/StockAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ class StockAdapter extends RecyclerView.Adapter<StockAdapter.StockViewHolder> {
private final DecimalFormat dollarFormatWithPlus;
private final DecimalFormat dollarFormat;
private final DecimalFormat percentageFormat;
private Cursor cursor;
private final StockAdapterOnClickHandler clickHandler;
private Cursor cursor;

StockAdapter(Context context, StockAdapterOnClickHandler clickHandler) {
this.context = context;
Expand Down Expand Up @@ -129,7 +129,7 @@ public void onClick(View v) {
int adapterPosition = getAdapterPosition();
cursor.moveToPosition(adapterPosition);
int symbolColumn = cursor.getColumnIndex(Contract.Quote.COLUMN_SYMBOL);
clickHandler.onClick(cursor.getString(symbolColumn),cursor.getString(Contract.Quote.POSITION_HISTORY));
clickHandler.onClick(cursor.getString(symbolColumn), cursor.getString(Contract.Quote.POSITION_HISTORY));

}

Expand Down
39 changes: 39 additions & 0 deletions app/src/main/java/com/udacity/stockhawk/util/Util.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.udacity.stockhawk.util;

import android.widget.RemoteViews;

import com.udacity.stockhawk.R;
import com.udacity.stockhawk.data.Contract;

/**
* Created by Dell on 3/31/2017.
*/

public class Util {
private static String priceBackground = "setBackgroundResource";
public static final String[] COLUMN_PROJECTION = {
Contract.Quote._ID,
Contract.Quote.COLUMN_SYMBOL,
Contract.Quote.COLUMN_PRICE,
Contract.Quote.COLUMN_ABSOLUTE_CHANGE,
Contract.Quote.COLUMN_PERCENTAGE_CHANGE,
Contract.Quote.COLUMN_HISTORY,
};


public static void setBackColourPrice(RemoteViews row, String percent) {
if ( Float.parseFloat(percent) > 0 )
row.setInt(R.id.change, priceBackground, R.color.material_green_700);
else
row.setInt(R.id.change, priceBackground, R.color.material_red_700);
}

public static String addSignOnPrice(String percent) {
StringBuilder newPercent = new StringBuilder(percent);
if (Float.parseFloat(percent) > 0 )
newPercent.insert( 0, "+" );
return newPercent.toString();
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.udacity.stockhawk.widget;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.RemoteViews;

import com.udacity.stockhawk.R;
import com.udacity.stockhawk.ui.DetailActivity;
import com.udacity.stockhawk.ui.MainActivity;

/**
* Created by Dell on 3/31/2017.
*/

public class StockWidgetProvider extends AppWidgetProvider {

public static String EXTRA_SYMBOL = "_SYMBOL";
public static String EXTRA_HISTORY = "_HISTORY";
public static String ACTION_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";

@Override
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
int[] appWidgetIDs;
if (intent.getAction().equals(ACTION_UPDATE)) {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
appWidgetIDs = appWidgetManager.getAppWidgetIds(new ComponentName(context, getClass()));
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetIDs, R.id.stocklist);
}
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

for (int appWidgetId : appWidgetIds) {

RemoteViews widgetViews = new RemoteViews(context.getPackageName(), R.layout.stock_widget);
Intent svcIntent = new Intent(context, StockWidgetService.class);
svcIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);

svcIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
svcIntent.setData(Uri.parse(svcIntent.toUri(Intent.URI_INTENT_SCHEME)));
widgetViews.setRemoteAdapter(R.id.stocklist, svcIntent);
widgetViews.setEmptyView(R.id.stocklist, R.id.emptyMessage);

Intent clickAppIntent = new Intent(context, MainActivity.class);
Intent clickIntent = new Intent(context, DetailActivity.class);
PendingIntent appPI = PendingIntent.getActivity(context, 0, clickAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent clickPI = PendingIntent.getActivity(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT);
widgetViews.setOnClickPendingIntent(R.id.stockTitle, appPI);
widgetViews.setPendingIntentTemplate(R.id.stocklist, clickPI);

appWidgetManager.updateAppWidget(appWidgetId, widgetViews);
}

super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.udacity.stockhawk.widget;

import android.content.Intent;
import android.widget.RemoteViewsService;

/**
* Created by Dell on 3/31/2017.
*/
public class StockWidgetService extends RemoteViewsService {
@Override
public RemoteViewsService.RemoteViewsFactory onGetViewFactory(Intent intent) {
return (new StockWidgetViewsFactory(this.getApplicationContext(), intent));
}
}
Loading