Merge pull request #6958 from TacoTheDank/bumpSpotBugs
Update and fix SpotBugs
This commit is contained in:
commit
68ec4e2527
|
@ -65,7 +65,7 @@ jobs:
|
|||
- name: Lint :app module recursively
|
||||
run: ./gradlew :app:lintPlayRelease
|
||||
- name: SpotBugs
|
||||
run: ./gradlew spotbugsPlayDebug spotbugsDebug 2>&1 | grep -i "spotbugs"
|
||||
run: ./gradlew spotbugsPlayDebug spotbugsDebug
|
||||
|
||||
unit-test:
|
||||
name: "Unit Test: ${{ matrix.variant }}"
|
||||
|
|
|
@ -291,7 +291,7 @@ public class MainActivity extends CastEnabledActivity {
|
|||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
if (drawerLayout != null) {
|
||||
if (drawerLayout != null && drawerToggle != null) {
|
||||
drawerLayout.removeDrawerListener(drawerToggle);
|
||||
}
|
||||
}
|
||||
|
@ -552,7 +552,7 @@ public class MainActivity extends CastEnabledActivity {
|
|||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (isDrawerOpen()) {
|
||||
if (isDrawerOpen() && drawerLayout != null) {
|
||||
drawerLayout.closeDrawer(navDrawer);
|
||||
} else if (sheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED) {
|
||||
sheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
||||
|
|
|
@ -341,7 +341,7 @@ public class NavListAdapter extends RecyclerView.Adapter<NavListAdapter.Holder>
|
|||
if (context == null) {
|
||||
return;
|
||||
}
|
||||
if (tag.isOpen) {
|
||||
if (tag.isOpen()) {
|
||||
holder.count.setVisibility(View.GONE);
|
||||
}
|
||||
Glide.with(context).clear(holder.image);
|
||||
|
|
|
@ -139,8 +139,8 @@ public class TimeRangeDialog extends MaterialAlertDialogBuilder {
|
|||
}
|
||||
|
||||
protected Point radToPoint(float angle, float radius) {
|
||||
return new Point((int) (getWidth() / 2 + radius * Math.sin(-angle * Math.PI / 180 + Math.PI)),
|
||||
(int) (getHeight() / 2 + radius * Math.cos(-angle * Math.PI / 180 + Math.PI)));
|
||||
return new Point((int) (getWidth() / 2.0 + radius * Math.sin(-angle * Math.PI / 180.0 + Math.PI)),
|
||||
(int) (getHeight() / 2.0 + radius * Math.cos(-angle * Math.PI / 180.0 + Math.PI)));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -86,9 +86,9 @@ public class DownloadLogFragment extends BottomSheetDialogFragment
|
|||
|
||||
@Override
|
||||
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
|
||||
Object item = adapter.getItem(position);
|
||||
if (item instanceof DownloadResult) {
|
||||
new DownloadLogDetailsDialog(getContext(), (DownloadResult) item).show();
|
||||
final DownloadResult item = adapter.getItem(position);
|
||||
if (item != null) {
|
||||
new DownloadLogDetailsDialog(getContext(), item).show();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -359,10 +359,10 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS
|
|||
.setState(BottomSheetBehavior.STATE_COLLAPSED);
|
||||
} else {
|
||||
NavDrawerData.TagDrawerItem folder = ((NavDrawerData.TagDrawerItem) clickedItem);
|
||||
if (openFolders.contains(folder.name)) {
|
||||
openFolders.remove(folder.name);
|
||||
if (openFolders.contains(folder.getTitle())) {
|
||||
openFolders.remove(folder.getTitle());
|
||||
} else {
|
||||
openFolders.add(folder.name);
|
||||
openFolders.add(folder.getTitle());
|
||||
}
|
||||
|
||||
getContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE)
|
||||
|
@ -438,8 +438,8 @@ public class NavDrawerFragment extends Fragment implements SharedPreferences.OnS
|
|||
flatItems.add(item);
|
||||
if (item.type == NavDrawerData.DrawerItem.Type.TAG) {
|
||||
NavDrawerData.TagDrawerItem folder = ((NavDrawerData.TagDrawerItem) item);
|
||||
folder.isOpen = openFolders.contains(folder.name);
|
||||
if (folder.isOpen) {
|
||||
folder.setOpen(openFolders.contains(folder.getTitle()));
|
||||
if (folder.isOpen()) {
|
||||
flatItems.addAll(makeFlatDrawerData(((NavDrawerData.TagDrawerItem) item).children, layer + 1));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ buildscript {
|
|||
plugins {
|
||||
id 'com.android.application' version "$agpVersion" apply false
|
||||
id 'com.android.library' version "$agpVersion" apply false
|
||||
id 'com.github.spotbugs' version '4.7.0' apply false
|
||||
id 'com.github.spotbugs' version '4.8.0' apply false
|
||||
id 'checkstyle'
|
||||
}
|
||||
|
||||
|
|
|
@ -76,6 +76,7 @@ gradle.projectsEvaluated {
|
|||
apply plugin: 'com.github.spotbugs'
|
||||
|
||||
spotbugs {
|
||||
toolVersion = '4.2.3'
|
||||
effort = 'max'
|
||||
reportLevel = 'medium'
|
||||
excludeFilter = rootProject.file('config/spotbugs/exclude.xml')
|
||||
|
@ -86,23 +87,33 @@ gradle.taskGraph.whenReady { taskGraph ->
|
|||
taskGraph.allTasks.each { task ->
|
||||
if (task.name.toLowerCase().contains('spotbugs')) {
|
||||
task.doLast {
|
||||
def reportFile = task.project.file("build/reports/spotbugs/playDebug.xml")
|
||||
if (!reportFile.exists()) return
|
||||
def slurped = new groovy.xml.XmlSlurper().parse(reportFile)
|
||||
def reportFile = task.project.file("build/reports/spotbugs/debug.xml")
|
||||
def reportFilePlay = task.project.file("build/reports/spotbugs/playDebug.xml")
|
||||
|
||||
def foundErrors = false
|
||||
slurped['BugInstance'].each { bug ->
|
||||
logger.error "[SpotBugs] ${bug['LongMessage']} [${bug.@'type'}]"
|
||||
bug['SourceLine'].each { line ->
|
||||
logger.error "[SpotBugs] ${line['Message']}"
|
||||
foundErrors = true
|
||||
}
|
||||
if (reportFile.exists()) {
|
||||
parseSpotBugsXml(task, reportFile)
|
||||
}
|
||||
if (foundErrors) {
|
||||
throw new TaskExecutionException(task,
|
||||
new Exception("SpotBugs violations were found. See output above for details."))
|
||||
if (reportFilePlay.exists()) {
|
||||
parseSpotBugsXml(task, reportFilePlay)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def parseSpotBugsXml(task, xmlFile) {
|
||||
def slurped = new groovy.xml.XmlSlurper().parse(xmlFile)
|
||||
|
||||
def foundErrors = false
|
||||
slurped['BugInstance'].each { bug ->
|
||||
logger.error "[SpotBugs] ${bug['LongMessage']} [${bug.@'type'}]"
|
||||
bug['SourceLine'].each { line ->
|
||||
logger.error "[SpotBugs] ${line['Message']}"
|
||||
foundErrors = true
|
||||
}
|
||||
}
|
||||
if (foundErrors) {
|
||||
throw new TaskExecutionException(task,
|
||||
new Exception("SpotBugs violations were found. See output above for details."))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,17 +5,29 @@
|
|||
<Class name="de.danoeh.antennapod.adapter.NavListAdapter"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE"/>
|
||||
<Class name="de.danoeh.antennapod.net.ssl.NoV1SslSocketFactory"/>
|
||||
<Bug pattern="DLS_DEAD_LOCAL_STORE"/>
|
||||
<Class name="de.danoeh.antennapod.ui.statistics.StatisticsFragment"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="DM_DEFAULT_ENCODING"/>
|
||||
<Class name="de.danoeh.antennapod.parser.media.vorbis.VorbisCommentReader"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS"/>
|
||||
<Class name="de.danoeh.antennapod.model.feed.FeedMedia"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS"/>
|
||||
<Class name="de.danoeh.antennapod.model.playback.RemoteMedia"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="HSC_HUGE_SHARED_STRING_CONSTANT"/>
|
||||
<Class name="de.danoeh.antennapod.net.ssl.BackportCaCerts"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="ICAST_IDIV_CAST_TO_DOUBLE"/>
|
||||
<Class name="de.danoeh.antennapod.ui.echo.screens.RotatingSquaresScreen"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="MS_CANNOT_BE_FINAL"/>
|
||||
<Class name="de.danoeh.antennapod.core.service.playback.PlaybackService"/>
|
||||
|
@ -24,10 +36,6 @@
|
|||
<Bug pattern="MS_MUTABLE_ARRAY"/>
|
||||
<Class name="de.danoeh.antennapod.fragment.NavDrawerFragment"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS"/>
|
||||
<Class name="de.danoeh.antennapod.menuhandler.MenuItemUtils"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="NP_NONNULL_PARAM_VIOLATION"/>
|
||||
<Class name="de.danoeh.antennapod.activity.MainActivity"/>
|
||||
|
@ -41,46 +49,47 @@
|
|||
<Class name="de.danoeh.antennapod.model.feed.FeedMedia"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="NP_NULL_PARAM_DEREF"/>
|
||||
<Class name="de.danoeh.antennapod.model.feed.FeedMedia"/>
|
||||
<Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"/>
|
||||
<Class name="de.danoeh.antennapod.core.service.download.DownloadRequestCreator"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"/>
|
||||
<Class name="de.danoeh.antennapod.preferences.PreferenceUpgrader"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/>
|
||||
<Class name="de.danoeh.antennapod.PodcastApp"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/>
|
||||
<Class name="de.danoeh.antennapod.core.service.download.DownloadService"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="MS_CANNOT_BE_FINAL"/>
|
||||
<Class name="de.danoeh.antennapod.core.service.download.DownloadService"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/>
|
||||
<Class name="de.danoeh.antennapod.core.service.playback.PlaybackService"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD"/>
|
||||
<Class name="de.danoeh.antennapod.core.storage.NavDrawerData$TagDrawerItem"/>
|
||||
<Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/>
|
||||
<Class name="de.danoeh.antennapod.ui.home.sections.EpisodesSurpriseSection"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD"/>
|
||||
<Class name="de.danoeh.antennapod.core.cast.CastButtonVisibilityManager"/>
|
||||
<Bug pattern="URF_UNREAD_FIELD"/>
|
||||
<Class name="de.danoeh.antennapod.ui.common.TriangleLabelView$PaintHolder"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"/>
|
||||
<Class name="de.danoeh.antennapod.playback.base.PlaybackServiceMediaPlayer"/>
|
||||
</Match>
|
||||
<Match>
|
||||
<Bug pattern="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"/>
|
||||
<Class name="de.danoeh.antennapod.playback.base.PlaybackServiceMediaPlayer$PSMPInfo"/>
|
||||
</Match>
|
||||
|
||||
<Match><Class name="de.danoeh.antennapod.core.ClientConfig"/></Match>
|
||||
|
||||
<Match><Package name="de.danoeh.antennapod.core.glide"/></Match>
|
||||
<Match><Package name="de.danoeh.antennapod.databinding"/></Match>
|
||||
<Match><Package name="de.danoeh.antennapod.core.databinding"/></Match>
|
||||
<Match><Package name="de.danoeh.antennapod.ui.common.databinding"/></Match>
|
||||
<Match><Package name="de.danoeh.antennapod.ui.echo.databinding"/></Match>
|
||||
<Match><Package name="de.danoeh.antennapod.ui.statistics.databinding"/></Match>
|
||||
|
||||
<Match><Bug pattern="DMI_RANDOM_USED_ONLY_ONCE"/></Match>
|
||||
<Match><Bug pattern="EI_EXPOSE_REP"/></Match>
|
||||
<Match><Bug pattern="EI_EXPOSE_REP2"/></Match>
|
||||
<Match><Bug pattern="HE_EQUALS_NO_HASHCODE"/></Match>
|
||||
<Match><Bug pattern="HE_EQUALS_USE_HASHCODE"/></Match>
|
||||
<Match><Bug pattern="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG"/></Match>
|
||||
<Match><Bug pattern="IS2_INCONSISTENT_SYNC"/></Match>
|
||||
<Match><Bug pattern="NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION"/></Match>
|
||||
|
@ -96,6 +105,8 @@
|
|||
<Match><Bug pattern="SE_TRANSIENT_FIELD_NOT_RESTORED"/></Match>
|
||||
<Match><Bug pattern="SF_SWITCH_NO_DEFAULT"/></Match>
|
||||
<Match><Bug pattern="SIC_INNER_SHOULD_BE_STATIC_ANON"/></Match>
|
||||
<Match><Bug pattern="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD"/></Match>
|
||||
<Match><Bug pattern="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR"/></Match>
|
||||
<Match><Bug pattern="VA_FORMAT_STRING_USES_NEWLINE"/></Match>
|
||||
<Match><Bug pattern="WMI_WRONG_MAP_ITERATOR"/></Match>
|
||||
</FindBugsFilter>
|
||||
|
|
|
@ -90,17 +90,18 @@ public class OpmlBackupAgent extends BackupAgentHelper {
|
|||
|
||||
// Get the old checksum
|
||||
if (oldState != null) {
|
||||
FileInputStream inState = new FileInputStream(oldState.getFileDescriptor());
|
||||
int len = inState.read();
|
||||
try (final FileInputStream inState = new FileInputStream(oldState.getFileDescriptor())) {
|
||||
int len = inState.read();
|
||||
|
||||
if (len != -1) {
|
||||
byte[] oldChecksum = new byte[len];
|
||||
IOUtils.read(inState, oldChecksum, 0, len);
|
||||
Log.d(TAG, "Old checksum: " + new BigInteger(1, oldChecksum).toString(16));
|
||||
if (len != -1) {
|
||||
byte[] oldChecksum = new byte[len];
|
||||
IOUtils.read(inState, oldChecksum, 0, len);
|
||||
Log.d(TAG, "Old checksum: " + new BigInteger(1, oldChecksum).toString(16));
|
||||
|
||||
if (Arrays.equals(oldChecksum, newChecksum)) {
|
||||
Log.d(TAG, "Checksums are the same; won't backup");
|
||||
return;
|
||||
if (Arrays.equals(oldChecksum, newChecksum)) {
|
||||
Log.d(TAG, "Checksums are the same; won't backup");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -736,9 +736,33 @@ public final class DBReader {
|
|||
}
|
||||
|
||||
public static class MonthlyStatisticsItem {
|
||||
public int year = 0;
|
||||
public int month = 0;
|
||||
public long timePlayed = 0;
|
||||
private int year = 0;
|
||||
private int month = 0;
|
||||
private long timePlayed = 0;
|
||||
|
||||
public int getYear() {
|
||||
return year;
|
||||
}
|
||||
|
||||
public void setYear(final int year) {
|
||||
this.year = year;
|
||||
}
|
||||
|
||||
public int getMonth() {
|
||||
return month;
|
||||
}
|
||||
|
||||
public void setMonth(final int month) {
|
||||
this.month = month;
|
||||
}
|
||||
|
||||
public long getTimePlayed() {
|
||||
return timePlayed;
|
||||
}
|
||||
|
||||
public void setTimePlayed(final long timePlayed) {
|
||||
this.timePlayed = timePlayed;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
|
@ -752,9 +776,9 @@ public final class DBReader {
|
|||
int indexTotalDuration = cursor.getColumnIndexOrThrow("total_duration");
|
||||
while (cursor.moveToNext()) {
|
||||
MonthlyStatisticsItem item = new MonthlyStatisticsItem();
|
||||
item.month = Integer.parseInt(cursor.getString(indexMonth));
|
||||
item.year = Integer.parseInt(cursor.getString(indexYear));
|
||||
item.timePlayed = cursor.getLong(indexTotalDuration);
|
||||
item.setMonth(Integer.parseInt(cursor.getString(indexMonth)));
|
||||
item.setYear(Integer.parseInt(cursor.getString(indexYear)));
|
||||
item.setTimePlayed(cursor.getLong(indexTotalDuration));
|
||||
months.add(item);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,8 +57,8 @@ public class NavDrawerData {
|
|||
|
||||
public static class TagDrawerItem extends DrawerItem {
|
||||
public final List<DrawerItem> children = new ArrayList<>();
|
||||
public final String name;
|
||||
public boolean isOpen;
|
||||
private final String name;
|
||||
private boolean isOpen;
|
||||
|
||||
public TagDrawerItem(String name) {
|
||||
// Keep IDs >0 but make room for many feeds
|
||||
|
@ -70,6 +70,14 @@ public class NavDrawerData {
|
|||
return name;
|
||||
}
|
||||
|
||||
public boolean isOpen() {
|
||||
return isOpen;
|
||||
}
|
||||
|
||||
public void setOpen(final boolean open) {
|
||||
isOpen = open;
|
||||
}
|
||||
|
||||
public int getCounter() {
|
||||
int sum = 0;
|
||||
for (DrawerItem item : children) {
|
||||
|
|
|
@ -222,7 +222,7 @@ public class EchoActivity extends AppCompatActivity {
|
|||
long secondsPerDay = queueSecondsLeft / daysUntilNextYear;
|
||||
String timePerDay = Converter.getDurationStringLocalized(
|
||||
getLocalizedResources(this, getEchoLanguage()), secondsPerDay * 1000, true);
|
||||
double hoursPerDay = (double) (secondsPerDay / 3600);
|
||||
double hoursPerDay = secondsPerDay / 3600.0;
|
||||
int nextYear = RELEASE_YEAR + 1;
|
||||
if (hoursPerDay < 1.5) {
|
||||
viewBinding.aboveLabel.setText(R.string.echo_queue_title_clean);
|
||||
|
|
|
@ -12,7 +12,7 @@ import java.nio.charset.Charset;
|
|||
import java.security.MessageDigest;
|
||||
|
||||
public class FastBlurTransformation extends BitmapTransformation {
|
||||
private static final String ID = "de.danoeh.antennapod.core.glide.FastBlurTransformation";
|
||||
private static final String ID = "de.danoeh.antennapod.ui.glide.FastBlurTransformation";
|
||||
|
||||
private static final String TAG = FastBlurTransformation.class.getSimpleName();
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ public class BarChartView extends AppCompatImageView {
|
|||
drawable.data = data;
|
||||
drawable.maxValue = 1;
|
||||
for (DBReader.MonthlyStatisticsItem item : data) {
|
||||
drawable.maxValue = Math.max(drawable.maxValue, item.timePlayed);
|
||||
drawable.maxValue = Math.max(drawable.maxValue, item.getTimePlayed());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -89,21 +89,21 @@ public class BarChartView extends AppCompatImageView {
|
|||
paintBars.setStrokeWidth(height * 0.015f);
|
||||
paintBars.setColor(colors[0]);
|
||||
int colorIndex = 0;
|
||||
int lastYear = data.size() > 0 ? data.get(0).year : 0;
|
||||
int lastYear = data.size() > 0 ? data.get(0).getYear() : 0;
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
float x = textPadding + (i + 1) * stepSize;
|
||||
if (lastYear != data.get(i).year) {
|
||||
lastYear = data.get(i).year;
|
||||
if (lastYear != data.get(i).getYear()) {
|
||||
lastYear = data.get(i).getYear();
|
||||
colorIndex++;
|
||||
paintBars.setColor(colors[colorIndex % 2]);
|
||||
if (i < data.size() - 2) {
|
||||
canvas.drawText(String.valueOf(data.get(i).year), x + stepSize,
|
||||
canvas.drawText(String.valueOf(data.get(i).getYear()), x + stepSize,
|
||||
barHeight + (height - barHeight + textSize) / 2, paintGridText);
|
||||
}
|
||||
canvas.drawLine(x, height, x, barHeight, paintGridText);
|
||||
}
|
||||
|
||||
float valuePercentage = (float) Math.max(0.005, (float) data.get(i).timePlayed / maxValue);
|
||||
float valuePercentage = (float) Math.max(0.005, (float) data.get(i).getTimePlayed() / maxValue);
|
||||
float y = (1 - valuePercentage) * barHeight;
|
||||
canvas.drawRect(x, y, x + stepSize * 0.95f, barHeight, paintBars);
|
||||
}
|
||||
|
|
|
@ -57,41 +57,41 @@ public class YearStatisticsListAdapter extends RecyclerView.Adapter<RecyclerView
|
|||
} else {
|
||||
StatisticsHolder holder = (StatisticsHolder) h;
|
||||
DBReader.MonthlyStatisticsItem statsItem = yearlyAggregate.get(position - 1);
|
||||
holder.year.setText(String.format(Locale.getDefault(), "%d ", statsItem.year));
|
||||
holder.hours.setText(String.format(Locale.getDefault(), "%.1f ", statsItem.timePlayed / 3600000.0f)
|
||||
holder.year.setText(String.format(Locale.getDefault(), "%d ", statsItem.getYear()));
|
||||
holder.hours.setText(String.format(Locale.getDefault(), "%.1f ", statsItem.getTimePlayed() / 3600000.0f)
|
||||
+ context.getString(R.string.time_hours));
|
||||
}
|
||||
}
|
||||
|
||||
public void update(List<DBReader.MonthlyStatisticsItem> statistics) {
|
||||
int lastYear = statistics.size() > 0 ? statistics.get(0).year : 0;
|
||||
int lastDataPoint = statistics.size() > 0 ? (statistics.get(0).month - 1) + lastYear * 12 : 0;
|
||||
int lastYear = statistics.size() > 0 ? statistics.get(0).getYear() : 0;
|
||||
int lastDataPoint = statistics.size() > 0 ? (statistics.get(0).getMonth() - 1) + lastYear * 12 : 0;
|
||||
long yearSum = 0;
|
||||
yearlyAggregate.clear();
|
||||
statisticsData.clear();
|
||||
for (DBReader.MonthlyStatisticsItem statistic : statistics) {
|
||||
if (statistic.year != lastYear) {
|
||||
if (statistic.getYear() != lastYear) {
|
||||
DBReader.MonthlyStatisticsItem yearAggregate = new DBReader.MonthlyStatisticsItem();
|
||||
yearAggregate.year = lastYear;
|
||||
yearAggregate.timePlayed = yearSum;
|
||||
yearAggregate.setYear(lastYear);
|
||||
yearAggregate.setTimePlayed(yearSum);
|
||||
yearlyAggregate.add(yearAggregate);
|
||||
yearSum = 0;
|
||||
lastYear = statistic.year;
|
||||
lastYear = statistic.getYear();
|
||||
}
|
||||
yearSum += statistic.timePlayed;
|
||||
while (lastDataPoint + 1 < (statistic.month - 1) + statistic.year * 12) {
|
||||
yearSum += statistic.getTimePlayed();
|
||||
while (lastDataPoint + 1 < (statistic.getMonth() - 1) + statistic.getYear() * 12) {
|
||||
lastDataPoint++;
|
||||
DBReader.MonthlyStatisticsItem item = new DBReader.MonthlyStatisticsItem();
|
||||
item.year = lastDataPoint / 12;
|
||||
item.month = lastDataPoint % 12 + 1;
|
||||
item.setYear(lastDataPoint / 12);
|
||||
item.setMonth(lastDataPoint % 12 + 1);
|
||||
statisticsData.add(item); // Compensate for months without playback
|
||||
}
|
||||
statisticsData.add(statistic);
|
||||
lastDataPoint = (statistic.month - 1) + statistic.year * 12;
|
||||
lastDataPoint = (statistic.getMonth() - 1) + statistic.getYear() * 12;
|
||||
}
|
||||
DBReader.MonthlyStatisticsItem yearAggregate = new DBReader.MonthlyStatisticsItem();
|
||||
yearAggregate.year = lastYear;
|
||||
yearAggregate.timePlayed = yearSum;
|
||||
yearAggregate.setYear(lastYear);
|
||||
yearAggregate.setTimePlayed(yearSum);
|
||||
yearlyAggregate.add(yearAggregate);
|
||||
Collections.reverse(yearlyAggregate);
|
||||
notifyDataSetChanged();
|
||||
|
|
Loading…
Reference in New Issue