Skip to content

Commit 86908e8

Browse files
committed
minor optimizations and UI improvements
1 parent e25b510 commit 86908e8

26 files changed

+165
-97
lines changed

app/build.gradle

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ android {
77
applicationId "livio.rssreader"
88
minSdkVersion 23
99
targetSdkVersion 35
10-
versionCode 109
11-
versionName "1.0.9"
10+
versionCode 110
11+
versionName "1.0.10"
1212
}
1313

1414
compileOptions {
@@ -20,7 +20,7 @@ android {
2020
release {
2121
shrinkResources true
2222
minifyEnabled true
23-
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
23+
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
2424
}
2525
}
2626
namespace 'livio.rssreader'
@@ -34,7 +34,7 @@ dependencies {
3434
implementation 'androidx.appcompat:appcompat-resources:1.7.0'
3535

3636
implementation 'androidx.cardview:cardview:1.0.0'
37-
implementation 'androidx.recyclerview:recyclerview:1.3.2'
37+
implementation 'androidx.recyclerview:recyclerview:1.4.0'
3838
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
3939
implementation 'androidx.preference:preference:1.2.1'
4040
implementation 'androidx.work:work-runtime:2.10.0'

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
<?xml version="1.0" encoding="utf-8"?>
2-
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
3-
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
43
<uses-permission android:name="android.permission.INTERNET" />
54
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
65
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
76
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!--required to access data written before user uninstalls and reinstalls app-->
87
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
98
<!-- uses-feature android:name="android.software.webview" -->
109
<supports-screens android:largeScreens="true" android:xlargeScreens="true" />
11-
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher"
10+
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher"
1211
android:label="@string/app_name" android:theme="@style/Theme.App" android:supportsRtl="true"
1312
android:usesCleartextTraffic="true" android:requestLegacyExternalStorage="true"
1413
android:dataExtractionRules="@xml/data_extraction_rules"

app/src/main/java/livio/rssreader/ListFeeds.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.io.OutputStream;
1818
import java.util.ArrayList;
1919

20+
import androidx.activity.EdgeToEdge;
2021
import androidx.annotation.NonNull;
2122
import androidx.annotation.Nullable;
2223
import androidx.appcompat.widget.Toolbar;
@@ -30,6 +31,7 @@
3031

3132
import android.content.Intent;
3233
import android.content.SharedPreferences;
34+
import android.os.Build;
3335
import android.os.Bundle;
3436

3537
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
@@ -74,6 +76,9 @@ public final class ListFeeds extends AppCompatActivity implements NewFeedDialog.
7476
@Override
7577
protected void onCreate(Bundle savedInstanceState) {
7678
super.onCreate(savedInstanceState);
79+
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {//zzedge-2-edge
80+
EdgeToEdge.enable(this);//importante: deve essere eseguito prima di setContentView()
81+
}
7782
setContentView(R.layout.frg_listfeeds);
7883

7984
final Toolbar toolbar = findViewById(R.id.toolbar);

app/src/main/java/livio/rssreader/PreferencesFragXML.java

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
import android.content.SharedPreferences;
1717
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
1818
import android.content.res.Resources;
19+
import android.os.Build;
1920
import android.os.Bundle;
2021

22+
import androidx.activity.EdgeToEdge;
2123
import androidx.annotation.NonNull;
2224
import androidx.appcompat.widget.Toolbar;
2325
import androidx.fragment.app.DialogFragment;
@@ -53,6 +55,9 @@ public final class PreferencesFragXML extends AppCompatActivity {
5355
@Override
5456
protected void onCreate(Bundle savedInstanceState) {
5557
super.onCreate(savedInstanceState);
58+
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {//zzedge-2-edge
59+
EdgeToEdge.enable(this);//importante: deve essere eseguito prima di setContentView()
60+
}
5661
setContentView(R.layout.showpreferences);
5762
if (savedInstanceState == null) {
5863
getSupportFragmentManager()
@@ -79,22 +84,6 @@ public boolean onOptionsItemSelected(MenuItem item) {
7984
return super.onOptionsItemSelected(item);
8085
}
8186

82-
/* zztabletlandscape: questo codice è alternativo al codice onCreateView
83-
// nota: viene ridotta solo la larghezza sia dell'action bar che del contenuto della finestra sui tablet in modalità landscape
84-
@Override
85-
public void onStart() {//14-11-2022: narrow panel in case of table in landscape mode
86-
super.onStart();
87-
// Log.d("onStart", "onStart");
88-
if (!tools.FormFactorUtils.isRunningOnWindows()) {//28-01-2023: check that we are not running on windows to avoid weird behavior
89-
Resources resources = getResources();
90-
if (resources.getBoolean(R.bool.is_tablet_landscape)) {//isTablet && isLandscape
91-
// int dialogHeight = (int) (getResources().getDisplayMetrics().heightPixels * 0.6);
92-
int dialogWidth = (int) (resources.getDisplayMetrics().widthPixels * 0.6);
93-
getWindow().setLayout(dialogWidth, WindowManager.LayoutParams.MATCH_PARENT);
94-
}
95-
}
96-
}
97-
*/
9887
public static class PrefsFragment extends PreferenceFragmentCompat implements OnSharedPreferenceChangeListener{
9988

10089
@Override
@@ -107,8 +96,6 @@ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
10796
setFontSizeSummary();//twin
10897
}
10998

110-
// zztabletlandscape: questo codice è alternativo al codice onStart
111-
// nota: viene ridotta solo la larghezza del contenuto della finestra sui tablet in modalità landscape
11299
@NonNull
113100
@Override
114101
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,

app/src/main/java/livio/rssreader/RSSReader.java

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
import com.google.android.material.floatingactionbutton.FloatingActionButton;
7070
import com.google.android.material.snackbar.Snackbar;
7171

72+
import androidx.activity.EdgeToEdge;
7273
import androidx.annotation.NonNull;
7374
import androidx.appcompat.app.AlertDialog;
7475
import androidx.appcompat.app.AppCompatDialogFragment;
@@ -232,6 +233,9 @@ public void onCreate(Bundle savedInstanceState) {
232233
super.onCreate(savedInstanceState);
233234
if (BuildConfig.DEBUG)
234235
Log.d(tag, "onCreate");
236+
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {//zzedge-2-edge
237+
EdgeToEdge.enable(this);//importante: deve essere eseguito prima di setContentView()
238+
}
235239

236240
setContentView(R.layout.main);
237241

@@ -472,26 +476,27 @@ public boolean onOptionsItemSelected(MenuItem item) {
472476
RSSFeed feed = (RSSFeed) is.readObject();
473477
if ((feed != null) && mTts.checkTTS(feed.getLanguage(pref_lang))) {
474478
List<RSSItem> items = feed.getAllItems();
475-
String[] segments = new String[items.size()];
476-
int k = 0;
477-
boolean smart_titles = prefs.getBoolean(PREF_SMART_TITLES, false);
478-
for (RSSItem ritem : items) {
479-
segments[k++] = ritem.getTitle(smart_titles);
480-
}
481-
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
479+
if (!items.isEmpty()) {
480+
String[] segments = new String[items.size()];
481+
int k = 0;
482+
boolean smart_titles = prefs.getBoolean(PREF_SMART_TITLES, false);
483+
for (RSSItem ritem : items) {
484+
segments[k++] = ritem.getTitle(smart_titles);
485+
}
486+
AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
482487
// Request audio focus for playback
483-
if (am != null) {
484-
int result = am.requestAudioFocus(this,
485-
AudioManager.STREAM_MUSIC,// Use the music stream.
486-
AudioManager.AUDIOFOCUS_GAIN);// Request permanent focus.
488+
if (am != null) {
489+
int result = am.requestAudioFocus(this,
490+
AudioManager.STREAM_MUSIC,// Use the music stream.
491+
AudioManager.AUDIOFOCUS_GAIN);// Request permanent focus.
487492

488-
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
489-
// Start playback.
493+
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
494+
// Start playback.
495+
}
490496
}
497+
if (mTts.speakSegments(segments))
498+
item.setIcon(R.drawable.ic_stop_white_36dp);//play
491499
}
492-
if (mTts.speakSegments(segments))
493-
item.setIcon(R.drawable.ic_stop_white_36dp);//play
494-
495500
}
496501
} catch (IOException e) {
497502
//do nothing

app/src/main/java/livio/rssreader/SelectCategory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.ArrayList;
1616

1717

18+
import androidx.activity.EdgeToEdge;
1819
import androidx.appcompat.app.ActionBar;
1920
import androidx.appcompat.widget.Toolbar;
2021
import livio.rssreader.backend.FeedsDB;
@@ -25,6 +26,7 @@
2526
import tools.FormFactorUtils;
2627

2728
import android.content.SharedPreferences;
29+
import android.os.Build;
2830
import android.util.Log;
2931
import android.view.Menu;
3032
import android.view.MenuItem;
@@ -53,6 +55,9 @@ public final class SelectCategory extends AppCompatActivity implements OnItemCli
5355
public void onCreate(Bundle savedInstanceState) {
5456
super.onCreate(savedInstanceState);
5557
Log.i(tag,"onCreate");
58+
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {//zzedge-2-edge
59+
EdgeToEdge.enable(this);//importante: deve essere eseguito prima di setContentView()
60+
}
5661
setContentView(R.layout.categories);
5762

5863
SharedPreferences prefs = androidx.preference.PreferenceManager.getDefaultSharedPreferences(this);

app/src/main/java/livio/rssreader/ShowHelp.java

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
import android.content.Intent;
77
import android.content.res.Resources;
88
import android.net.Uri;
9+
import android.os.Build;
910
import android.os.Bundle;
1011

12+
import androidx.activity.EdgeToEdge;
1113
import androidx.annotation.NonNull;
1214
import androidx.appcompat.app.AppCompatDialogFragment;
1315
import androidx.appcompat.widget.Toolbar;
@@ -18,6 +20,7 @@
1820
import tools.FormFactorUtils;
1921

2022
import android.util.Log;
23+
import android.view.KeyEvent;
2124
import android.view.LayoutInflater;
2225
import android.view.Menu;
2326
import android.view.MenuItem;
@@ -90,6 +93,9 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {
9093
public void onCreate(Bundle savedInstanceState) {
9194
super.onCreate(savedInstanceState);
9295
Log.i(tag, "onCreate");
96+
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {//zzedge-2-edge
97+
EdgeToEdge.enable(this);//importante: deve essere eseguito prima di setContentView()
98+
}
9399

94100
setContentView(R.layout.showhelp);
95101

@@ -288,6 +294,23 @@ private void movepage(boolean up) {
288294
}
289295
}
290296

297+
public boolean dispatchKeyEvent(KeyEvent event) {//15-02-2025, added DPAD support
298+
if (event.getAction() == KeyEvent.ACTION_DOWN) {
299+
int keyCode = event.getKeyCode();
300+
switch (keyCode) {
301+
case KeyEvent.KEYCODE_DPAD_LEFT:
302+
backpage();
303+
return true;
304+
case KeyEvent.KEYCODE_DPAD_RIGHT:
305+
fwdpage();
306+
return true;
307+
default:
308+
// Log.d(tag, "key:" + keyCode);
309+
}
310+
}
311+
return super.dispatchKeyEvent(event);
312+
}
313+
291314
// http://developer.android.com/reference/android/support/v4/view/PagerAdapter.html
292315
class SmartPager extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
293316
final ViewPager2 viewPager;
@@ -483,8 +506,9 @@ boolean overrideUrlLoading(String url) {
483506
Intent myIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
484507
try {
485508
startActivity(myIntent);
486-
} catch (ActivityNotFoundException e) {
487-
Log.d(tag, "ActivityNotFoundException: "+e.getMessage());
509+
} catch (ActivityNotFoundException | SecurityException e) {
510+
Log.d(tag, "Exception: " + e.getMessage());
511+
return false;//proceed online using the original link
488512
}
489513
return true;
490514
} else if (url.startsWith(HELP_SCHEME)) {//zzhelp, help screen

app/src/main/java/livio/rssreader/ShowItem.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
import android.content.Context;
1616
import android.media.AudioManager;
1717
import android.net.Uri;
18+
import android.os.Build;
1819
import android.speech.tts.UtteranceProgressListener;
1920

21+
import androidx.activity.EdgeToEdge;
2022
import androidx.annotation.NonNull;
2123
import androidx.appcompat.widget.Toolbar;
2224
import androidx.recyclerview.widget.RecyclerView;
@@ -25,6 +27,7 @@
2527
import androidx.appcompat.app.AppCompatActivity;
2628
import android.text.Html;
2729
import android.util.Log;
30+
import android.view.KeyEvent;
2831
import android.view.Menu;
2932
import android.view.MenuInflater;
3033
import android.view.MenuItem;
@@ -86,6 +89,9 @@ protected void onSaveInstanceState(@NonNull Bundle outState) {
8689
public void onCreate(Bundle savedInstanceState) {
8790
super.onCreate(savedInstanceState);
8891
Log.i(tag, "onCreate");
92+
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM) {//zzedge-2-edge
93+
EdgeToEdge.enable(this);//importante: deve essere eseguito prima di setContentView()
94+
}
8995

9096
setContentView(R.layout.showitem);
9197

@@ -306,7 +312,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
306312
}
307313

308314
String[] segments = RSSReader.cleanupContent(content, true).split("\n+");
309-
if (mTts.speakSegments(segments))
315+
if ((segments.length > 0) && mTts.speakSegments(segments))
310316
item.setIcon(R.drawable.ic_stop_white_36dp);//play
311317
}
312318
}
@@ -361,6 +367,23 @@ private void movepage(boolean up) {
361367
invalidateOptionsMenu();
362368
}
363369

370+
public boolean dispatchKeyEvent(KeyEvent event) {//15-02-2025, added DPAD support
371+
if (event.getAction() == KeyEvent.ACTION_DOWN) {
372+
int keyCode = event.getKeyCode();
373+
switch (keyCode) {
374+
case KeyEvent.KEYCODE_DPAD_LEFT:
375+
backpage();
376+
return true;
377+
case KeyEvent.KEYCODE_DPAD_RIGHT:
378+
fwdpage();
379+
return true;
380+
default:
381+
// Log.d(tag, "key:" + keyCode);
382+
}
383+
}
384+
return super.dispatchKeyEvent(event);
385+
}
386+
364387
public class WebViewPlus extends WebView { // extended web view
365388
String _msg;
366389
final String style;

app/src/main/java/livio/rssreader/backend/FeedsDB.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,7 @@ public synchronized static FeedsDB getInstance() {
658658
{"Entrepreneur", "http://feeds.feedburner.com/entrepreneur/latest", "t199.en"},
659659
{"Fast Company", "http://feeds.feedburner.com/fastcompany/headlines", "t200.en"},
660660
{"MacRumors", "http://www.macrumors.com/macrumors.xml", "t202.en"},
661+
{"Tom's Hardware", "https://www.tomshardware.com/feeds/all", "t203.en"},
661662
},
662663
},
663664
{//it
@@ -796,6 +797,7 @@ public synchronized static FeedsDB getInstance() {
796797
{"IlSoftware.it", "http://www.ilsoftware.it/rss.asp", "t326.it"},
797798
{"Macity", "http://www.macitynet.it/macity/rss.xml", "t327.it"},
798799
{"Motoricerca", "http://feeds.feedburner.com/motoricerca", "t328.it"},
800+
{"Tom's Hardware", "https://www.tomshw.it/feed", "t329.it"},
799801
},
800802
},
801803
{//fr
@@ -906,6 +908,7 @@ public synchronized static FeedsDB getInstance() {
906908
{"Next INpact – Actualités", "https://www.pcinpact.com/include/news.xml", "t554.fr"},
907909
{"TechCrunch", "http://feeds.feedburner.com/francaistechcrunch", "t555.fr"},
908910
{"Ubergizmo", "http://www.ubergizmo.com/fr/index.xml", "t556.fr"},
911+
{"Tom's Hardware", "https://www.tomshardware.fr/feed", "t557.fr"},
909912
},
910913
},
911914
{//es

app/src/main/java/livio/rssreader/backend/RSSFeed.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,9 @@ else if ((xml = st.indexOf("<feed")) != -1) { //check basic feed ?
356356
case "content:encoded":
357357
item.setDescription(Entities.XML.unescape(content));
358358
break;
359+
case "summary":
360+
item.setDescription(content.toString());
361+
break;
359362
case "category":
360363
item.setCategory(content.toString());
361364
break;

0 commit comments

Comments
 (0)