Draw charts

This commit is contained in:
tom79 2019-07-28 18:13:39 +02:00
parent 4c8945811f
commit 237b77d085
6 changed files with 109 additions and 57 deletions

View File

@ -17,70 +17,44 @@ package app.fedilab.android.activities;
import android.annotation.SuppressLint;
import android.app.DatePickerDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import androidx.core.content.ContextCompat;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import com.github.mikephil.charting.charts.LineChart;
import java.text.DecimalFormat;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import app.fedilab.android.R;
import app.fedilab.android.asynctasks.RetrieveChartsAsyncTask;
import app.fedilab.android.asynctasks.RetrieveFeedsAsyncTask;
import app.fedilab.android.asynctasks.RetrieveStatsAsyncTask;
import app.fedilab.android.client.APIResponse;
import app.fedilab.android.client.Entities.Account;
import app.fedilab.android.client.Entities.Charts;
import app.fedilab.android.client.Entities.Statistics;
import app.fedilab.android.client.Entities.Status;
import app.fedilab.android.drawers.StatusListAdapter;
import app.fedilab.android.helper.FilterToots;
import app.fedilab.android.helper.Helper;
import app.fedilab.android.interfaces.OnRetrieveChartsInterface;
import app.fedilab.android.interfaces.OnRetrieveFeedsInterface;
import app.fedilab.android.interfaces.OnRetrieveStatsInterface;
import app.fedilab.android.services.BackupStatusInDataBaseService;
import app.fedilab.android.sqlite.AccountDAO;
import app.fedilab.android.sqlite.Sqlite;
import app.fedilab.android.sqlite.StatusCacheDAO;
import es.dmoral.toasty.Toasty;
/**
@ -92,7 +66,6 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
LinearLayoutManager mLayoutManager;
private int style;
private Button settings_time_from, settings_time_to;
private Date dateIni, dateEnd;
private LineChart chart;
@ -131,15 +104,19 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
actionBar.setCustomView(view, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_toot);
close_toot.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
ImageView close_toot = actionBar.getCustomView().findViewById(R.id.close_conversation);
close_toot.setOnClickListener(v -> finish());
TextView toolbarTitle = actionBar.getCustomView().findViewById(R.id.toolbar_title);
ImageView pp_actionBar = actionBar.getCustomView().findViewById(R.id.pp_actionBar);
SQLiteDatabase db = Sqlite.getInstance(getApplicationContext(), Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
String instance = sharedpreferences.getString(Helper.PREF_INSTANCE, null);
Account account = new AccountDAO(getApplicationContext(),db).getUniqAccount(userId, instance);
String url = account.getAvatar();
if( url.startsWith("/") ){
url = Helper.getLiveInstanceWithProtocol(getApplicationContext()) + account.getAvatar();
}
Helper.loadGiF(getApplicationContext(), url, pp_actionBar);
if (theme == Helper.THEME_LIGHT){
Helper.colorizeToolbar(actionBar.getCustomView().findViewById(R.id.toolbar), R.color.black, OwnerChartsActivity.this);
}
@ -150,17 +127,19 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
chart = findViewById(R.id.chart);
settings_time_from = findViewById(R.id.settings_time_from);
settings_time_to = findViewById(R.id.settings_time_to);
if( theme == Helper.THEME_DARK){
style = R.style.DialogDark;
}else if( theme == Helper.THEME_BLACK){
style = R.style.DialogBlack;
}else {
style = R.style.Dialog;
}
SQLiteDatabase db = Sqlite.getInstance(OwnerChartsActivity.this, Sqlite.DB_NAME, null, Sqlite.DB_VERSION).open();
dateIni = new StatusCacheDAO(OwnerChartsActivity.this, db).getSmallerDate(StatusCacheDAO.ARCHIVE_CACHE);
dateEnd = new StatusCacheDAO(OwnerChartsActivity.this, db).getGreaterDate(StatusCacheDAO.ARCHIVE_CACHE);
Calendar cal = Calendar.getInstance();
cal.setTime(dateEnd);
cal.add(Calendar.MONTH, -1);
Date result = cal.getTime();
if( result.after(dateIni))
dateIni = result;
if(dateIni == null){
dateIni = new Date();
}
@ -228,5 +207,63 @@ public class OwnerChartsActivity extends BaseActivity implements OnRetrieveChart
@Override
public void onCharts(Charts charts) {
List<Entry> boostsEntry = new ArrayList<>();
int i = 0;
for (int boost : charts.getBoosts()) {
boostsEntry.add(new Entry(charts.getxValues().get(i), boost));
Log.v(Helper.TAG,"boost: " + boost);
i++;
}
Log.v(Helper.TAG,"boostsEntry: " + boostsEntry.size());
List<Entry> repliesEntry = new ArrayList<>();
i = 0;
for (int reply : charts.getReplies()) {
repliesEntry.add(new Entry(charts.getxValues().get(i), reply));
Log.v(Helper.TAG,"reply: " + reply);
i++;
}
Log.v(Helper.TAG,"repliesEntry: " + repliesEntry.size());
List<Entry> statusesEntry = new ArrayList<>();
i = 0;
for (int status : charts.getStatuses()) {
statusesEntry.add(new Entry(charts.getxValues().get(i), status));
Log.v(Helper.TAG,"status: " + status);
i++;
}
Log.v(Helper.TAG,"statusesEntry: " + statusesEntry.size());
LineDataSet dataSetBoosts = new LineDataSet(boostsEntry, getString(R.string.reblog));
dataSetBoosts.setColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_boost));
dataSetBoosts.setValueTextColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_boost));
LineDataSet dateSetReplies = new LineDataSet(repliesEntry, getString(R.string.replies));
dataSetBoosts.setColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_reply));
dataSetBoosts.setValueTextColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_reply));
LineDataSet dataSetStatuses = new LineDataSet(statusesEntry, getString(R.string.statuses));
dataSetBoosts.setColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_status));
dataSetBoosts.setValueTextColor(ContextCompat.getColor(OwnerChartsActivity.this, R.color.chart_status));
List<ILineDataSet> dataSets = new ArrayList<ILineDataSet>();
dataSets.add(dataSetBoosts);
dataSets.add(dateSetReplies);
dataSets.add(dataSetStatuses);
XAxis xAxis = chart.getXAxis();
xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
xAxis.setTextSize(10f);
xAxis.setLabelRotationAngle(45);
//xAxis.setTextColor(Color.RED);
xAxis.setDrawAxisLine(true);
xAxis.setDrawGridLines(false);
LineData data = new LineData(dataSets);
chart.setData(data);
chart.invalidate();
}
}

View File

@ -547,6 +547,12 @@ public class OwnerStatusActivity extends BaseActivity implements OnRetrieveFeeds
TextView first_toot_date = statsDialogView.findViewById(R.id.first_toot_date);
TextView tags = statsDialogView.findViewById(R.id.tags);
Button charts = statsDialogView.findViewById(R.id.charts);
charts.setOnClickListener(w ->{
Intent intent = new Intent(OwnerStatusActivity.this, OwnerChartsActivity.class);
startActivity(intent);
});
total_statuses.setText(String.valueOf(statistics.getTotal_statuses()));
number_boosts.setText(String.valueOf(statistics.getNumber_boosts()));
number_replies.setText(String.valueOf(statistics.getNumber_replies()));

View File

@ -19,8 +19,6 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
@ -443,17 +441,16 @@ public class StatusCacheDAO {
String userId = sharedpreferences.getString(Helper.PREF_KEY_ID, null);
String instance = Helper.getLiveInstance(context);
Charts charts = new Charts();
dateIni = new Date(dateIni.getYear(), dateIni.getMonth(), dateIni.getDay(), 0, 0, 0);
Calendar start = Calendar.getInstance();
start.setTime(dateIni);
start.set(Calendar.HOUR,0);
start.set(Calendar.HOUR_OF_DAY,0);
start.set(Calendar.MINUTE,0);
start.set(Calendar.SECOND,0);
Calendar end = Calendar.getInstance();
end.setTime(dateEnd);
end.set(Calendar.HOUR,23);
end.set(Calendar.HOUR_OF_DAY,23);
end.set(Calendar.MINUTE,59);
end.set(Calendar.SECOND,59);
@ -477,7 +474,7 @@ public class StatusCacheDAO {
if( data != null && data.size() > 0) {
while (!start.after(end)) {
Date targetDay = start.getTime();
Date dateLimite = new Date(targetDay.getTime() - TimeUnit.DAYS.toMillis(1));
Date dateLimite = new Date(targetDay.getTime() + TimeUnit.DAYS.toMillis(1));
xLabel.add(Helper.shortDateToString(targetDay));
xValues.add(inc);
int boostsCount = 0;
@ -492,15 +489,13 @@ public class StatusCacheDAO {
}else {
statusesCount++;
}
}else{
inc++;
break;
}
}
boosts.add(boostsCount);
replies.add(repliesCount);
statuses.add(statusesCount);
start.add(Calendar.DATE, 1);
inc++;
}
}
charts.setxLabels(xLabel);

View File

@ -33,6 +33,12 @@
android:paddingEnd="@dimen/activity_vertical_margin"
android:paddingRight="@dimen/activity_vertical_margin"
android:layout_height="wrap_content">
<Button
android:id="@+id/charts"
android:text="@string/display_charts"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:layout_width="match_parent"
android:layout_marginTop="20dp"

View File

@ -152,4 +152,11 @@
<color name="quick_reply_background_dark">#2d313c</color>
<color name="quick_reply_background_black">#1A1A1A</color>
<color name="quick_reply_background_light">#E0E0E0</color>
<color name="chart_boost">#7B1FA2</color>
<color name="chart_reply">#0097A7</color>
<color name="chart_status">#1976D2</color>
</resources>

View File

@ -1141,6 +1141,7 @@
<string name="no_messages">No groups!</string>
<string name="set_disable_animated_emoji">Disable custom animated emojis</string>
<string name="owner_charts">Charts</string>
<string name="display_charts">Display charts</string>
<plurals name="number_of_vote">
<item quantity="one">%d vote</item>
<item quantity="other">%d votes</item>