diff --git a/app/build.gradle b/app/build.gradle
index e6f4102dd..305a46b46 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -2,18 +2,18 @@ apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
- compileSdkVersion 28
+ compileSdkVersion 29
defaultConfig {
applicationId "fr.gaulupeau.apps.InThePoche"
- minSdkVersion 21
- targetSdkVersion 28
+ minSdkVersion 24
+ targetSdkVersion 29
versionCode 215
versionName "2.3.0-beta.1"
javaCompileOptions {
annotationProcessorOptions {
- arguments = [ eventBusIndex : 'fr.gaulupeau.apps.Poche.EventBusIndex' ]
+ arguments = [eventBusIndex: 'fr.gaulupeau.apps.Poche.EventBusIndex']
}
}
}
@@ -33,8 +33,9 @@ android {
buildTypes {
release {
- minifyEnabled false
+ minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ multiDexEnabled = true
}
debug {
applicationIdSuffix '.debug'
@@ -50,6 +51,7 @@ android {
}
}
}
+ buildToolsVersion = '29.0.2'
}
greendao {
@@ -58,10 +60,11 @@ greendao {
}
dependencies {
- implementation 'androidx.appcompat:appcompat:1.0.2'
+ implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
- implementation 'androidx.recyclerview:recyclerview:1.0.0'
- implementation 'com.google.android.material:material:1.0.0'
+ implementation 'androidx.recyclerview:recyclerview:1.1.0-beta03'
+ implementation 'androidx.preference:preference:1.1.0-rc01'
+ implementation 'com.google.android.material:material:1.1.0-alpha09'
implementation 'org.greenrobot:eventbus:3.1.1'
implementation 'org.greenrobot:greendao:3.2.2'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index ed2c3ddaf..57b5f99a2 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,43 +1,47 @@
-
-
-
-
-
-
+ xmlns:tools="http://schemas.android.com/tools"
+ package="fr.gaulupeau.apps.InThePoche"
+ android:installLocation="auto">
+ android:theme="@style/MyTheme.DayNight">
+ android:name="fr.gaulupeau.apps.Poche.ui.preferences.SettingsActivity"
+ android:label="@string/title_activity_settings"
+ android:parentActivityName="fr.gaulupeau.apps.Poche.ui.MainActivity"
+ android:theme="@style/MyTheme.DayNight">
+
+
+
-
-
+
+
-
+
-
+
+
-
+ android:hardwareAccelerated="true"
+ android:theme="@style/MyTheme.DayNight"/>
+
+ android:theme="@style/MyTheme.DayNight">
@@ -52,7 +56,7 @@
android:enabled="false"
android:excludeFromRecents="true"
android:noHistory="true"
- android:theme="@style/ProxyTheme">
+ android:theme="@style/MyTheme.DayNight">
@@ -76,37 +80,40 @@
-
-
+
+
-
-
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
@@ -120,8 +127,9 @@
android:name="fr.gaulupeau.apps.Poche.network.ConnectivityChangeReceiver"
android:enabled="false">
-
+
+
+
+
+
+
-
+ android:exported="true"
+ android:permission="android.permission.BIND_JOB_SERVICE" />
-
-
-
-
-
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/app/src/main/assets/fonts/librefranklin_400.ttf b/app/src/main/assets/fonts/librefranklin_400.ttf
new file mode 100644
index 000000000..0bc602450
Binary files /dev/null and b/app/src/main/assets/fonts/librefranklin_400.ttf differ
diff --git a/app/src/main/assets/fonts/merriweather_400.ttf b/app/src/main/assets/fonts/merriweather_400.ttf
new file mode 100644
index 000000000..18da9e5b0
Binary files /dev/null and b/app/src/main/assets/fonts/merriweather_400.ttf differ
diff --git a/app/src/main/assets/ic_web.svg b/app/src/main/assets/ic_web.svg
new file mode 100644
index 000000000..16b04e8fe
--- /dev/null
+++ b/app/src/main/assets/ic_web.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/src/main/assets/main.css b/app/src/main/assets/main.css
index 7d9a0b873..0da81f282 100755
--- a/app/src/main/assets/main.css
+++ b/app/src/main/assets/main.css
@@ -15,7 +15,7 @@ html {
}
body {
- background: #EEE;
+ background: #FFF;
}
.high-contrast {
@@ -43,24 +43,19 @@ body {
background: #000;
}
-h2, h3, h4 {
- font-family: 'PT Sans', sans-serif;
- text-transform: uppercase;
-}
-
p, li {
color: #666;
}
table {
- border-collapse: collapse;
+ border-collapse: collapse;align
width: 100%;
}
table, th, td {
border:1px solid #999;
padding: 0.25em;
- text-align: left;
+ text-align: start;
}
.high-contrast p,
@@ -102,7 +97,7 @@ h2:after {
top: 0;
width: 10em;
left: 0;
- text-align: right;
+ text-align: end;
background: #333;
padding-top: 9.5em;
height: 100%;
@@ -176,7 +171,7 @@ h2:after {
}
footer {
- text-align: right;
+ text-align: end;
position: relative;
bottom: 0;
right: 5em;
@@ -195,14 +190,16 @@ footer a {
5 = Article
========================================================================== */
+
header.mbm {
- text-align: left;
+ text-align: start;
}
#article {
width: 70%;
/* margin-bottom: 3em; */
word-wrap: break-word;
+ font: normal regular 1em/1.5 'Merriweather', serif;
}
#article .tags {
@@ -223,7 +220,7 @@ header.mbm {
#article pre {
font-family: monospace;
white-space: pre;
- text-justify: none;
+ text-justify: start;
}
.pre-overflow #article pre {
@@ -246,6 +243,55 @@ header.mbm {
content: none;
}
+.no-bottom-margin {
+ margin-bottom:0px;
+}
+
+@font-face {
+ font-family: 'Libre Franklin';
+ src: url('file:///android_asset/fonts/librefranklin_400.ttf');
+}
+@font-face {
+ font-family: 'Merriweather';
+ src: url('file:///android_asset/fonts/merriweather_400.ttf');
+}
+
+
+h1{
+ font-size: 3rem;
+ line-height: 3.125rem;
+ font-family: 'Merriweather', serif;
+ font-style: italic;
+ font-weight: 900;
+}
+h2 {
+ font-size: 2.125rem;
+ line-height: 2.5rem;
+ font-family: 'Libre Franklin', sans-serif;
+}
+h3 {
+ font-size: 1.5rem;
+ line-height: 2rem;
+ font-family: 'Libre Franklin', sans-serif;
+}
+h4 {
+ font-size: 1.25rem;
+ line-height: 2rem;
+ font-family: 'Merriweather', serif;
+ font-style: italic;
+}
+p {
+ font-size: 1rem;
+ line-height: 1.5rem;
+ font-family: 'Merriweather', serif;
+}
+.caption {
+ font-size: .75rem;
+ line-height: 1.25rem;
+ font-family: 'Libre Franklin', sans-serif;
+ margin-bottom:0px;
+}
+
/* ==========================================================================
6 = Media Queries
========================================================================== */
@@ -287,8 +333,7 @@ header.mbm {
width: 100%;
}
- #article h1 {
- font-size: 1.2em;
+ #article h2 {
margin-bottom:0px;
}
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/data/Settings.java b/app/src/main/java/fr/gaulupeau/apps/Poche/data/Settings.java
index 56b7241d3..b21bee483 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/data/Settings.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/data/Settings.java
@@ -6,7 +6,7 @@
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Build;
-import android.preference.PreferenceManager;
+import androidx.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/data/TagListAdapter.java b/app/src/main/java/fr/gaulupeau/apps/Poche/data/TagListAdapter.java
index a9551f49d..f90df57a9 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/data/TagListAdapter.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/data/TagListAdapter.java
@@ -8,6 +8,8 @@
import android.widget.ImageButton;
import android.widget.TextView;
+import com.google.android.material.button.MaterialButton;
+
import java.util.List;
import fr.gaulupeau.apps.InThePoche.R;
@@ -56,7 +58,7 @@ public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickL
OnItemButtonClickListener buttonClickListener;
TextView label;
- ImageButton button;
+ MaterialButton button;
public ViewHolder(View itemView, OnItemClickListener listener,
OnItemButtonClickListener buttonClickListener) {
@@ -69,7 +71,7 @@ public ViewHolder(View itemView, OnItemClickListener listener,
itemView.setOnClickListener(this);
- button = (ImageButton)itemView.findViewById(R.id.tag_remove_button);
+ button = (MaterialButton)itemView.findViewById(R.id.tag_remove_button);
if(button != null) {
button.setOnClickListener(this);
}
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/events/EventProcessor.java b/app/src/main/java/fr/gaulupeau/apps/Poche/events/EventProcessor.java
index 0bf13d296..8ba91bc19 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/events/EventProcessor.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/events/EventProcessor.java
@@ -175,7 +175,7 @@ public void onUpdateArticlesStartedEvent(UpdateArticlesStartedEvent event) {
detailedMessage = prependAppName(detailedMessage);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, CHANNEL_ID_SYNC)
- .setSmallIcon(R.drawable.ic_action_refresh)
+ .setSmallIcon(R.drawable.ic_refresh_24dp)
.setContentTitle(context.getString(R.string.notification_updatingArticles))
.setContentText(detailedMessage)
.setOngoing(true);
@@ -215,7 +215,7 @@ public void onSweepDeletedArticlesStartedEvent(SweepDeletedArticlesStartedEvent
Context context = getContext();
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, CHANNEL_ID_SYNC)
- .setSmallIcon(R.drawable.ic_action_refresh)
+ .setSmallIcon(R.drawable.ic_refresh_24dp)
.setContentTitle(context.getString(R.string.notification_sweepingDeletedArticles))
.setOngoing(true);
@@ -259,7 +259,7 @@ public void onFetchImagesProgressEvent(FetchImagesProgressEvent event) {
Context context = getContext();
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, CHANNEL_ID_SYNC)
- .setSmallIcon(R.drawable.ic_action_refresh)
+ .setSmallIcon(R.drawable.ic_refresh_24dp)
.setContentTitle(context.getString(R.string.notification_downloadingImages))
.setOngoing(true);
@@ -313,7 +313,7 @@ public void onSyncQueueProgressEvent(SyncQueueProgressEvent event) {
Context context = getContext();
notificationBuilder = new NotificationCompat.Builder(context, CHANNEL_ID_SYNC)
- .setSmallIcon(R.drawable.ic_action_refresh)
+ .setSmallIcon(R.drawable.ic_refresh_24dp)
.setContentTitle(getContext().getString(R.string.notification_syncingQueue))
.setOngoing(true);
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java
index 1230fd64e..ffd308500 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/TtsFragment.java
@@ -19,6 +19,7 @@
import android.speech.tts.TextToSpeech;
import androidx.annotation.NonNull;
import androidx.annotation.StringRes;
+import androidx.core.widget.NestedScrollView;
import androidx.fragment.app.Fragment;
import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.PlaybackStateCompat;
@@ -30,9 +31,9 @@
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
+import android.widget.AutoCompleteTextView;
import android.widget.CheckBox;
import android.widget.CompoundButton;
-import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.SeekBar;
@@ -40,6 +41,8 @@
import android.widget.TextView;
import android.widget.Toast;
+import com.google.android.material.button.MaterialButton;
+
import fr.gaulupeau.apps.InThePoche.R;
import fr.gaulupeau.apps.Poche.App;
import fr.gaulupeau.apps.Poche.data.Settings;
@@ -62,7 +65,7 @@ public class TtsFragment
private WebViewText webViewText;
private Settings settings;
private View viewTTSOption;
- private ImageButton btnTTSPlayStop;
+ private MaterialButton btnTTSPlayStop;
private SeekBar seekBarTTSSpeed;
private SeekBar seekBarTTSPitch;
private SeekBar seekBarTTSVolume;
@@ -71,8 +74,8 @@ public class TtsFragment
private TextView textViewTTSPitch;
private TextView textViewTTSVolume;
private TextView textViewTTSSleep;
- private Spinner spinnerLanguage;
- private Spinner spinnerVoice;
+ private AutoCompleteTextView spinnerLanguage;
+ private AutoCompleteTextView spinnerVoice;
private ArrayAdapter spinnerLanguageAdapter;
private ArrayAdapter spinnerVoiceAdapter;
@@ -178,7 +181,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
if(!this.settings.isTtsOptionsVisible()) {
this.viewTTSOption.setVisibility(View.GONE);
}
- this.btnTTSPlayStop = ((ImageButton) view.findViewById(R.id.btnTTSPlayPause));
+ this.btnTTSPlayStop = ((MaterialButton) view.findViewById(R.id.btnTTSPlayPause));
this.btnTTSPlayStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -188,7 +191,7 @@ public void onClick(View v) {
}
});
- ImageButton btnTTSFastRewind = (ImageButton) view.findViewById(R.id.btnTTSFastRewind);
+ MaterialButton btnTTSFastRewind = (MaterialButton) view.findViewById(R.id.btnTTSFastRewind);
btnTTSFastRewind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -198,7 +201,7 @@ public void onClick(View v) {
}
});
- ImageButton btnTTSFastForward = (ImageButton) view.findViewById(R.id.btnTTSFastForward);
+ MaterialButton btnTTSFastForward = (MaterialButton) view.findViewById(R.id.btnTTSFastForward);
btnTTSFastForward.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -209,11 +212,11 @@ public void onClick(View v) {
});
- ImageButton btnTTSOptions = (ImageButton) view.findViewById(R.id.btnTTSOptions);
+ MaterialButton btnTTSOptions = (MaterialButton) view.findViewById(R.id.btnTTSOptions);
btnTTSOptions.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
- onTTSOptionsClicked((ImageButton) v);
+ onTTSOptionsClicked((MaterialButton) v);
}
});
@@ -353,13 +356,13 @@ public void onStopTrackingTouch(SeekBar seekBar) {
}
});
- spinnerLanguage = (Spinner) view.findViewById(R.id.spinnerLanguage);
+ spinnerLanguage = (AutoCompleteTextView) view.findViewById(R.id.spinnerLanguage);
spinnerLanguageAdapter = new ArrayAdapter(this.getContext(),
android.R.layout.simple_spinner_item, new ArrayList());
spinnerLanguageAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinnerLanguage.setAdapter(spinnerLanguageAdapter);
- spinnerVoice = (Spinner) view.findViewById(R.id.spinnerVoice);
+ spinnerVoice = (AutoCompleteTextView) view.findViewById(R.id.spinnerVoice);
spinnerVoiceAdapter = new ArrayAdapter(this.getContext(),
android.R.layout.simple_spinner_item, new ArrayList());
spinnerVoiceAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
@@ -388,13 +391,13 @@ public void onNothingSelected(AdapterView> parentView) {}
public void onPlaybackStateChanged(PlaybackStateCompat state) {
switch (state.getState()) {
case PlaybackStateCompat.STATE_BUFFERING:
- btnTTSPlayStop.setImageResource(R.drawable.ic_more_horiz_24dp);
+ btnTTSPlayStop.setIconResource(R.drawable.ic_more_horiz_24dp);
break;
case PlaybackStateCompat.STATE_PLAYING:
- btnTTSPlayStop.setImageResource(R.drawable.ic_stop_24dp);
+ btnTTSPlayStop.setIconResource(R.drawable.ic_stop_24dp);
break;
case PlaybackStateCompat.STATE_PAUSED:
- btnTTSPlayStop.setImageResource(R.drawable.ic_play_arrow_24dp);
+ btnTTSPlayStop.setIconResource(R.drawable.ic_play_arrow_24dp);
break;
case PlaybackStateCompat.STATE_STOPPED:
//Log.d(LOG_TAG, "onPlaybackStateChanged: STATE_STOPPED");
@@ -507,7 +510,7 @@ private float getPitchBarValue() {
}
- private void onTTSOptionsClicked(ImageButton btn) {
+ private void onTTSOptionsClicked(MaterialButton btn) {
if (viewTTSOption.getVisibility() == View.VISIBLE) {
viewTTSOption.setVisibility(View.GONE);
} else {
@@ -538,7 +541,7 @@ public void onDocumentLoadStart(String domain, String title, String language) {
this.selectLanguage(language);
}
- public void onDocumentLoadFinished(WebView webView, ScrollView scrollView) {
+ public void onDocumentLoadFinished(WebView webView, NestedScrollView scrollView) {
//Log.d(LOG_TAG, "onDocumentLoadFinished");
if (webViewText == null) {
if (readArticleActivity == null) {
@@ -788,14 +791,13 @@ private void onLanguageSelectionChanged() {
//Log.d(LOG_TAG, "onLanguageSelectionChanged");
spinnerVoiceAdapter.setNotifyOnChange(false);
spinnerVoiceAdapter.clear();
- int languagePosition = spinnerLanguage.getSelectedItemPosition();
- String language = ttsLanguages.get(languagePosition).name;
+ String language = spinnerLanguage.getText().toString();
String languageVoicePreference = settings.getTtsLanguageVoice(language);
int voicePositionToSelect = 0;
for (VoiceInfo voiceInfo : ttsVoiceByLanguage.get(language)) {
spinnerVoiceAdapter.add(voiceInfo.displayName);
if (voiceInfo.displayName.equals(languageVoicePreference)) {
- voicePositionToSelect = spinnerVoiceAdapter.getCount() - 1;
+ voicePositionToSelect = spinnerVoiceAdapter.getCount() - 1;
}
}
spinnerVoice.setSelection(voicePositionToSelect);
@@ -806,10 +808,19 @@ private void onLanguageSelectionChanged() {
private void onVoiceSelectionChanged() {
//Log.d(LOG_TAG, "onVoiceSelectionChanged");
- int voicePosition = spinnerVoice.getSelectedItemPosition();
- int languagePosition = spinnerLanguage.getSelectedItemPosition();
- if ((voicePosition >=0) && (languagePosition >=0)) {
- String language = ttsLanguages.get(languagePosition).name;
+ String languageVoicePreference = spinnerVoice.getText().toString();
+ String language = spinnerLanguage.getText().toString();
+ int voicePosition = 0;
+
+ for (VoiceInfo voiceInfo : ttsVoiceByLanguage.get(language)) {
+ spinnerVoiceAdapter.add(voiceInfo.displayName);
+ if (voiceInfo.displayName.equals(languageVoicePreference)) {
+ break;
+ } else {
+ voicePosition += 1;
+ }
+ }
+ if ((voicePosition >=0) && (!language.isEmpty())) {
VoiceInfo voiceInfo = ttsVoiceByLanguage.get(language).get(voicePosition);
if (voiceInfo != null) {
if (ttsService != null) {
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java
index 6b9e9789d..b7f252c39 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/tts/WebViewText.java
@@ -4,7 +4,7 @@
import android.util.Log;
import android.webkit.ConsoleMessage;
import android.webkit.WebView;
-import android.widget.ScrollView;
+import androidx.core.widget.NestedScrollView;
import java.util.Vector;
@@ -17,7 +17,7 @@ public class WebViewText implements TextInterface {
ReadArticleActivity readArticleActivity;
private final WebView webView;
- private final ScrollView scrollView;
+ private final NestedScrollView scrollView;
private final Handler handler;
private final Vector textList = new Vector<>();
@@ -81,7 +81,7 @@ public class WebViewText implements TextInterface {
private static final String LOG_TAG = "WebViewText";
- public WebViewText(WebView webView, ScrollView scrollView, ReadArticleActivity readArticleActivity) {
+ public WebViewText(WebView webView, NestedScrollView scrollView, ReadArticleActivity readArticleActivity) {
this.webView = webView;
this.scrollView = scrollView;
this.readArticleActivity = readArticleActivity;
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListsFragment.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListsFragment.java
index e2e6133ce..363d07dde 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListsFragment.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ArticleListsFragment.java
@@ -30,20 +30,15 @@ public class ArticleListsFragment extends Fragment implements Sortable, Searchab
private static final String STATE_SEARCH_QUERY = "search_query";
private static final EnumSet CHANGE_SET = EnumSet.of(
- ArticlesChangedEvent.ChangeType.UNSPECIFIED,
- ArticlesChangedEvent.ChangeType.ADDED,
- ArticlesChangedEvent.ChangeType.DELETED,
- ArticlesChangedEvent.ChangeType.FAVORITED,
- ArticlesChangedEvent.ChangeType.UNFAVORITED,
- ArticlesChangedEvent.ChangeType.ARCHIVED,
- ArticlesChangedEvent.ChangeType.UNARCHIVED,
- ArticlesChangedEvent.ChangeType.CREATED_DATE_CHANGED,
- ArticlesChangedEvent.ChangeType.TITLE_CHANGED,
- ArticlesChangedEvent.ChangeType.DOMAIN_CHANGED,
+ ArticlesChangedEvent.ChangeType.UNSPECIFIED, ArticlesChangedEvent.ChangeType.ADDED,
+ ArticlesChangedEvent.ChangeType.DELETED, ArticlesChangedEvent.ChangeType.FAVORITED,
+ ArticlesChangedEvent.ChangeType.UNFAVORITED, ArticlesChangedEvent.ChangeType.ARCHIVED,
+ ArticlesChangedEvent.ChangeType.UNARCHIVED, ArticlesChangedEvent.ChangeType.CREATED_DATE_CHANGED,
+ ArticlesChangedEvent.ChangeType.TITLE_CHANGED, ArticlesChangedEvent.ChangeType.DOMAIN_CHANGED,
ArticlesChangedEvent.ChangeType.ESTIMATED_READING_TIME_CHANGED);
- private static final EnumSet CHANGE_SET_FORCE_CONTENT_UPDATE
- = EnumSet.of(ArticlesChangedEvent.ChangeType.ESTIMATED_READING_TIME_CHANGED);
+ private static final EnumSet CHANGE_SET_FORCE_CONTENT_UPDATE = EnumSet
+ .of(ArticlesChangedEvent.ChangeType.ESTIMATED_READING_TIME_CHANGED);
private ArticleListsPagerAdapter adapter;
private ViewPager viewPager;
@@ -63,44 +58,46 @@ public static ArticleListsFragment newInstance(String tag) {
private String tag;
- public ArticleListsFragment() {}
+ public ArticleListsFragment() {
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- if(getArguments() != null) {
+ if (getArguments() != null) {
tag = getArguments().getString(PARAM_TAG);
}
- if(savedInstanceState != null) {
+ if (savedInstanceState != null) {
Log.v(TAG, "onCreate() restoring state");
- if(sortOrder == null) {
+ if (sortOrder == null) {
sortOrder = Sortable.SortOrder.values()[savedInstanceState.getInt(STATE_SORT_ORDER)];
}
- if(searchQuery == null) {
+ if (searchQuery == null) {
searchQuery = savedInstanceState.getString(STATE_SEARCH_QUERY);
}
}
- if(sortOrder == null) sortOrder = SortOrder.DESC;
+ if (sortOrder == null)
+ sortOrder = SortOrder.DESC;
}
@Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
+ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_article_lists, container, false);
adapter = new ArticleListsPagerAdapter(getChildFragmentManager(), tag);
getChildFragmentManager().registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
@Override
- public void onFragmentCreated(@NonNull FragmentManager fm, @NonNull Fragment f, @Nullable Bundle savedInstanceState) {
+ public void onFragmentCreated(@NonNull FragmentManager fm, @NonNull Fragment f,
+ @Nullable Bundle savedInstanceState) {
if (f instanceof ArticleListFragment)
setParametersToFragment((ArticleListFragment) f);
}
}, false);
- viewPager = (ViewPager)view.findViewById(R.id.articles_list_pager);
+ viewPager = (ViewPager) view.findViewById(R.id.articles_list_pager);
viewPager.setAdapter(adapter);
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
@@ -111,7 +108,7 @@ public void onPageSelected(int position) {
}
});
- TabLayout tabLayout = (TabLayout)view.findViewById(R.id.articles_list_tab_layout);
+ TabLayout tabLayout = (TabLayout) view.findViewById(R.id.articles_list_tab_layout);
tabLayout.setupWithViewPager(viewPager);
viewPager.setCurrentItem(1);
@@ -125,8 +122,10 @@ public void onSaveInstanceState(Bundle outState) {
Log.v(TAG, "onSaveInstanceState()");
- if(sortOrder != null) outState.putInt(STATE_SORT_ORDER, sortOrder.ordinal());
- if(searchQuery != null) outState.putString(STATE_SEARCH_QUERY, searchQuery);
+ if (sortOrder != null)
+ outState.putInt(STATE_SORT_ORDER, sortOrder.ordinal());
+ if (searchQuery != null)
+ outState.putString(STATE_SEARCH_QUERY, searchQuery);
}
@Override
@@ -151,24 +150,25 @@ public void onFeedsChangedEvent(FeedsChangedEvent event) {
private void setParametersToFragment(ArticleListFragment fragment) {
Log.v(TAG, "setParametersToFragment() started");
- if(fragment == null) return;
+ if (fragment == null)
+ return;
setSortOrder(fragment, sortOrder);
setSearchQueryOnFragment(fragment, searchQuery);
}
- private void setSortOrder(ArticleListFragment fragment,
- Sortable.SortOrder sortOrder) {
- if(fragment != null) fragment.setSortOrder(sortOrder);
+ private void setSortOrder(ArticleListFragment fragment, Sortable.SortOrder sortOrder) {
+ if (fragment != null)
+ fragment.setSortOrder(sortOrder);
}
private void setSearchQueryOnFragment(ArticleListFragment fragment, String searchQuery) {
- if(fragment != null) fragment.setSearchQuery(searchQuery);
+ if (fragment != null)
+ fragment.setSearchQuery(searchQuery);
}
private ArticleListFragment getCurrentFragment() {
- return adapter == null || viewPager == null ? null
- : adapter.getCachedFragment(viewPager.getCurrentItem());
+ return adapter == null || viewPager == null ? null : adapter.getCachedFragment(viewPager.getCurrentItem());
}
private ArticleListFragment getFragment(int position) {
@@ -176,21 +176,20 @@ private ArticleListFragment getFragment(int position) {
}
private void invalidateLists(FeedsChangedEvent event) {
- if(!Collections.disjoint(event.getInvalidateAllChanges(), CHANGE_SET)) {
- updateAllLists(!Collections.disjoint(event.getInvalidateAllChanges(),
- CHANGE_SET_FORCE_CONTENT_UPDATE));
+ if (!Collections.disjoint(event.getInvalidateAllChanges(), CHANGE_SET)) {
+ updateAllLists(!Collections.disjoint(event.getInvalidateAllChanges(), CHANGE_SET_FORCE_CONTENT_UPDATE));
return;
}
- if(!Collections.disjoint(event.getMainFeedChanges(), CHANGE_SET)) {
+ if (!Collections.disjoint(event.getMainFeedChanges(), CHANGE_SET)) {
updateList(ArticleListsPagerAdapter.positionByFeedType(FeedsChangedEvent.FeedType.MAIN),
!Collections.disjoint(event.getMainFeedChanges(), CHANGE_SET_FORCE_CONTENT_UPDATE));
}
- if(!Collections.disjoint(event.getFavoriteFeedChanges(), CHANGE_SET)) {
+ if (!Collections.disjoint(event.getFavoriteFeedChanges(), CHANGE_SET)) {
updateList(ArticleListsPagerAdapter.positionByFeedType(FeedsChangedEvent.FeedType.FAVORITE),
!Collections.disjoint(event.getFavoriteFeedChanges(), CHANGE_SET_FORCE_CONTENT_UPDATE));
}
- if(!Collections.disjoint(event.getArchiveFeedChanges(), CHANGE_SET)) {
+ if (!Collections.disjoint(event.getArchiveFeedChanges(), CHANGE_SET)) {
updateList(ArticleListsPagerAdapter.positionByFeedType(FeedsChangedEvent.FeedType.ARCHIVE),
!Collections.disjoint(event.getArchiveFeedChanges(), CHANGE_SET_FORCE_CONTENT_UPDATE));
}
@@ -199,10 +198,11 @@ private void invalidateLists(FeedsChangedEvent event) {
private void updateAllLists(boolean forceContentUpdate) {
Log.d(TAG, "updateAllLists() started; forceContentUpdate: " + forceContentUpdate);
- for(int i = 0; i < ArticleListsPagerAdapter.PAGES.length; i++) {
+ for (int i = 0; i < ArticleListsPagerAdapter.PAGES.length; i++) {
ArticleListFragment f = getFragment(i);
- if(f != null) {
- if(forceContentUpdate) f.forceContentUpdate();
+ if (f != null) {
+ if (forceContentUpdate)
+ f.forceContentUpdate();
f.invalidateList();
} else {
Log.w(TAG, "updateAllLists() fragment is null; position: " + i);
@@ -211,13 +211,13 @@ private void updateAllLists(boolean forceContentUpdate) {
}
private void updateList(int position, boolean forceContentUpdate) {
- Log.d(TAG, String.format("updateList() position: %d, forceContentUpdate: %s",
- position, forceContentUpdate));
+ Log.d(TAG, String.format("updateList() position: %d, forceContentUpdate: %s", position, forceContentUpdate));
- if(position != -1) {
+ if (position != -1) {
ArticleListFragment f = getFragment(position);
- if(f != null) {
- if(forceContentUpdate) f.forceContentUpdate();
+ if (f != null) {
+ if (forceContentUpdate)
+ f.forceContentUpdate();
f.invalidateList();
} else {
Log.w(TAG, "updateList() fragment is null");
@@ -231,16 +231,16 @@ public void scroll(boolean up) {
ArticleListFragment currentFragment = getCurrentFragment();
- if( currentFragment != null && currentFragment.recyclerViewLayoutManager != null) {
+ if (currentFragment != null && currentFragment.recyclerViewLayoutManager != null) {
LinearLayoutManager listLayout = currentFragment.recyclerViewLayoutManager;
- int numberOfVisibleItems =
- listLayout.findLastCompletelyVisibleItemPosition() -
- listLayout.findFirstCompletelyVisibleItemPosition() + 1;
+ int numberOfVisibleItems = listLayout.findLastCompletelyVisibleItemPosition()
+ - listLayout.findFirstCompletelyVisibleItemPosition() + 1;
int oldPositionOnTop = listLayout.findFirstCompletelyVisibleItemPosition();
- // scroll so that as many new articles are visible than possible with one overlap
+ // scroll so that as many new articles are visible than possible with one
+ // overlap
int newPositionOnTop;
if (up) {
newPositionOnTop = oldPositionOnTop - numberOfVisibleItems + 1;
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/MainActivity.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/MainActivity.java
index 2725deccc..1736a5fd4 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/MainActivity.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/MainActivity.java
@@ -5,9 +5,6 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.res.ColorStateList;
-import android.content.res.XmlResourceParser;
-import android.os.Build;
import android.os.Bundle;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
@@ -20,7 +17,7 @@
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.SearchView;
-import androidx.appcompat.widget.Toolbar;
+import com.google.android.material.appbar.MaterialToolbar;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
@@ -30,6 +27,7 @@
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
+import androidx.core.widget.ContentLoadingProgressBar;
import android.widget.TextView;
import android.widget.Toast;
@@ -39,9 +37,7 @@
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
-import org.xmlpull.v1.XmlPullParserException;
-import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@@ -62,8 +58,7 @@
import fr.gaulupeau.apps.Poche.ui.preferences.SettingsActivity;
public class MainActivity extends AppCompatActivity
- implements NavigationView.OnNavigationItemSelectedListener,
- TagListFragment.OnFragmentInteractionListener {
+ implements NavigationView.OnNavigationItemSelectedListener, TagListFragment.OnFragmentInteractionListener {
private static final String TAG = MainActivity.class.getSimpleName();
@@ -80,7 +75,7 @@ public class MainActivity extends AppCompatActivity
private ConfigurationTestHelper configurationTestHelper;
- private ProgressBar progressBar;
+ private ContentLoadingProgressBar progressBar;
private NavigationView navigationView;
private TextView lastUpdateTimeView;
@@ -123,48 +118,53 @@ protected void onCreate(Bundle savedInstanceState) {
settings = new Settings(this);
- Toolbar toolbar = (Toolbar)findViewById(R.id.toolbar);
+ MaterialToolbar toolbar = (MaterialToolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
- navigationView = (NavigationView)findViewById(R.id.nav_view);
+ navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
- if(navigationView != null) {
+ if (navigationView != null) {
View headerView = navigationView.getHeaderView(0);
- if(headerView != null) {
- lastUpdateTimeView = (TextView)headerView.findViewById(R.id.lastUpdateTime);
+ if (headerView != null) {
+ lastUpdateTimeView = (TextView) headerView.findViewById(R.id.lastUpdateTime);
}
// Set white logo in the navigation bar in dark and dark (high contrast) theme
if (headerView != null && Themes.getCurrentTheme() != null && Themes.getCurrentTheme().isDark()) {
ImageView logo = headerView.findViewById(R.id.imageView);
- logo.setImageDrawable(getDrawable(R.drawable.welcome_white));
+ logo.setImageDrawable(getDrawable(R.drawable.ic_wallabag_logo));
}
- // Set different colors for items in the navigation bar in dark (high contrast) theme
- if (Themes.getCurrentTheme() != null && Themes.getCurrentTheme() == Themes.Theme.DARK_CONTRAST) {
- @SuppressLint("ResourceType") XmlResourceParser parser = getResources().getXml(R.color.dark_contrast_menu_item);
- try {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- navigationView.setItemTextColor(ColorStateList.createFromXml(getResources(), parser, getTheme()));
- navigationView.setItemIconTintList(ColorStateList.createFromXml(getResources(), parser, getTheme()));
-
- } else {
- navigationView.setItemTextColor(ColorStateList.createFromXml(getResources(), parser));
- navigationView.setItemIconTintList(ColorStateList.createFromXml(getResources(), parser));
- }
- } catch (XmlPullParserException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
- ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
- this, drawer, toolbar,
- R.string.navigation_drawer_open,
+ // Set different colors for items in the navigation bar in dark (high contrast)
+ // theme
+ // if (Themes.getCurrentTheme() != null && Themes.getCurrentTheme() ==
+ // Themes.Theme.DARK_CONTRAST) {
+ // @SuppressLint("ResourceType") XmlResourceParser parser =
+ // getResources().getXml(R.color.dark_contrast_menu_item);
+ // try {
+ // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ // navigationView.setItemTextColor(ColorStateList.createFromXml(getResources(),
+ // parser, getTheme()));
+ // navigationView.setItemIconTintList(ColorStateList.createFromXml(getResources(),
+ // parser, getTheme()));
+ //
+ // } else {
+ // navigationView.setItemTextColor(ColorStateList.createFromXml(getResources(),
+ // parser));
+ // navigationView.setItemIconTintList(ColorStateList.createFromXml(getResources(),
+ // parser));
+ // }
+ // } catch (XmlPullParserException e) {
+ // e.printStackTrace();
+ // } catch (IOException e) {
+ // e.printStackTrace();
+ // }
+ // }
+ }
+
+ DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
+ ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open,
R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
@@ -179,14 +179,17 @@ public void onDrawerSlide(View drawerView, float slideOffset) {
@Override
public void onDrawerStateChanged(int newState) {
- if(newState == DrawerLayout.STATE_IDLE) updated = false;
+ if (newState == DrawerLayout.STATE_IDLE)
+ updated = false;
}
private void updateTime() {
- if(updated) return;
+ if (updated)
+ return;
updated = true;
- if(lastUpdateTimeView == null) return;
+ if (lastUpdateTimeView == null)
+ return;
Log.d(TAG, "DrawerListener.updateTime() updating time");
@@ -194,8 +197,6 @@ private void updateTime() {
}
});
- progressBar = (ProgressBar)findViewById(R.id.progressBar);
-
firstSyncDone = settings.isFirstSyncDone();
offlineQueuePending = settings.isOfflineQueuePending();
@@ -205,12 +206,12 @@ private void updateTime() {
String currentFragmentType = null;
- if(savedInstanceState != null) {
+ if (savedInstanceState != null) {
Log.v(TAG, "onCreate() restoring state");
Bundle bundle = savedInstanceState.getBundle(STATE_SAVED_FRAGMENT_STATES);
- if(bundle != null) {
- for(String key: bundle.keySet()) {
+ if (bundle != null) {
+ for (String key : bundle.keySet()) {
savedFragmentStates.put(key, bundle.getParcelable(key));
}
}
@@ -221,11 +222,13 @@ private void updateTime() {
performSearch(savedInstanceState.getString(STATE_SEARCH_QUERY));
}
- if(searchQuery == null) performSearch("");
+ if (searchQuery == null)
+ performSearch("");
- if(currentFragmentType == null) currentFragmentType = FRAGMENT_ARTICLE_LISTS;
+ if (currentFragmentType == null)
+ currentFragmentType = FRAGMENT_ARTICLE_LISTS;
- if(savedInstanceState == null) {
+ if (savedInstanceState == null) {
setCurrentFragment(currentFragmentType);
} else {
currentFragment = getSupportFragmentManager().findFragmentByTag(currentFragmentType);
@@ -244,7 +247,7 @@ protected void onNewIntent(Intent intent) {
}
private void handleIntent(Intent intent) {
- if(Intent.ACTION_SEARCH.equals(intent.getAction())) {
+ if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
String query = intent.getStringExtra(SearchManager.QUERY);
Log.v(TAG, "handleIntent() search intent; query: " + query);
@@ -258,10 +261,10 @@ protected void onSaveInstanceState(Bundle outState) {
Log.v(TAG, "onSaveInstanceState()");
- if(!savedFragmentStates.isEmpty()) {
+ if (!savedFragmentStates.isEmpty()) {
Bundle bundle = new Bundle(savedFragmentStates.size());
- for(Map.Entry e: savedFragmentStates.entrySet()) {
+ for (Map.Entry e : savedFragmentStates.entrySet()) {
bundle.putParcelable(e.getKey(), e.getValue());
}
@@ -289,18 +292,18 @@ protected void onResume() {
super.onResume();
// TODO: check logic
- if(checkConfigurationOnResume) {
+ if (checkConfigurationOnResume) {
checkConfigurationOnResume = false;
- if(!Settings.checkFirstRunInit(this)) {
- if(!settings.isConfigurationOk() && checkConfigurationDialog == null) {
+ if (!Settings.checkFirstRunInit(this)) {
+ if (!settings.isConfigurationOk() && checkConfigurationDialog == null) {
AlertDialog.Builder messageBox = new AlertDialog.Builder(this);
- messageBox.setTitle(settings.isConfigurationErrorShown()
- ? R.string.d_configurationIsQuestionable_title
- : R.string.d_configurationChanged_title);
- messageBox.setMessage(settings.isConfigurationErrorShown()
- ? R.string.d_configurationIsQuestionable_message
- : R.string.d_configurationChanged_message);
+ messageBox.setTitle(
+ settings.isConfigurationErrorShown() ? R.string.d_configurationIsQuestionable_title
+ : R.string.d_configurationChanged_title);
+ messageBox.setMessage(
+ settings.isConfigurationErrorShown() ? R.string.d_configurationIsQuestionable_message
+ : R.string.d_configurationChanged_message);
messageBox.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
@@ -319,10 +322,10 @@ public void onDismiss(DialogInterface dialog) {
}
}
- if(tryToUpdateOnResume) {
+ if (tryToUpdateOnResume) {
tryToUpdateOnResume = false;
- if(!firstSyncDone) {
+ if (!firstSyncDone) {
updateAllFeedsIfDbIsEmpty();
} else {
updateOnStartup();
@@ -346,8 +349,8 @@ protected void onDestroy() {
@Override
public void onBackPressed() {
- DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
- if(drawer.isDrawerOpen(GravityCompat.START)) {
+ DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
+ if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
@@ -358,14 +361,14 @@ public void onBackPressed() {
public boolean onCreateOptionsMenu(Menu menu) {
Log.d(TAG, "onCreateOptionsMenu()");
- if(searchMenuItemExpanded) {
+ if (searchMenuItemExpanded) {
// options menu invalidation happened when searchMenuItem was expanded
searchMenuItemExpanded = false;
searchMenuItem = null;
Log.i(TAG, "onCreateOptionsMenu() searchMenuItem was not collapsed!");
- Log.v(TAG, "onCreateOptionsMenu() searchQuery: " + searchQuery
- + ", searchQueryPrevious: " + searchQueryPrevious);
+ Log.v(TAG, "onCreateOptionsMenu() searchQuery: " + searchQuery + ", searchQueryPrevious: "
+ + searchQueryPrevious);
performSearch(searchQueryPrevious);
}
@@ -373,8 +376,7 @@ public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
searchMenuItem = menu.findItem(R.id.menu_main_search);
- MenuItemCompat.setOnActionExpandListener(
- searchMenuItem, new MenuItemCompat.OnActionExpandListener() {
+ MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Log.v(TAG, "searchMenuItem expanded");
@@ -391,10 +393,10 @@ public boolean onMenuItemActionCollapse(MenuItem item) {
}
});
- final SearchView searchView = (SearchView)searchMenuItem.getActionView();
- if(searchView != null) {
- searchView.setSearchableInfo(((SearchManager)getSystemService(Context.SEARCH_SERVICE))
- .getSearchableInfo(getComponentName()));
+ final SearchView searchView = (SearchView) searchMenuItem.getActionView();
+ if (searchView != null) {
+ searchView.setSearchableInfo(
+ ((SearchManager) getSystemService(Context.SEARCH_SERVICE)).getSearchableInfo(getComponentName()));
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
@@ -416,9 +418,9 @@ public boolean onQueryTextChange(String newText) {
}
checkPendingSearchUI();
- if(!offlineQueuePending) {
+ if (!offlineQueuePending) {
MenuItem menuItem = menu.findItem(R.id.menu_main_syncQueue);
- if(menuItem != null) {
+ if (menuItem != null) {
menuItem.setVisible(false);
}
}
@@ -428,22 +430,22 @@ public boolean onQueryTextChange(String newText) {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch(item.getItemId()) {
- case R.id.menu_main_changeSortOrder:
- switchSortOrder();
- return true;
+ switch (item.getItemId()) {
+ case R.id.menu_main_changeSortOrder:
+ switchSortOrder();
+ return true;
- case R.id.menu_main_syncQueue:
- syncQueue();
- return true;
+ case R.id.menu_main_syncQueue:
+ syncQueue();
+ return true;
- case R.id.menu_main_sweepDeletedArticles:
- sweepDeletedArticles();
- return true;
+ case R.id.menu_main_sweepDeletedArticles:
+ sweepDeletedArticles();
+ return true;
- case R.id.menu_main_fullUpdate:
- fullUpdate(true);
- return true;
+ case R.id.menu_main_fullUpdate:
+ fullUpdate(true);
+ return true;
}
return super.onOptionsItemSelected(item);
@@ -451,45 +453,41 @@ public boolean onOptionsItemSelected(MenuItem item) {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
- switch(item.getItemId()) {
- case R.id.nav_mainLists:
- setCurrentFragment(FRAGMENT_ARTICLE_LISTS);
- break;
-
- case R.id.nav_tags:
- setCurrentFragment(FRAGMENT_TAG_LIST);
- break;
-
- case R.id.nav_add:
- showAddBagDialog();
+ switch (item.getItemId()) {
+ case R.id.nav_mainLists:
+ setCurrentFragment(FRAGMENT_ARTICLE_LISTS);
+ break;
+
+ case R.id.nav_tags:
+ setCurrentFragment(FRAGMENT_TAG_LIST);
+ break;
+
+ case R.id.nav_add:
+ showAddBagDialog();
+ break;
+
+ case R.id.nav_settings:
+ startActivity(new Intent(getBaseContext(), SettingsActivity.class));
+ break;
+
+ case R.id.nav_about:
+ Libs.ActivityStyle style;
+ switch (Themes.getCurrentTheme()) {
+ case DARK:
+ case DARK_CONTRAST:
+ style = Libs.ActivityStyle.DARK;
break;
- case R.id.nav_settings:
- startActivity(new Intent(getBaseContext(), SettingsActivity.class));
- break;
-
- case R.id.nav_about:
- Libs.ActivityStyle style;
- switch(Themes.getCurrentTheme()) {
- case DARK:
- case DARK_CONTRAST:
- style = Libs.ActivityStyle.DARK;
- break;
-
- default:
- style = Libs.ActivityStyle.LIGHT_DARK_TOOLBAR;
- break;
- }
- new LibsBuilder()
- .withActivityStyle(style)
- .withAboutIconShown(true)
- .withAboutVersionShown(true)
- .withAboutDescription(getResources().getString(R.string.aboutText))
- .start(this);
+ default:
+ style = Libs.ActivityStyle.LIGHT_DARK_TOOLBAR;
break;
+ }
+ new LibsBuilder().withActivityStyle(style).withAboutIconShown(true).withAboutVersionShown(true)
+ .withAboutDescription(getResources().getString(R.string.aboutText)).start(this);
+ break;
}
- DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout);
+ DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
@@ -505,7 +503,7 @@ public void onOfflineQueueChangedEvent(OfflineQueueChangedEvent event) {
Log.d(TAG, "onOfflineQueueChangedEvent() offlineQueuePending: " + offlineQueuePending);
- if(prevValue != offlineQueuePending) {
+ if (prevValue != offlineQueuePending) {
Log.d(TAG, "onOfflineQueueChangedEvent() invalidating options menu");
invalidateOptionsMenu();
}
@@ -515,14 +513,14 @@ public void onOfflineQueueChangedEvent(OfflineQueueChangedEvent event) {
public void onFeedsChangedEvent(FeedsChangedEvent event) {
Log.d(TAG, "Got FeedsChangedEvent");
- if(event.isInvalidateAll()) {
+ if (event.isInvalidateAll()) {
firstSyncDone = settings.isFirstSyncDone();
}
- if(currentFragment instanceof ArticleListsFragment) {
- ((ArticleListsFragment)currentFragment).onFeedsChangedEvent(event);
- } else if(currentFragment instanceof RecyclerViewListFragment) {
- ((RecyclerViewListFragment)currentFragment).invalidateList();
+ if (currentFragment instanceof ArticleListsFragment) {
+ ((ArticleListsFragment) currentFragment).onFeedsChangedEvent(event);
+ } else if (currentFragment instanceof RecyclerViewListFragment) {
+ ((RecyclerViewListFragment) currentFragment).invalidateList();
}
}
@@ -537,7 +535,8 @@ public void onUpdateArticlesStartedEvent(UpdateArticlesStartedEvent event) {
public void onUpdateArticlesProgressEvent(UpdateArticlesProgressEvent event) {
Log.d(TAG, "onUpdateArticlesProgressEvent");
- if(progressBar != null) {
+ progressBar = (ContentLoadingProgressBar) findViewById(R.id.progress_bar);
+ if (progressBar != null) {
progressBar.setIndeterminate(false);
progressBar.setMax(event.getTotal());
progressBar.setProgress(event.getCurrent());
@@ -548,7 +547,7 @@ public void onUpdateArticlesProgressEvent(UpdateArticlesProgressEvent event) {
public void onUpdateArticlesFinishedEvent(UpdateArticlesFinishedEvent event) {
Log.d(TAG, "onUpdateArticlesFinishedEvent");
- if(event.getResult().isSuccess()) {
+ if (event.getResult().isSuccess()) {
firstSyncDone = true;
tryToUpdateOnResume = false;
}
@@ -559,25 +558,28 @@ public void onUpdateArticlesFinishedEvent(UpdateArticlesFinishedEvent event) {
}
private void updateLastUpdateTime() {
- if(lastUpdateTimeView == null) return;
+ if (lastUpdateTimeView == null)
+ return;
Log.d(TAG, "updateLastUpdateTime() updating time");
long timestamp = settings.getLatestUpdateRunTimestamp();
- if(timestamp != 0) {
- lastUpdateTimeView.setText(getString(R.string.lastUpdateTimeLabel,
- DateUtils.getRelativeTimeSpanString(timestamp)));
+ if (timestamp != 0) {
+ lastUpdateTimeView
+ .setText(getString(R.string.lastUpdateTimeLabel, DateUtils.getRelativeTimeSpanString(timestamp)));
} else {
lastUpdateTimeView.setVisibility(View.INVISIBLE);
}
}
private void updateStateChanged(boolean started) {
- if(started == updateRunning) return;
+ if (started == updateRunning)
+ return;
updateRunning = started;
- if(progressBar != null) {
+ progressBar = (ContentLoadingProgressBar) findViewById(R.id.progress_bar);
+ if (progressBar != null) {
progressBar.setVisibility(started ? View.VISIBLE : View.GONE);
progressBar.setIndeterminate(true);
}
@@ -586,15 +588,18 @@ private void updateStateChanged(boolean started) {
private void performSearch(String query) {
setSearchQuery(query);
- if(TextUtils.isEmpty(query)) return;
+ if (TextUtils.isEmpty(query))
+ return;
searchUIPending = true;
checkPendingSearchUI();
}
private void checkPendingSearchUI() {
- if(searchMenuItem == null) return;
- if(!searchUIPending) return;
+ if (searchMenuItem == null)
+ return;
+ if (!searchUIPending)
+ return;
searchUIPending = false;
@@ -602,8 +607,9 @@ private void checkPendingSearchUI() {
}
private void initSearchUI() {
- final SearchView searchView = (SearchView)searchMenuItem.getActionView();
- if(searchView == null) return;
+ final SearchView searchView = (SearchView) searchMenuItem.getActionView();
+ if (searchView == null)
+ return;
final String searchQueryToRestore = searchQuery;
@@ -620,23 +626,20 @@ public void run() {
private void setParametersToFragment(Fragment fragment) {
Log.v(TAG, "setParametersToFragment() started");
- if(fragment == null) return;
+ if (fragment == null)
+ return;
setSortOrder(fragment);
setSearchQueryOnFragment(fragment, searchQuery);
}
private void switchSortOrder() {
- if(FRAGMENT_TAG_LIST.equals(currentFragmentType)) {
- tagsSortOrder = tagsSortOrder == Sortable.SortOrder.DESC
- ? Sortable.SortOrder.ASC
- : Sortable.SortOrder.DESC;
+ if (FRAGMENT_TAG_LIST.equals(currentFragmentType)) {
+ tagsSortOrder = tagsSortOrder == Sortable.SortOrder.DESC ? Sortable.SortOrder.ASC : Sortable.SortOrder.DESC;
settings.setTagListSortOrder(tagsSortOrder);
} else {
- sortOrder = sortOrder == Sortable.SortOrder.DESC
- ? Sortable.SortOrder.ASC
- : Sortable.SortOrder.DESC;
+ sortOrder = sortOrder == Sortable.SortOrder.DESC ? Sortable.SortOrder.ASC : Sortable.SortOrder.DESC;
settings.setListSortOrder(sortOrder);
}
@@ -645,13 +648,12 @@ private void switchSortOrder() {
}
private void setSortOrder(Fragment fragment) {
- setSortOrder(fragment, FRAGMENT_TAG_LIST.equals(currentFragmentType)
- ? tagsSortOrder : sortOrder);
+ setSortOrder(fragment, FRAGMENT_TAG_LIST.equals(currentFragmentType) ? tagsSortOrder : sortOrder);
}
private void setSortOrder(Fragment fragment, Sortable.SortOrder sortOrder) {
- if(fragment instanceof Sortable) {
- ((Sortable)fragment).setSortOrder(sortOrder);
+ if (fragment instanceof Sortable) {
+ ((Sortable) fragment).setSortOrder(sortOrder);
}
}
@@ -663,13 +665,13 @@ private void setSearchQuery(String searchQuery) {
}
private void setSearchQueryOnFragment(Fragment fragment, String searchQuery) {
- if(fragment instanceof Searchable) {
- ((Searchable)fragment).setSearchQuery(searchQuery);
+ if (fragment instanceof Searchable) {
+ ((Searchable) fragment).setSearchQuery(searchQuery);
}
}
private void setCurrentFragment(String type) {
- if(TextUtils.equals(currentFragmentType, type)) {
+ if (TextUtils.equals(currentFragmentType, type)) {
Log.i(TAG, "setCurrentFragment() ignoring switch to the same type: " + type);
return;
}
@@ -680,16 +682,14 @@ private void setCurrentFragment(String type) {
private void setCurrentFragment(Fragment fragment, String type) {
updateNavigationUI(type);
- if(currentFragment != null && isFragmentStateSavable(currentFragmentType)) {
+ if (currentFragment != null && isFragmentStateSavable(currentFragmentType)) {
Log.d(TAG, "setCurrentFragment() saving fragment state: " + currentFragmentType);
- savedFragmentStates.put(currentFragmentType, getSupportFragmentManager()
- .saveFragmentInstanceState(currentFragment));
+ savedFragmentStates.put(currentFragmentType,
+ getSupportFragmentManager().saveFragmentInstanceState(currentFragment));
}
- getSupportFragmentManager().beginTransaction()
- .replace(R.id.main_content_frame, fragment, type)
- .commit();
+ getSupportFragmentManager().beginTransaction().replace(R.id.main_content_frame, fragment, type).commit();
currentFragment = fragment;
currentFragmentType = type;
@@ -702,27 +702,27 @@ private Fragment getFragment(String type) {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(type);
- if(fragment == null) {
+ if (fragment == null) {
Log.d(TAG, "getFragment() creating new instance");
- switch(type) {
- case FRAGMENT_ARTICLE_LISTS:
- fragment = ArticleListsFragment.newInstance(null);
- break;
+ switch (type) {
+ case FRAGMENT_ARTICLE_LISTS:
+ fragment = ArticleListsFragment.newInstance(null);
+ break;
- case FRAGMENT_TAG_LIST:
- fragment = new TagListFragment();
- break;
+ case FRAGMENT_TAG_LIST:
+ fragment = new TagListFragment();
+ break;
- default:
- throw new IllegalArgumentException("Fragment type is not supported: " + type);
+ default:
+ throw new IllegalArgumentException("Fragment type is not supported: " + type);
}
- if(isFragmentStateSavable(type)) {
+ if (isFragmentStateSavable(type)) {
Log.d(TAG, "getFragment() fragment is savable");
Fragment.SavedState savedState = savedFragmentStates.get(type);
- if(savedState != null) {
+ if (savedState != null) {
Log.d(TAG, "getFragment() restoring fragment state");
fragment.setInitialSavedState(savedState);
@@ -734,66 +734,70 @@ private Fragment getFragment(String type) {
}
private boolean isFragmentStateSavable(String type) {
- if(type == null) return false;
+ if (type == null)
+ return false;
- switch(type) {
- case FRAGMENT_ARTICLE_LISTS:
- case FRAGMENT_TAG_LIST:
- return true;
+ switch (type) {
+ case FRAGMENT_ARTICLE_LISTS:
+ case FRAGMENT_TAG_LIST:
+ return true;
}
return false;
}
private void updateNavigationUI(String type) {
- if(type == null || navigationView == null) return;
+ if (type == null || navigationView == null)
+ return;
- if(FRAGMENT_TAGGED_ARTICLE_LISTS.equals(currentFragmentType)) {
+ if (FRAGMENT_TAGGED_ARTICLE_LISTS.equals(currentFragmentType)) {
MenuItem item = navigationView.getMenu().findItem(R.id.nav_taggedLists);
- if(item != null) {
+ if (item != null) {
item.setVisible(false);
item.setEnabled(false);
}
}
CharSequence title = null;
- @IdRes int itemID = 0;
- switch(type) {
- case FRAGMENT_ARTICLE_LISTS:
- itemID = R.id.nav_mainLists;
- break;
-
- case FRAGMENT_TAG_LIST:
- itemID = R.id.nav_tags;
- break;
-
- case FRAGMENT_TAGGED_ARTICLE_LISTS:
- itemID = R.id.nav_taggedLists;
-
- if(selectedTag != null) {
- title = getString(R.string.title_main_tag, selectedTag);
- }
+ @IdRes
+ int itemID = 0;
+ switch (type) {
+ case FRAGMENT_ARTICLE_LISTS:
+ itemID = R.id.nav_mainLists;
+ break;
+
+ case FRAGMENT_TAG_LIST:
+ itemID = R.id.nav_tags;
+ break;
+
+ case FRAGMENT_TAGGED_ARTICLE_LISTS:
+ itemID = R.id.nav_taggedLists;
+
+ if (selectedTag != null) {
+ title = getString(R.string.title_main_tag, selectedTag);
+ }
- MenuItem item = navigationView.getMenu().findItem(itemID);
- if(item != null) {
- if(title != null) item.setTitle(title);
- item.setVisible(true);
- item.setEnabled(true);
- }
- break;
+ MenuItem item = navigationView.getMenu().findItem(itemID);
+ if (item != null) {
+ if (title != null)
+ item.setTitle(title);
+ item.setVisible(true);
+ item.setEnabled(true);
+ }
+ break;
}
- if(itemID != 0) {
+ if (itemID != 0) {
navigationView.setCheckedItem(itemID);
- if(title == null) {
+ if (title == null) {
MenuItem item = navigationView.getMenu().findItem(itemID);
- if(item != null) {
+ if (item != null) {
title = item.getTitle();
}
}
}
- if(title != null) {
+ if (title != null) {
setTitle(title);
}
}
@@ -813,7 +817,7 @@ public void onRecyclerViewListSwipeUpdate() {
}
private void syncQueue() {
- if(!WallabagConnection.isNetworkAvailable()) {
+ if (!WallabagConnection.isNetworkAvailable()) {
Toast.makeText(this, getString(R.string.txtNetOffline), Toast.LENGTH_SHORT).show();
return;
}
@@ -822,7 +826,7 @@ private void syncQueue() {
}
private void sweepDeletedArticles() {
- if(!WallabagConnection.isNetworkAvailable()) {
+ if (!WallabagConnection.isNetworkAvailable()) {
Toast.makeText(this, getString(R.string.txtNetOffline), Toast.LENGTH_SHORT).show();
return;
}
@@ -831,15 +835,14 @@ private void sweepDeletedArticles() {
}
private void updateAllFeedsIfDbIsEmpty() {
- if(settings.isConfigurationOk() && !settings.isFirstSyncDone()) {
+ if (settings.isConfigurationOk() && !settings.isFirstSyncDone()) {
fullUpdate(false);
}
}
private void updateOnStartup() {
long delay = 5 * 60 * 1000; // 5 minutes
- if(settings.isAutoSyncOnStartupEnabled() && settings.isConfigurationOk()
- && settings.isFirstSyncDone()
+ if (settings.isAutoSyncOnStartupEnabled() && settings.isConfigurationOk() && settings.isFirstSyncDone()
&& settings.getLatestUpdateRunTimestamp() + delay < System.currentTimeMillis()) {
updateArticles(false, Updater.UpdateType.FAST);
}
@@ -852,20 +855,20 @@ private void fullUpdate(boolean showErrors) {
private boolean updateArticles(boolean showErrors, Updater.UpdateType updateType) {
boolean result = false;
- if(updateRunning) {
- if(showErrors) {
+ if (updateRunning) {
+ if (showErrors) {
Toast.makeText(this, R.string.previousUpdateNotFinished, Toast.LENGTH_SHORT).show();
}
- } else if(!settings.isConfigurationOk()) {
- if(showErrors) {
+ } else if (!settings.isConfigurationOk()) {
+ if (showErrors) {
Toast.makeText(this, getString(R.string.txtConfigNotSet), Toast.LENGTH_SHORT).show();
}
- } else if(WallabagConnection.isNetworkAvailable()) {
+ } else if (WallabagConnection.isNetworkAvailable()) {
ServiceHelper.syncAndUpdate(this, settings, updateType, false);
result = true;
} else {
- if(showErrors) {
+ if (showErrors) {
Toast.makeText(this, getString(R.string.txtNetOffline), Toast.LENGTH_SHORT).show();
}
}
@@ -876,26 +879,26 @@ private boolean updateArticles(boolean showErrors, Updater.UpdateType updateType
private void testConfiguration() {
cancelConfigurationTest();
- configurationTestHelper = new ConfigurationTestHelper(
- this, new ConfigurationTestHelper.ResultHandler() {
+ configurationTestHelper = new ConfigurationTestHelper(this, new ConfigurationTestHelper.ResultHandler() {
@Override
public void onConfigurationTestSuccess(String url) {
updateAllFeedsIfDbIsEmpty();
}
@Override
- public void onConnectionTestFail(
- WallabagWebService.ConnectionTestResult result, String details) {}
+ public void onConnectionTestFail(WallabagWebService.ConnectionTestResult result, String details) {
+ }
@Override
- public void onApiAccessTestFail(TestApiAccessTask.Result result, String details) {}
+ public void onApiAccessTestFail(TestApiAccessTask.Result result, String details) {
+ }
}, null, settings, true);
configurationTestHelper.test();
}
private void cancelConfigurationTest() {
- if(configurationTestHelper != null) {
+ if (configurationTestHelper != null) {
configurationTestHelper.cancel();
configurationTestHelper = null;
}
@@ -913,7 +916,7 @@ private void showAddBagDialog() {
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- TextView textView = (TextView)view.findViewById(R.id.page_url);
+ TextView textView = (TextView) view.findViewById(R.id.page_url);
ServiceHelper.addLink(getBaseContext(), textView.getText().toString());
}
});
@@ -924,19 +927,19 @@ public void onClick(DialogInterface dialog, int which) {
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
- if(currentFragment instanceof ArticleListsFragment) {
+ if (currentFragment instanceof ArticleListsFragment) {
switch (keyCode) {
- case KeyEvent.KEYCODE_PAGE_UP:
- case KeyEvent.KEYCODE_PAGE_DOWN:
- ((ArticleListsFragment) currentFragment).scroll(keyCode == KeyEvent.KEYCODE_PAGE_UP);
+ case KeyEvent.KEYCODE_PAGE_UP:
+ case KeyEvent.KEYCODE_PAGE_DOWN:
+ ((ArticleListsFragment) currentFragment).scroll(keyCode == KeyEvent.KEYCODE_PAGE_UP);
+ return true;
+ case KeyEvent.KEYCODE_VOLUME_UP:
+ case KeyEvent.KEYCODE_VOLUME_DOWN:
+ if (settings.isVolumeButtonsScrollingEnabled()) {
+ ((ArticleListsFragment) currentFragment).scroll(keyCode == KeyEvent.KEYCODE_VOLUME_UP);
return true;
- case KeyEvent.KEYCODE_VOLUME_UP:
- case KeyEvent.KEYCODE_VOLUME_DOWN:
- if (settings.isVolumeButtonsScrollingEnabled()) {
- ((ArticleListsFragment) currentFragment).scroll(keyCode == KeyEvent.KEYCODE_VOLUME_UP);
- return true;
- }
- break;
+ }
+ break;
}
}
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ManageArticleTagsActivity.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ManageArticleTagsActivity.java
index 4f7a3084d..263b654b7 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ManageArticleTagsActivity.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ManageArticleTagsActivity.java
@@ -182,12 +182,14 @@ public void onClick(View v) {
}
suggestedTagsView = (RecyclerView)findViewById(R.id.manageTags_suggestionList);
+ suggestedTagsView.setHasFixedSize(true);
if(suggestedTagsView != null) {
suggestedTagsView.setLayoutManager(new LinearLayoutManager(this));
suggestedTagsView.setAdapter(suggestedTagsAdapter);
}
currentTagsView = (RecyclerView)findViewById(R.id.manageTags_currentList);
+ currentTagsView.setHasFixedSize(true);
if(currentTagsView != null) {
currentTagsView.setLayoutManager(new LinearLayoutManager(this));
currentTagsView.setAdapter(currentTagsAdapter);
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ReadArticleActivity.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ReadArticleActivity.java
index a8b1ac557..47c3be856 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ReadArticleActivity.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/ReadArticleActivity.java
@@ -11,8 +11,15 @@
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
+
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
+
+import com.google.android.material.appbar.CollapsingToolbarLayout;
+
+import androidx.appcompat.widget.Toolbar;
+import androidx.core.widget.NestedScrollView;
+
import android.text.TextUtils;
import android.util.Log;
import android.view.GestureDetector;
@@ -32,11 +39,11 @@
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.LinearLayout;
-import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import com.di72nn.stuff.wallabag.apiwrapper.WallabagService;
+import com.google.android.material.button.MaterialButton;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
@@ -71,8 +78,8 @@
public class ReadArticleActivity extends BaseActionBarActivity {
- public static final String EXTRA_ID = "ReadArticleActivity.id";
- public static final String EXTRA_LIST_ARCHIVED = "ReadArticleActivity.archived";
+ public static final String EXTRA_ID = "ReadArticleActivity.id";
+ public static final String EXTRA_LIST_ARCHIVED = "ReadArticleActivity.archived";
public static final String EXTRA_LIST_FAVORITES = "ReadArticleActivity.favorites";
private static final String TAG = ReadArticleActivity.class.getSimpleName();
@@ -80,30 +87,22 @@ public class ReadArticleActivity extends BaseActionBarActivity {
private static final String TAG_TTS_FRAGMENT = "ttsFragment";
private static final EnumSet CHANGE_SET_ACTIONS = EnumSet.of(
- ArticlesChangedEvent.ChangeType.FAVORITED,
- ArticlesChangedEvent.ChangeType.UNFAVORITED,
- ArticlesChangedEvent.ChangeType.ARCHIVED,
- ArticlesChangedEvent.ChangeType.UNARCHIVED);
+ ArticlesChangedEvent.ChangeType.FAVORITED, ArticlesChangedEvent.ChangeType.UNFAVORITED,
+ ArticlesChangedEvent.ChangeType.ARCHIVED, ArticlesChangedEvent.ChangeType.UNARCHIVED);
private static final EnumSet CHANGE_SET_CONTENT = EnumSet.of(
- ArticlesChangedEvent.ChangeType.CONTENT_CHANGED,
- ArticlesChangedEvent.ChangeType.TITLE_CHANGED,
- ArticlesChangedEvent.ChangeType.DOMAIN_CHANGED,
+ ArticlesChangedEvent.ChangeType.CONTENT_CHANGED, ArticlesChangedEvent.ChangeType.TITLE_CHANGED,
+ ArticlesChangedEvent.ChangeType.DOMAIN_CHANGED, ArticlesChangedEvent.ChangeType.URL_CHANGED,
ArticlesChangedEvent.ChangeType.PUBLISHED_AT_CHANGED,
ArticlesChangedEvent.ChangeType.AUTHORS_CHANGED,
- ArticlesChangedEvent.ChangeType.URL_CHANGED,
ArticlesChangedEvent.ChangeType.ESTIMATED_READING_TIME_CHANGED,
ArticlesChangedEvent.ChangeType.FETCHED_IMAGES_CHANGED);
private static final EnumSet CHANGE_SET_PREV_NEXT = EnumSet.of(
- ArticlesChangedEvent.ChangeType.UNSPECIFIED,
- ArticlesChangedEvent.ChangeType.ADDED,
- ArticlesChangedEvent.ChangeType.DELETED,
- ArticlesChangedEvent.ChangeType.ARCHIVED,
- ArticlesChangedEvent.ChangeType.UNARCHIVED,
- ArticlesChangedEvent.ChangeType.FAVORITED,
- ArticlesChangedEvent.ChangeType.UNFAVORITED,
- ArticlesChangedEvent.ChangeType.CREATED_DATE_CHANGED);
+ ArticlesChangedEvent.ChangeType.UNSPECIFIED, ArticlesChangedEvent.ChangeType.ADDED,
+ ArticlesChangedEvent.ChangeType.DELETED, ArticlesChangedEvent.ChangeType.ARCHIVED,
+ ArticlesChangedEvent.ChangeType.UNARCHIVED, ArticlesChangedEvent.ChangeType.FAVORITED,
+ ArticlesChangedEvent.ChangeType.UNFAVORITED, ArticlesChangedEvent.ChangeType.CREATED_DATE_CHANGED);
private Boolean contextFavorites;
private Boolean contextArchived;
@@ -112,36 +111,35 @@ public class ReadArticleActivity extends BaseActionBarActivity {
private ArticleDao articleDao;
- private int fontSize;
+ private int fontSize;
private boolean volumeButtonsScrolling;
private boolean tapToScroll;
private boolean disableTouchOptionEnabled;
private boolean disableTouch;
- private int disableTouchKeyCode;
- private float screenScrollingPercent;
+ private int disableTouchKeyCode;
+ private float screenScrollingPercent;
private boolean smoothScrolling;
- private int scrolledOverBottom;
- private boolean swipeArticles;
+ private int scrolledOverBottom;
- private ScrollView scrollView;
- private View scrollViewLastChild;
- private WebView webViewContent;
- private TextView loadingPlaceholder;
- private LinearLayout bottomTools;
- private View hrBar;
- private TtsFragment ttsFragment;
+ private NestedScrollView scrollView;
+ private View scrollViewLastChild;
+ private WebView webViewContent;
+ private TextView loadingPlaceholder;
+ private LinearLayout bottomTools;
+ // private View hrBar;
+ private TtsFragment ttsFragment;
private Article article;
- private String articleTitle;
- private String articleDomain;
- private String articleUrl;
- private String articleLanguage;
- private Double articleProgress;
+ private String articleTitle;
+ private String articleDomain;
+ private String articleUrl;
+ private String articleLanguage;
+ private Double articleProgress;
private Long previousArticleID;
private Long nextArticleID;
- private int webViewHeightBeforeUpdate;
+ private int webViewHeightBeforeUpdate;
private Runnable positionRestorationRunnable;
private boolean isResumed;
@@ -152,17 +150,15 @@ public void onCreate(Bundle savedInstanceState) {
settings = App.getInstance().getSettings();
- if(settings.isFullscreenArticleView()) {
+ if (settings.isFullscreenArticleView()) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
- getWindow().setFlags(
- WindowManager.LayoutParams.FLAG_FULLSCREEN,
- WindowManager.LayoutParams.FLAG_FULLSCREEN
- );
- ActionBar actionBar = super.getSupportActionBar();
- if(actionBar != null) actionBar.hide();
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
+ // if(toolbar != null) toolbar.();
+ // TODO: Hide app bar
}
- if(settings.isKeepScreenOn()) {
+ if (settings.isKeepScreenOn()) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@@ -172,17 +168,17 @@ public void onCreate(Bundle savedInstanceState) {
Intent intent = getIntent();
long articleID = intent.getLongExtra(EXTRA_ID, -1);
Log.d(TAG, "onCreate() articleId: " + articleID);
- if(intent.hasExtra(EXTRA_LIST_FAVORITES)) {
+ if (intent.hasExtra(EXTRA_LIST_FAVORITES)) {
contextFavorites = intent.getBooleanExtra(EXTRA_LIST_FAVORITES, false);
}
- if(intent.hasExtra(EXTRA_LIST_ARCHIVED)) {
+ if (intent.hasExtra(EXTRA_LIST_ARCHIVED)) {
contextArchived = intent.getBooleanExtra(EXTRA_LIST_ARCHIVED, false);
}
DaoSession session = DbConnection.getSession();
articleDao = session.getArticleDao();
- if(!loadArticle(articleID)) {
+ if (!loadArticle(articleID)) {
Log.e(TAG, "onCreate: Did not find article with ID: " + articleID);
finish();
return;
@@ -197,23 +193,35 @@ public void onCreate(Bundle savedInstanceState) {
screenScrollingPercent = settings.getScreenScrollingPercent();
smoothScrolling = settings.isScreenScrollingSmooth();
scrolledOverBottom = settings.getScrolledOverBottom();
- swipeArticles = settings.getSwipeArticles();
-
- setTitle(articleTitle);
// article is loaded - update menu
invalidateOptionsMenu();
- scrollView = (ScrollView)findViewById(R.id.scroll);
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ // display back arrow
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+ }
+
+ // Must set on collapsing layout to enable the animation
+ // TODO: after MD library supports multi-line title should we set title here
+ // https://github.com/material-components/material-components-android/pull/413
+// CollapsingToolbarLayout collapsingToolbarLayout = findViewById(R.id.collapsing_toolbar_layout);
+// collapsingToolbarLayout.setTitle(articleTitle);
+
+ scrollView = findViewById(R.id.scroll);
scrollViewLastChild = scrollView.getChildAt(scrollView.getChildCount() - 1);
- webViewContent = (WebView)findViewById(R.id.webViewContent);
- loadingPlaceholder = (TextView)findViewById(R.id.tv_loading_article);
- bottomTools = (LinearLayout)findViewById(R.id.bottomTools);
- hrBar = findViewById(R.id.view1);
+ webViewContent = findViewById(R.id.webViewContent);
+ loadingPlaceholder = findViewById(R.id.tv_loading_article);
+ bottomTools = findViewById(R.id.bottomTools);
+ // hrBar = findViewById(R.id.view1);
initWebView();
- if(ttsFragment != null) {
+ if (ttsFragment != null) {
// is it ever executed?
ttsFragment.onDocumentLoadStart(articleDomain, articleTitle, articleLanguage);
}
@@ -222,16 +230,15 @@ public void onCreate(Bundle savedInstanceState) {
initButtons();
- if(settings.isTtsVisible() && ttsFragment == null) {
- ttsFragment = (TtsFragment)getSupportFragmentManager()
- .findFragmentByTag(TAG_TTS_FRAGMENT);
+ if (settings.isTtsVisible() && ttsFragment == null) {
+ ttsFragment = (TtsFragment) getSupportFragmentManager().findFragmentByTag(TAG_TTS_FRAGMENT);
- if(ttsFragment == null) {
+ if (ttsFragment == null) {
toggleTTS(false);
}
}
- if(disableTouch) {
+ if (disableTouch) {
showDisableTouchToast();
}
@@ -243,7 +250,7 @@ public void onResume() {
super.onResume();
isResumed = true;
- if(onPageFinishedCallPostponedUntilResume) {
+ if (onPageFinishedCallPostponedUntilResume) {
onPageFinishedCallPostponedUntilResume = false;
onPageFinished();
@@ -259,7 +266,7 @@ public void onPause() {
@Override
public void onStop() {
- if(loadingFinished && article != null) {
+ if (loadingFinished && article != null) {
cancelPositionRestoration();
OperationsHelper.setArticleProgress(this, article.getArticleId(), getReadingPosition());
@@ -283,7 +290,7 @@ public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.option_article, menu);
- if(article != null) {
+ if (article != null) {
boolean unread = article.getArchive() != null && !article.getArchive();
menu.findItem(R.id.menuArticleMarkAsRead).setVisible(unread);
menu.findItem(R.id.menuArticleMarkAsUnread).setVisible(!unread);
@@ -300,7 +307,7 @@ public boolean onCreateOptionsMenu(Menu menu) {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
- switch(item.getItemId()) {
+ switch (item.getItemId()) {
case R.id.menuArticleMarkAsRead:
case R.id.menuArticleMarkAsUnread:
markAsReadAndClose();
@@ -369,7 +376,7 @@ public boolean dispatchKeyEvent(KeyEvent event) {
}
if (triggerAction) {
- if(code == disableTouchKeyCode && (disableTouch || disableTouchOptionEnabled)) {
+ if (code == disableTouchKeyCode && (disableTouch || disableTouchOptionEnabled)) {
disableTouch = !disableTouch;
settings.setDisableTouchLastState(disableTouch);
@@ -424,13 +431,13 @@ public void onArticlesChangedEvent(ArticlesChangedEvent event) {
Log.d(TAG, "onArticlesChangedEvent() started");
boolean updatePrevNext = false;
- if(!Collections.disjoint(event.getInvalidateAllChanges(), CHANGE_SET_PREV_NEXT)) {
+ if (!Collections.disjoint(event.getInvalidateAllChanges(), CHANGE_SET_PREV_NEXT)) {
updatePrevNext = true;
} else {
EnumSet changes;
- if(contextArchived != null) {
+ if (contextArchived != null) {
changes = contextArchived ? event.getArchiveFeedChanges() : event.getMainFeedChanges();
- } else if(contextFavorites != null && contextFavorites) {
+ } else if (contextFavorites != null && contextFavorites) {
changes = event.getFavoriteFeedChanges();
} else {
changes = EnumSet.copyOf(event.getMainFeedChanges());
@@ -438,19 +445,20 @@ public void onArticlesChangedEvent(ArticlesChangedEvent event) {
changes.addAll(event.getFavoriteFeedChanges());
}
- if(!Collections.disjoint(changes, CHANGE_SET_PREV_NEXT)) {
+ if (!Collections.disjoint(changes, CHANGE_SET_PREV_NEXT)) {
updatePrevNext = true;
}
}
- if(updatePrevNext) {
+ if (updatePrevNext) {
Log.d(TAG, "onArticleChangedEvent() prev/next buttons changed");
updatePrevNextButtons();
}
EnumSet changes = event.getArticleChanges(article);
- if(changes == null) return;
+ if (changes == null)
+ return;
Log.d(TAG, "onArticlesChangedEvent() changes: " + changes);
@@ -459,7 +467,7 @@ public void onArticlesChangedEvent(ArticlesChangedEvent event) {
boolean updateTitle;
boolean updateURL;
- if(changes.contains(FeedsChangedEvent.ChangeType.UNSPECIFIED)) {
+ if (changes.contains(FeedsChangedEvent.ChangeType.UNSPECIFIED)) {
updateActions = true;
updateContent = true;
updateTitle = true;
@@ -471,7 +479,7 @@ public void onArticlesChangedEvent(ArticlesChangedEvent event) {
updateURL = changes.contains(FeedsChangedEvent.ChangeType.URL_CHANGED);
}
- if(updateActions) {
+ if (updateActions) {
Log.d(TAG, "onArticleChangedEvent() actions changed");
updateMarkAsReadButtonView();
@@ -479,34 +487,34 @@ public void onArticlesChangedEvent(ArticlesChangedEvent event) {
invalidateOptionsMenu();
}
- if(updateTitle) {
+ if (updateTitle) {
Log.d(TAG, "onArticleChangedEvent() title changed");
- articleTitle = article.getTitle();
- setTitle(articleTitle);
+// articleTitle = article.getTitle();
+// CollapsingToolbarLayout collapsingToolbarLayout = findViewById(R.id.collapsing_toolbar_layout);
+// collapsingToolbarLayout.setTitle(articleTitle);
}
- if(updateURL) {
+ if (updateURL) {
Log.d(TAG, "onArticleChangedEvent() URL changed");
articleUrl = article.getUrl();
}
- if(updateContent) {
+ if (updateContent) {
Log.d(TAG, "onArticleChangedEvent() content changed");
-// prepareToRestorePosition(true);
+ // prepareToRestorePosition(true);
loadArticleToWebView();
-// restorePositionAfterUpdate();
+ // restorePositionAfterUpdate();
}
}
private void showDisableTouchToast() {
- Toast.makeText(this, disableTouch
- ? R.string.message_disableTouch_inputDisabled
- : R.string.message_disableTouch_inputEnabled,
+ Toast.makeText(this,
+ disableTouch ? R.string.message_disableTouch_inputDisabled : R.string.message_disableTouch_inputEnabled,
Toast.LENGTH_SHORT).show();
}
@@ -518,12 +526,11 @@ private void initWebView() {
@Override
public boolean onConsoleMessage(ConsoleMessage cm) {
boolean result = false;
- if(ttsFragment != null) {
+ if (ttsFragment != null) {
result = ttsFragment.onWebViewConsoleMessage(cm);
}
- if(!result) {
- Log.d("WebView.onCM", String.format("%s @ %d: %s", cm.message(),
- cm.lineNumber(), cm.sourceId()));
+ if (!result) {
+ Log.d("WebView.onCM", String.format("%s @ %d: %s", cm.message(), cm.lineNumber(), cm.sourceId()));
}
return true;
}
@@ -541,8 +548,9 @@ public void onPageFinished(WebView view, String url) {
@SuppressWarnings("deprecation") // can't use newer method until API 21
@Override
public boolean shouldOverrideUrlLoading(WebView webView, String url) {
- // If we try to open current URL, do not propose to save it, directly open browser
- if(url.equals(articleUrl)) {
+ // If we try to open current URL, do not propose to save it, directly open
+ // browser
+ if (url.equals(articleUrl)) {
openURL(url);
} else {
handleUrlClicked(url);
@@ -552,17 +560,17 @@ public boolean shouldOverrideUrlLoading(WebView webView, String url) {
}
@Override
- public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
- String host, String realm) {
+ public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
Log.d(TAG, "onReceivedHttpAuthRequest() host: " + host + ", realm: " + realm);
- if(!TextUtils.isEmpty(host)) {
+ if (!TextUtils.isEmpty(host)) {
String httpAuthHost = settings.getUrl();
try {
httpAuthHost = new URL(httpAuthHost).getHost();
- } catch(Exception ignored) {}
+ } catch (Exception ignored) {
+ }
- if(host.contains(httpAuthHost)) {
+ if (host.contains(httpAuthHost)) {
Log.d(TAG, "onReceivedHttpAuthRequest() host match");
handler.proceed(settings.getHttpAuthUsername(), settings.getHttpAuthPassword());
return;
@@ -574,42 +582,43 @@ public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler,
});
- if(fontSize != 100) setFontSize(webViewContent, fontSize);
+ if (fontSize != 100)
+ setFontSize(webViewContent, fontSize);
- GestureDetector.SimpleOnGestureListener gestureListener
- = new GestureDetector.SimpleOnGestureListener() {
+ GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// note: e1 - previous event, e2 - current event
// velocity* - velocity in pixels per second
- if(!swipeArticles) return false;
- if(e1 == null || e2 == null) return false;
- if(e1.getPointerCount() > 1 || e2.getPointerCount() > 1) return false;
+ if (e1 == null || e2 == null)
+ return false;
+ if (e1.getPointerCount() > 1 || e2.getPointerCount() > 1)
+ return false;
-// if(Math.abs(e1.getY() - e2.getY()) > 150) {
-// Log.d("FLING", "not a horizontal fling (distance)");
-// return false; // not a horizontal move (distance)
-// }
+ // if(Math.abs(e1.getY() - e2.getY()) > 150) {
+ // Log.d("FLING", "not a horizontal fling (distance)");
+ // return false; // not a horizontal move (distance)
+ // }
- if(Math.abs(velocityX) < 80) {
+ if (Math.abs(velocityX) < 80) {
Log.v("FLING", "too slow");
return false; // too slow
}
- if(Math.abs(velocityX / velocityY) < 3) {
+ if (Math.abs(velocityX / velocityY) < 3) {
Log.v("FLING", "not a horizontal fling");
return false; // not a horizontal fling
}
float diff = e1.getX() - e2.getX();
- if(Math.abs(diff) < 80) { // configurable
+ if (Math.abs(diff) < 80) { // configurable
Log.v("FLING", "too small distance");
return false; // too small distance
}
- if(diff > 0) { // right-to-left: next
+ if (diff > 0) { // right-to-left: next
Log.v("FLING", "right-to-left: next");
openNextArticle();
} else { // left-to-right: prev
@@ -621,20 +630,22 @@ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float ve
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
- if(!tapToScroll) return false;
+ if (!tapToScroll)
+ return false;
- if(e.getPointerCount() > 1) return false;
+ if (e.getPointerCount() > 1)
+ return false;
int viewHeight = scrollView.getHeight();
float y = e.getY() - scrollView.getScrollY();
- if(y > viewHeight * 0.25 && y < viewHeight * 0.75) {
+ if (y > viewHeight * 0.25 && y < viewHeight * 0.75) {
int viewWidth = scrollView.getWidth();
float x = e.getX();
- if(x < viewWidth * 0.3) { // left part
+ if (x < viewWidth * 0.3) { // left part
scroll(true, screenScrollingPercent, smoothScrolling, false);
- } else if(x > viewWidth * 0.7) { // right part
+ } else if (x > viewWidth * 0.7) { // right part
scroll(false, screenScrollingPercent, smoothScrolling, false);
}
}
@@ -654,15 +665,15 @@ public boolean onTouch(View v, MotionEvent event) {
}
private void loadArticleToWebView() {
- webViewContent.loadDataWithBaseURL("file:///android_asset/", getHtmlPage(),
- "text/html", "utf-8", null);
+ String page = getHtmlPage();
+ webViewContent.loadDataWithBaseURL("file:///android_asset/", page, "text/html", "utf-8", null);
}
private String getHtmlPage() {
String cssName;
boolean highContrast = false;
boolean weightedFont = false;
- switch(Themes.getCurrentTheme()) {
+ switch (Themes.getCurrentTheme()) {
case E_INK:
weightedFont = true;
case LIGHT_CONTRAST:
@@ -685,18 +696,21 @@ private String getHtmlPage() {
}
List additionalClasses = new ArrayList<>(1);
- if(highContrast) additionalClasses.add("high-contrast");
- if(weightedFont) additionalClasses.add("weighted-font");
- if(settings.isArticleFontSerif()) additionalClasses.add("serif-font");
- if(settings.isArticleTextAlignmentJustify()) additionalClasses.add("text-align-justify");
- additionalClasses.add(settings.getHandlePreformattedTextOption());
+ if (highContrast)
+ additionalClasses.add("high-contrast");
+ if (weightedFont)
+ additionalClasses.add("weighted-font");
+ if (settings.isArticleFontSerif())
+ additionalClasses.add("serif-font");
+ if (settings.isArticleTextAlignmentJustify())
+ additionalClasses.add("text-align-justify");
String classAttr;
- if(!additionalClasses.isEmpty()) {
+ if (!additionalClasses.isEmpty()) {
StringBuilder sb = new StringBuilder();
sb.append(" class=\"");
- for(String cl: additionalClasses) {
+ for (String cl : additionalClasses) {
sb.append(cl).append(' ');
}
sb.append('"');
@@ -709,19 +723,20 @@ private String getHtmlPage() {
String htmlBase;
try {
htmlBase = readRawString(R.raw.webview_htmlbase);
- } catch(Exception e) {
+ } catch (Exception e) {
// should not happen
throw new RuntimeException("Couldn't load raw resource", e);
}
String htmlContent = getHtmlContent();
List imgURLs = ImageCacheUtils.findImageUrlsInHtml(htmlContent);
- if(imgURLs != null && imgURLs.size() > 0) {
+ if (imgURLs != null && imgURLs.size() > 0) {
String wbgURL = ImageCacheUtils.getWallabagUrl();
- for(String imageURL: imgURLs) {
- if(imageURL.startsWith(ImageCacheUtils.WALLABAG_RELATIVE_URL_PATH)) {
+ for (String imageURL : imgURLs) {
+ if (imageURL.startsWith(ImageCacheUtils.WALLABAG_RELATIVE_URL_PATH)) {
htmlContent = htmlContent.replace(imageURL, wbgURL + imageURL);
- Log.d(TAG, "getHtmlPage() prefixing wallabag server URL " + wbgURL + " to the image path " + imageURL);
+ Log.d(TAG,
+ "getHtmlPage() prefixing wallabag server URL " + wbgURL + " to the image path " + imageURL);
}
}
}
@@ -736,29 +751,31 @@ private String getHtmlPage() {
dateAndAuthor += " " + article.getAuthors();
}
- return String.format(htmlBase, cssName, classAttr, TextUtils.htmlEncode(articleTitle),
- articleUrl, articleDomain, dateAndAuthor, htmlContent);
+ int estimatedReadingTime = article.getEstimatedReadingTime(settings.getReadingSpeed());
+ String estimatedReadingTimeString = getString(R.string.content_estimatedReadingTime,
+ estimatedReadingTime > 0 ? estimatedReadingTime : "< 1");
+
+ String result = String.format(htmlBase, cssName, classAttr, TextUtils.htmlEncode(articleTitle), articleUrl,
+ articleDomain, dateAndAuthor, estimatedReadingTimeString, htmlContent);
+ int a = 1;
+ return result;
}
private String getHtmlContent() {
String htmlContent = article.getContent();
- int estimatedReadingTime = article.getEstimatedReadingTime(settings.getReadingSpeed());
- String estimatedReadingTimeString = getString(R.string.content_estimatedReadingTime,
- estimatedReadingTime > 0 ? estimatedReadingTime : "< 1");
-
String previewPicture = "";
- if(!TextUtils.isEmpty(article.getPreviewPictureURL())) {
+ if (!TextUtils.isEmpty(article.getPreviewPictureURL())) {
previewPicture = "
";
}
- htmlContent = estimatedReadingTimeString + previewPicture + htmlContent;
- if(BuildConfig.DEBUG) Log.d(TAG, "getHtmlContent() htmlContent: " + htmlContent);
+ htmlContent = previewPicture + htmlContent;
+ if (BuildConfig.DEBUG)
+ Log.d(TAG, "getHtmlContent() htmlContent: " + htmlContent);
- if(settings.isImageCacheEnabled()) {
+ if (settings.isImageCacheEnabled()) {
Log.d(TAG, "getHtmlContent() replacing image links to cached versions in htmlContent");
- htmlContent = ImageCacheUtils.replaceImagesInHtmlContent(
- htmlContent, article.getArticleId().longValue());
+ htmlContent = ImageCacheUtils.replaceImagesInHtmlContent(htmlContent, article.getArticleId().longValue());
}
return htmlContent;
@@ -770,20 +787,19 @@ private void initButtons() {
}
private void updateMarkAsReadButtonView() {
- Button buttonMarkRead = (Button)findViewById(R.id.btnMarkRead);
- Button buttonMarkUnread = (Button)findViewById(R.id.btnMarkUnread);
+ MaterialButton buttonMarkRead = findViewById(R.id.btnMarkRead);
+ MaterialButton buttonMarkUnread = findViewById(R.id.btnMarkUnread);
boolean archived = article.getArchive();
- buttonMarkRead.setVisibility(!archived ? View.VISIBLE: View.GONE);
- buttonMarkUnread.setVisibility(archived ? View.VISIBLE: View.GONE);
-
- OnClickListener onClickListener =
- new OnClickListener() {
- @Override
- public void onClick(View v) {
- markAsReadAndClose();
- }
- };
+ buttonMarkRead.setVisibility(!archived ? View.VISIBLE : View.GONE);
+ buttonMarkUnread.setVisibility(archived ? View.VISIBLE : View.GONE);
+
+ OnClickListener onClickListener = new OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ markAsReadAndClose();
+ }
+ };
buttonMarkRead.setOnClickListener(onClickListener);
buttonMarkUnread.setOnClickListener(onClickListener);
@@ -797,8 +813,8 @@ private void updatePrevNextButtons() {
}
private void updatePrevNextButtonViews() {
- ImageButton buttonGoPrevious = (ImageButton)findViewById(R.id.btnGoPrevious);
- ImageButton buttonGoNext = (ImageButton)findViewById(R.id.btnGoNext);
+ MaterialButton buttonGoPrevious = findViewById(R.id.btnGoPrevious);
+ MaterialButton buttonGoNext = findViewById(R.id.btnGoNext);
buttonGoPrevious.setVisibility(previousArticleID == null ? View.GONE : View.VISIBLE);
buttonGoNext.setVisibility(nextArticleID == null ? View.GONE : View.VISIBLE);
@@ -822,67 +838,65 @@ private void loadingFinished() {
loadingPlaceholder.setVisibility(View.GONE);
bottomTools.setVisibility(View.VISIBLE);
- hrBar.setVisibility(View.VISIBLE);
+ // hrBar.setVisibility(View.VISIBLE);
// should there be a pause between visibility change and position restoration?
restoreReadingPosition();
- if(ttsFragment != null) {
+ if (ttsFragment != null) {
ttsFragment.onDocumentLoadFinished(webViewContent, scrollView);
}
}
private void handleUrlClicked(final String url) {
Log.d(TAG, "handleUrlClicked() url: " + url);
- if(TextUtils.isEmpty(url)) return;
+ if (TextUtils.isEmpty(url))
+ return;
// TODO: fancy dialog
AlertDialog.Builder builder = new AlertDialog.Builder(this);
@SuppressLint("InflateParams") // it's ok to inflate with null for AlertDialog
- View v = getLayoutInflater().inflate(R.layout.dialog_title_url, null);
+ View v = getLayoutInflater().inflate(R.layout.dialog_title_url, null);
- TextView tv = (TextView)v.findViewById(R.id.tv_dialog_title_url);
+ TextView tv = v.findViewById(R.id.tv_dialog_title_url);
tv.setText(url);
builder.setCustomTitle(v);
- builder.setItems(
- new CharSequence[]{
- getString(R.string.d_urlAction_openInBrowser),
- getString(R.string.d_urlAction_addToWallabag),
- getString(R.string.d_urlAction_copyToClipboard),
- getString(R.string.menuShare)
- }, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- switch (which) {
- case 0:
- openURL(url);
- break;
- case 1:
- ServiceHelper.addLink(ReadArticleActivity.this, url);
- break;
- case 2:
- copyURLToClipboard(url);
- break;
- case 3:
- shareArticle(null, url);
- break;
- }
- }
- });
+ builder.setItems(new CharSequence[]{getString(R.string.d_urlAction_openInBrowser),
+ getString(R.string.d_urlAction_addToWallabag), getString(R.string.d_urlAction_copyToClipboard),
+ getString(R.string.menuShare)}, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ switch (which) {
+ case 0:
+ openURL(url);
+ break;
+ case 1:
+ ServiceHelper.addLink(ReadArticleActivity.this, url);
+ break;
+ case 2:
+ copyURLToClipboard(url);
+ break;
+ case 3:
+ shareArticle(null, url);
+ break;
+ }
+ }
+ });
builder.show();
}
private void openURL(String url) {
Log.d(TAG, "openURL() url: " + url);
- if(TextUtils.isEmpty(url)) return;
+ if (TextUtils.isEmpty(url))
+ return;
Uri uri = Uri.parse(url);
- if(uri.getScheme() == null) {
+ if (uri.getScheme() == null) {
Log.i(TAG, "openURL() scheme is null, appending default scheme");
uri = Uri.parse("http://" + url);
}
@@ -891,7 +905,7 @@ private void openURL(String url) {
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
try {
startActivity(intent);
- } catch(ActivityNotFoundException e) {
+ } catch (ActivityNotFoundException e) {
Log.w(TAG, "openURL() failed to open URL", e);
Toast.makeText(this, R.string.message_couldNotOpenUrl, Toast.LENGTH_SHORT).show();
}
@@ -908,21 +922,22 @@ private void toggleFavorite() {
}
private void shareArticle() {
- shareArticle(articleTitle, articleUrl);
+ shareArticle(articleTitle, articleUrl);
}
- private void shareArticle(String articleTitle , String articleUrl) {
+ private void shareArticle(String articleTitle, String articleUrl) {
String shareText = articleUrl;
- if(!TextUtils.isEmpty(articleTitle)) shareText = articleTitle + " " + shareText;
-
+ if (!TextUtils.isEmpty(articleTitle))
+ shareText = articleTitle + " " + shareText;
- if(settings.isAppendWallabagMentionEnabled()) {
+ if (settings.isAppendWallabagMentionEnabled()) {
shareText += getString(R.string.share_text_extra);
}
Intent send = new Intent(Intent.ACTION_SEND);
send.setType("text/plain");
- if(!TextUtils.isEmpty(articleTitle)) send.putExtra(Intent.EXTRA_SUBJECT, articleTitle);
+ if (!TextUtils.isEmpty(articleTitle))
+ send.putExtra(Intent.EXTRA_SUBJECT, articleTitle);
send.putExtra(Intent.EXTRA_TEXT, shareText);
startActivity(Intent.createChooser(send, getString(R.string.share_article_title)));
@@ -953,14 +968,14 @@ private void showChangeTitleDialog() {
@SuppressLint("InflateParams") // ok for dialogs
final View view = getLayoutInflater().inflate(R.layout.dialog_change_title, null);
- ((TextView)view.findViewById(R.id.editText_title)).setText(articleTitle);
+ ((TextView) view.findViewById(R.id.editText_title)).setText(articleTitle);
builder.setView(view);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- TextView textView = (TextView)view.findViewById(R.id.editText_title);
+ TextView textView = view.findViewById(R.id.editText_title);
changeTitle(textView.getText().toString());
}
});
@@ -985,7 +1000,7 @@ private void openOriginal() {
}
private void copyURLToClipboard() {
- copyURLToClipboard(articleUrl);
+ copyURLToClipboard(articleUrl);
}
private void copyURLToClipboard(String url) {
@@ -997,9 +1012,8 @@ private void copyURLToClipboard(String url) {
private void showDownloadFileDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
- builder.setTitle(R.string.dialog_title_downloadFileFormat)
- .setItems(R.array.options_downloadFormat_values,
- new DialogInterface.OnClickListener() {
+ builder.setTitle(R.string.dialog_title_downloadFileFormat).setItems(R.array.options_downloadFormat_values,
+ new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
String selectedFormat = getResources()
.getStringArray(R.array.options_downloadFormat_values)[which];
@@ -1007,14 +1021,13 @@ public void onClick(DialogInterface dialog, int which) {
WallabagService.ResponseFormat format;
try {
format = WallabagService.ResponseFormat.valueOf(selectedFormat);
- } catch(IllegalArgumentException e) {
- Log.e(TAG, "showDownloadFileDialog() unknown selected format: "
- + selectedFormat);
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "showDownloadFileDialog() unknown selected format: " + selectedFormat);
format = WallabagService.ResponseFormat.PDF;
}
- ServiceHelper.downloadArticleAsFile(getApplicationContext(),
- article.getArticleId(), format, null);
+ ServiceHelper.downloadArticleAsFile(getApplicationContext(), article.getArticleId(), format,
+ null);
}
});
builder.show();
@@ -1025,7 +1038,8 @@ private void changeFontSize(boolean increase) {
int step = 5;
fontSize += step * (increase ? 1 : -1);
- if(!increase && fontSize < 5) fontSize = 5;
+ if (!increase && fontSize < 5)
+ fontSize = 5;
setFontSize(webViewContent, fontSize);
@@ -1035,21 +1049,23 @@ private void changeFontSize(boolean increase) {
}
private void openArticle(Long id) {
- if(ttsFragment != null) {
+ if (ttsFragment != null) {
ttsFragment.onOpenNewArticle();
}
Intent intent = new Intent(this, ReadArticleActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(ReadArticleActivity.EXTRA_ID, id);
- if(contextFavorites != null) intent.putExtra(EXTRA_LIST_FAVORITES, contextFavorites);
- if(contextArchived != null) intent.putExtra(EXTRA_LIST_ARCHIVED, contextArchived);
+ if (contextFavorites != null)
+ intent.putExtra(EXTRA_LIST_FAVORITES, contextFavorites);
+ if (contextArchived != null)
+ intent.putExtra(EXTRA_LIST_ARCHIVED, contextArchived);
startActivity(intent);
}
public boolean openPreviousArticle() {
- if(previousArticleID != null) {
+ if (previousArticleID != null) {
openArticle(previousArticleID);
return true;
}
@@ -1059,7 +1075,7 @@ public boolean openPreviousArticle() {
}
public boolean openNextArticle() {
- if(nextArticleID != null) {
+ if (nextArticleID != null) {
openArticle(nextArticleID);
return true;
}
@@ -1069,32 +1085,33 @@ public boolean openNextArticle() {
}
private void scroll(boolean up, float percent, boolean smooth, boolean keyUsed) {
- if(scrollView == null) return;
+ if (scrollView == null)
+ return;
int viewHeight = scrollView.getHeight();
int yOffset = scrollView.getScrollY();
int newYOffset = yOffset;
- int step = (int)(viewHeight * percent / 100);
- if(up) {
+ int step = (int) (viewHeight * percent / 100);
+ if (up) {
newYOffset -= step;
} else {
newYOffset += step;
}
- if(newYOffset != yOffset) {
- if(smooth) {
+ if (newYOffset != yOffset) {
+ if (smooth) {
scrollView.smoothScrollTo(scrollView.getScrollX(), newYOffset);
} else {
scrollView.scrollTo(scrollView.getScrollX(), newYOffset);
}
}
- if(!up && keyUsed && newYOffset + viewHeight > scrollViewLastChild.getBottom()) {
- if(scrolledOverBottom > 1) {
+ if (!up && keyUsed && newYOffset + viewHeight > scrollViewLastChild.getBottom()) {
+ if (scrolledOverBottom > 1) {
scrolledOverBottom--;
- Toast.makeText(this, getString(R.string.scrolledOverBottom, scrolledOverBottom),
- Toast.LENGTH_SHORT).show();
+ Toast.makeText(this, getString(R.string.scrolledOverBottom, scrolledOverBottom), Toast.LENGTH_SHORT)
+ .show();
} else {
Toast.makeText(this, R.string.markedAsRead, Toast.LENGTH_SHORT).show();
markAsReadAndClose();
@@ -1109,13 +1126,14 @@ private double getReadingPosition() {
int viewHeight = scrollView.getHeight();
int totalHeight = scrollView.getChildAt(0).getHeight();
- Log.v(TAG, "getReadingPosition() yOffset: " + yOffset + ", viewHeight: " + viewHeight
- + ", totalHeight: " + totalHeight);
+ Log.v(TAG, "getReadingPosition() yOffset: " + yOffset + ", viewHeight: " + viewHeight + ", totalHeight: "
+ + totalHeight);
totalHeight -= viewHeight;
double position = totalHeight >= 0 ? yOffset * 1. / totalHeight : 0;
- if(position > 100) position = 100;
+ if (position > 100)
+ position = 100;
Log.d(TAG, "getReadingPosition() position: " + position);
@@ -1125,16 +1143,15 @@ private double getReadingPosition() {
private void restoreReadingPosition() {
Log.d(TAG, "restoreReadingPosition() articleProgress: " + articleProgress);
- if(articleProgress != null) {
+ if (articleProgress != null) {
int viewHeight = scrollView.getHeight();
int totalHeight = scrollView.getChildAt(0).getHeight();
- Log.v(TAG, "restoreReadingPosition() viewHeight: " + viewHeight
- + ", totalHeight: " + totalHeight);
+ Log.v(TAG, "restoreReadingPosition() viewHeight: " + viewHeight + ", totalHeight: " + totalHeight);
totalHeight -= viewHeight;
- int yOffset = totalHeight > 0 ? ((int)Math.round(articleProgress * totalHeight)) : 0;
+ int yOffset = totalHeight > 0 ? ((int) Math.round(articleProgress * totalHeight)) : 0;
Log.v(TAG, "restoreReadingPosition() yOffset: " + yOffset);
@@ -1144,27 +1161,21 @@ private void restoreReadingPosition() {
public boolean toggleTTS(boolean autoPlay) {
boolean result;
- if(ttsFragment == null) {
+ if (ttsFragment == null) {
ttsFragment = TtsFragment.newInstance(autoPlay);
- getSupportFragmentManager()
- .beginTransaction()
- .add(R.id.viewMain, ttsFragment, TAG_TTS_FRAGMENT)
- .commit();
+ getSupportFragmentManager().beginTransaction().add(R.id.viewMain, ttsFragment, TAG_TTS_FRAGMENT).commit();
settings.setTtsVisible(true);
ttsFragment.onDocumentLoadStart(articleDomain, articleTitle, articleLanguage);
- if(loadingFinished) {
+ if (loadingFinished) {
ttsFragment.onDocumentLoadFinished(webViewContent, scrollView);
}
result = true;
} else {
- getSupportFragmentManager()
- .beginTransaction()
- .remove(ttsFragment)
- .commit();
+ getSupportFragmentManager().beginTransaction().remove(ttsFragment).commit();
ttsFragment = null;
@@ -1181,7 +1192,8 @@ public boolean toggleTTS(boolean autoPlay) {
private boolean loadArticle(long id) {
article = getArticle(id);
- if(article == null) return false;
+ if (article == null)
+ return false;
articleTitle = article.getTitle();
Log.d(TAG, "loadArticle() articleTitle: " + articleTitle);
@@ -1204,17 +1216,23 @@ private Article getArticle(long articleID) {
private Long getAdjacentArticle(boolean previous) {
QueryBuilder qb = articleDao.queryBuilder();
- if(previous) qb.where(ArticleDao.Properties.ArticleId.gt(article.getArticleId()));
- else qb.where(ArticleDao.Properties.ArticleId.lt(article.getArticleId()));
+ if (previous)
+ qb.where(ArticleDao.Properties.ArticleId.gt(article.getArticleId()));
+ else
+ qb.where(ArticleDao.Properties.ArticleId.lt(article.getArticleId()));
- if(contextFavorites != null) qb.where(ArticleDao.Properties.Favorite.eq(contextFavorites));
- if(contextArchived != null) qb.where(ArticleDao.Properties.Archive.eq(contextArchived));
+ if (contextFavorites != null)
+ qb.where(ArticleDao.Properties.Favorite.eq(contextFavorites));
+ if (contextArchived != null)
+ qb.where(ArticleDao.Properties.Archive.eq(contextArchived));
- if(previous) qb.orderAsc(ArticleDao.Properties.ArticleId);
- else qb.orderDesc(ArticleDao.Properties.ArticleId);
+ if (previous)
+ qb.orderAsc(ArticleDao.Properties.ArticleId);
+ else
+ qb.orderDesc(ArticleDao.Properties.ArticleId);
List l = qb.limit(1).list();
- if(!l.isEmpty()) {
+ if (!l.isEmpty()) {
return l.get(0).getId();
}
@@ -1228,16 +1246,17 @@ private String readRawString(int id) throws IOException {
StringBuilder sb = new StringBuilder();
String s;
- while((s = reader.readLine()) != null) {
+ while ((s = reader.readLine()) != null) {
sb.append(s).append('\n');
}
return sb.toString();
} finally {
- if(reader != null) {
+ if (reader != null) {
try {
reader.close();
- } catch(IOException ignored) {}
+ } catch (IOException ignored) {
+ }
}
}
}
@@ -1245,10 +1264,10 @@ private String readRawString(int id) throws IOException {
private void onPageFinished() {
Log.d(TAG, "onPageFinished() started");
- if(!isResumed) {
+ if (!isResumed) {
onPageFinishedCallPostponedUntilResume = true;
- if(ttsFragment != null) {
+ if (ttsFragment != null) {
ttsFragment.onDocumentLoadFinished(webViewContent, scrollView);
}
return;
@@ -1261,10 +1280,9 @@ private void onPageFinished() {
@Override
public void run() {
// "< 50" is workaround for https://github.com/wallabag/android-app/issues/178
- if(webViewContent.getHeight() < 50) {
- if(++counter > 1000) {
- Log.d(TAG, "onPageFinished() exiting by counter" +
- "; calling loadingFinished() anyway");
+ if (webViewContent.getHeight() < 50) {
+ if (++counter > 1000) {
+ Log.d(TAG, "onPageFinished() exiting by counter" + "; calling loadingFinished() anyway");
loadingFinished();
return;
}
@@ -1280,7 +1298,8 @@ public void run() {
}
private void prepareToRestorePosition(boolean savePosition) {
- if(savePosition) articleProgress = getReadingPosition();
+ if (savePosition)
+ articleProgress = getReadingPosition();
webViewHeightBeforeUpdate = webViewContent.getHeight();
}
@@ -1293,14 +1312,13 @@ private void restorePositionAfterUpdate() {
@Override
public void run() {
- if(webViewContent.getHeight() == webViewHeightBeforeUpdate) {
- if(++counter > 1000) {
+ if (webViewContent.getHeight() == webViewHeightBeforeUpdate) {
+ if (++counter > 1000) {
Log.d(TAG, "restorePositionAfterUpdate() giving up");
return;
}
- Log.v(TAG, "restorePositionAfterUpdate() scheduling another postDelay" +
- "; counter: " + counter);
+ Log.v(TAG, "restorePositionAfterUpdate() scheduling another postDelay" + "; counter: " + counter);
webViewContent.postDelayed(this, 10);
} else {
Log.d(TAG, "restorePositionAfterUpdate() restoring position");
@@ -1311,15 +1329,16 @@ public void run() {
}
private void cancelPositionRestoration() {
- if(positionRestorationRunnable != null) {
+ if (positionRestorationRunnable != null) {
Log.d(TAG, "cancelPositionRestoration() trying to cancel previous task");
- if(webViewContent != null) webViewContent.removeCallbacks(positionRestorationRunnable);
+ if (webViewContent != null)
+ webViewContent.removeCallbacks(positionRestorationRunnable);
positionRestorationRunnable = null;
}
}
private void setFontSize(WebView view, int size) {
- if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
setFontSizeNew(view, size);
} else {
setFontSizeOld(view, size);
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java
index db8c97595..4087d7423 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/RecyclerViewListFragment.java
@@ -75,6 +75,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container,
recyclerViewLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(recyclerViewLayoutManager);
+ recyclerView.setHasFixedSize(true);
scrollListener = new EndlessRecyclerViewScrollListener(recyclerViewLayoutManager) {
@Override
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/Themes.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/Themes.java
index acb94dc90..4d3e1c5dc 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/Themes.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/Themes.java
@@ -50,44 +50,44 @@ public static void checkTheme(Activity activity) {
public enum Theme {
LIGHT(
R.string.themeName_light,
- R.style.LightTheme,
- R.style.LightTheme_NoActionBar,
- R.style.ProxyTheme
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight
),
LIGHT_CONTRAST(
R.string.themeName_light_contrast,
- R.style.LightThemeContrast,
- R.style.LightThemeContrast_NoActionBar,
- R.style.ProxyTheme
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight
),
E_INK(
R.string.themeName_eink,
- R.style.LightThemeContrast,
- R.style.LightThemeContrast_NoActionBar,
- R.style.ProxyTheme
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight
),
DARK(
R.string.themeName_dark,
- R.style.DarkTheme,
- R.style.DarkTheme_NoActionBar,
- R.style.ProxyThemeDark
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight
),
DARK_CONTRAST(
R.string.themeName_dark_contrast,
- R.style.DarkThemeContrast,
- R.style.DarkThemeContrast_NoActionBar,
- R.style.ProxyThemeDark
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight
),
SOLARIZED(
R.string.themeName_solarized,
- R.style.SolarizedTheme,
- R.style.SolarizedTheme_NoActionBar,
- R.style.ProxyTheme
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight,
+ R.style.MyTheme_DayNight
);
private int nameId;
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/FloatEditTextPreference.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/FloatEditTextPreference.java
index 49a3030c2..cfbe7c84e 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/FloatEditTextPreference.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/FloatEditTextPreference.java
@@ -3,7 +3,7 @@
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
-import android.preference.EditTextPreference;
+import androidx.preference.EditTextPreference;
import android.util.AttributeSet;
/**
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntEditTextPreference.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntEditTextPreference.java
index 04582fc98..85843b8c1 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntEditTextPreference.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntEditTextPreference.java
@@ -3,7 +3,7 @@
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
-import android.preference.EditTextPreference;
+import androidx.preference.EditTextPreference;
import android.util.AttributeSet;
/**
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntListPreference.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntListPreference.java
index b93f5668d..b4d6bcc4a 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntListPreference.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/IntListPreference.java
@@ -3,7 +3,7 @@
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
-import android.preference.ListPreference;
+import androidx.preference.ListPreference;
import android.util.AttributeSet;
/**
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/LongListPreference.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/LongListPreference.java
index 38d5f0554..cf89783ce 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/LongListPreference.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/LongListPreference.java
@@ -3,7 +3,7 @@
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
-import android.preference.ListPreference;
+import androidx.preference.ListPreference;
import android.util.AttributeSet;
/**
diff --git a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/SettingsActivity.java b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/SettingsActivity.java
index 7e630741d..7b2bc31ac 100644
--- a/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/SettingsActivity.java
+++ b/app/src/main/java/fr/gaulupeau/apps/Poche/ui/preferences/SettingsActivity.java
@@ -5,11 +5,6 @@
import android.app.AlarmManager;
import android.content.DialogInterface;
import android.content.SharedPreferences;
-import android.preference.EditTextPreference;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import android.preference.PreferenceFragment;
-import androidx.appcompat.app.AlertDialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
@@ -18,8 +13,20 @@
import android.widget.TextView;
import android.widget.Toast;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AlertDialog;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.appcompat.widget.Toolbar;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.preference.EditTextPreference;
+import androidx.preference.ListPreference;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceFragmentCompat;
+
import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import fr.gaulupeau.apps.InThePoche.R;
import fr.gaulupeau.apps.Poche.App;
@@ -27,495 +34,347 @@
import fr.gaulupeau.apps.Poche.data.OperationsHelper;
import fr.gaulupeau.apps.Poche.data.Settings;
import fr.gaulupeau.apps.Poche.data.StorageHelper;
-import fr.gaulupeau.apps.Poche.events.ArticlesChangedEvent;
-import fr.gaulupeau.apps.Poche.events.EventHelper;
-import fr.gaulupeau.apps.Poche.events.FeedsChangedEvent;
import fr.gaulupeau.apps.Poche.network.ClientCredentials;
-import fr.gaulupeau.apps.Poche.network.WallabagWebService;
import fr.gaulupeau.apps.Poche.network.WallabagServiceWrapper;
+import fr.gaulupeau.apps.Poche.network.WallabagWebService;
import fr.gaulupeau.apps.Poche.network.tasks.TestApiAccessTask;
-import fr.gaulupeau.apps.Poche.service.AlarmHelper;
-import fr.gaulupeau.apps.Poche.service.ServiceHelper;
-import fr.gaulupeau.apps.Poche.ui.BaseActionBarActivity;
import fr.gaulupeau.apps.Poche.ui.Themes;
-public class SettingsActivity extends BaseActionBarActivity {
+public class SettingsActivity extends AppCompatActivity implements
+ PreferenceFragmentCompat.OnPreferenceStartFragmentCallback {
+
+ private static final String TITLE_TAG = fr.gaulupeau.apps.Poche.ui.preferences.SettingsActivity.HeaderFragment.class.getSimpleName();
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
- if(savedInstanceState == null) {
- getFragmentManager().beginTransaction()
- .replace(android.R.id.content, new SettingsFragment())
+ setContentView(R.layout.settings_activity);
+ if (savedInstanceState == null) {
+ getSupportFragmentManager()
+ .beginTransaction()
+ .replace(R.id.settings, new HeaderFragment())
.commit();
+ } else {
+ setTitle(savedInstanceState.getCharSequence(TITLE_TAG));
+ }
+ getSupportFragmentManager().addOnBackStackChangedListener(
+ new FragmentManager.OnBackStackChangedListener() {
+ @Override
+ public void onBackStackChanged() {
+ if (getSupportFragmentManager().getBackStackEntryCount() == 0) {
+ setTitle(R.string.title_activity_settings);
+ }
+ }
+ });
+
+ Toolbar toolbar = findViewById(R.id.toolbar);
+ setSupportActionBar(toolbar);
+ ActionBar actionBar = getSupportActionBar();
+ if (actionBar != null) {
+ actionBar.setDisplayHomeAsUpEnabled(true);
}
}
- public static class SettingsFragment extends PreferenceFragment
+ @Override
+ public void onSaveInstanceState(Bundle outState) {
+ super.onSaveInstanceState(outState);
+ // Save current activity title so we can set it again after a configuration change
+ outState.putCharSequence(TITLE_TAG, getTitle());
+ }
+
+ @Override
+ public boolean onSupportNavigateUp() {
+ if (getSupportFragmentManager().popBackStackImmediate()) {
+ return true;
+ }
+ return super.onSupportNavigateUp();
+ }
+
+ @Override
+ public boolean onPreferenceStartFragment(PreferenceFragmentCompat caller, Preference pref) {
+ // Instantiate the new Fragment
+ final Bundle args = pref.getExtras();
+ final Fragment fragment = getSupportFragmentManager().getFragmentFactory().instantiate(
+ getClassLoader(),
+ pref.getFragment());
+ fragment.setArguments(args);
+ fragment.setTargetFragment(caller, 0);
+ // Replace the existing Fragment with the new Fragment
+ getSupportFragmentManager().beginTransaction()
+ .replace(R.id.settings, fragment)
+ .addToBackStack(null)
+ .commit();
+ setTitle(pref.getTitle());
+ return true;
+ }
+
+ public static class HeaderFragment extends PreferenceFragmentCompat {
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.preferences, rootKey);
+
+ // Connection wizard preference appears in the root screen instead of the Connection
+ // screen
+ Preference connectionWizardPreference = findPreference(getString(R.string.pref_key_connection_wizard));
+ if (connectionWizardPreference != null) {
+ connectionWizardPreference.setOnPreferenceClickListener(preference -> {
+ Activity activity = getActivity();
+ if (activity != null) {
+ ConnectionWizardActivity.runWizard(activity, true);
+
+ activity.finish();
+ }
+ return true;
+ });
+ }
+ }
+ }
+
+ public static class ConnectionFragment extends PreferenceFragmentCompat
implements Preference.OnPreferenceClickListener,
Preference.OnPreferenceChangeListener,
SharedPreferences.OnSharedPreferenceChangeListener,
ConfigurationTestHelper.ResultHandler,
ConfigurationTestHelper.GetCredentialsHandler {
-
- private static final String TAG = SettingsFragment.class.getSimpleName();
-
- private static final int[] SUMMARIES_TO_INITIATE = {
- R.string.pref_key_connection_url,
- R.string.pref_key_connection_advanced_httpAuthUsername,
- R.string.pref_key_connection_advanced_httpAuthPassword,
- R.string.pref_key_connection_username,
- R.string.pref_key_connection_password,
- R.string.pref_key_connection_api_clientID,
- R.string.pref_key_connection_api_clientSecret,
- R.string.pref_key_ui_theme,
- R.string.pref_key_ui_article_fontSize,
- R.string.pref_key_ui_screenScrolling_percent,
- R.string.pref_key_autoSync_interval,
- R.string.pref_key_autoSync_type,
- R.string.pref_key_storage_dbPath
- };
-
private Settings settings;
- private boolean autoSyncChanged;
- private boolean oldAutoSyncEnabled;
- private long oldAutoSyncInterval;
-
- private boolean autoSyncQueueChanged;
- private boolean oldAutoSyncQueueEnabled;
-
- private boolean checkUserChanged;
private String oldUrl;
private String oldHttpAuthUsername;
private String oldUsername;
private String oldApiClientID;
- private boolean invalidateConfiguration;
- private boolean serviceWrapperReinitializationNeeded;
-
- private boolean imageCachingChanged;
- private boolean oldImageCacheEnabled;
-
- private boolean readingSpeedChanged;
- private int oldReadingSpeed;
-
- private boolean keepScreenOnChanged;
- private boolean oldkeepScreenOn;
-
- private ConfigurationTestHelper configurationTestHelper;
-
- public SettingsFragment() {}
-
@Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
-
- addPreferencesFromResource(R.xml.preferences);
-
- settings = new Settings(App.getInstance());
-
- setOnClickListener(R.string.pref_key_connection_wizard);
- setOnClickListener(R.string.pref_key_connection_autofill);
- setOnClickListener(R.string.pref_key_sync_syncTypes_description);
- setOnClickListener(R.string.pref_key_ui_disableTouch_keyCode);
- setOnClickListener(R.string.pref_key_misc_wipeDB);
-
- ListPreference themeListPreference = (ListPreference)findPreference(
- getString(R.string.pref_key_ui_theme));
- if(themeListPreference != null) {
- Themes.Theme[] themes = Themes.Theme.values();
- String[] themeEntries = new String[themes.length];
- String[] themeEntryValues = new String[themes.length];
- for(int i = 0; i < themes.length; i++) {
- themeEntries[i] = getString(themes[i].getNameId());
- themeEntryValues[i] = themes[i].toString();
- }
+ public void onGetCredentialsResult(ClientCredentials clientCredentials) {
+ setTextPreference(R.string.pref_key_connection_api_clientID,
+ clientCredentials.clientID);
+ setTextPreference(R.string.pref_key_connection_api_clientSecret,
+ clientCredentials.clientSecret);
+ }
- themeListPreference.setEntries(themeEntries);
- themeListPreference.setEntryValues(themeEntryValues);
- }
+ @Override
+ public void onGetCredentialsFail() {
+ }
- ListPreference autoSyncIntervalListPreference = (ListPreference)findPreference(
- getString(R.string.pref_key_autoSync_interval));
- if(autoSyncIntervalListPreference != null) {
- // may set arbitrary values on Android API 19+
- autoSyncIntervalListPreference.setEntries(new String[] {
- getString(R.string.pref_option_autoSync_interval_15m),
- getString(R.string.pref_option_autoSync_interval_30m),
- getString(R.string.pref_option_autoSync_interval_1h),
- getString(R.string.pref_option_autoSync_interval_12h),
- getString(R.string.pref_option_autoSync_interval_24h)
- });
- autoSyncIntervalListPreference.setEntryValues(new String[] {
- String.valueOf(AlarmManager.INTERVAL_FIFTEEN_MINUTES),
- String.valueOf(AlarmManager.INTERVAL_HALF_HOUR),
- String.valueOf(AlarmManager.INTERVAL_HOUR),
- String.valueOf(AlarmManager.INTERVAL_HALF_DAY),
- String.valueOf(AlarmManager.INTERVAL_DAY)
- });
- }
+ @Override
+ public void onConfigurationTestSuccess(String url) {
+ Log.d(TITLE_TAG, String.format("onConfigurationTestSuccess(%s)", url));
- Preference handleHttpSchemePreference = findPreference(
- getString(R.string.pref_key_misc_handleHttpScheme));
- if(handleHttpSchemePreference != null) {
- handleHttpSchemePreference.setDefaultValue(settings.isHandlingHttpScheme());
- handleHttpSchemePreference.setOnPreferenceChangeListener(this);
+ if (url != null) {
+ setTextPreference(R.string.pref_key_connection_url, url);
}
- ListPreference dbPathListPreference = (ListPreference)findPreference(
- getString(R.string.pref_key_storage_dbPath));
- if(dbPathListPreference != null) {
- List entriesList = new ArrayList<>(2);
- List entryValuesList = new ArrayList<>(2);
-
- entriesList.add(getString(R.string.pref_name_storage_dbPath_internalStorage));
- entryValuesList.add("");
-
- if(StorageHelper.isExternalStorageWritable()) {
- entriesList.add(getString(R.string.pref_name_storage_dbPath_externalStorage));
- entryValuesList.add(StorageHelper.getExternalStoragePath());
- }
-
- dbPathListPreference.setEntries(entriesList.toArray(new String[0]));
- dbPathListPreference.setEntryValues(entryValuesList.toArray(new String[0]));
-
- dbPathListPreference.setOnPreferenceChangeListener(this);
- }
+ settings.setConfigurationOk(true);
+ settings.setConfigurationErrorShown(false);
- for(int keyID: SUMMARIES_TO_INITIATE) {
- updateSummary(keyID);
- }
+ Toast.makeText(getActivity(), R.string.settings_parametersAutofilled,
+ Toast.LENGTH_SHORT).show();
}
@Override
- public void onStart() {
- super.onStart();
-
- Log.d(TAG, "onStart() started");
-
- resetChanges();
-
- settings.getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
+ public void onConnectionTestFail(WallabagWebService.ConnectionTestResult result,
+ String details) {
}
@Override
- public void onStop() {
- Log.d(TAG, "onStop() started");
-
- settings.getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
-
- if(configurationTestHelper != null) {
- configurationTestHelper.cancel();
- configurationTestHelper = null;
- }
-
- applyChanges();
-
- super.onStop();
+ public void onApiAccessTestFail(TestApiAccessTask.Result result, String details) {
}
- private void resetChanges() {
- Log.d(TAG, "resetChanges() started");
- autoSyncChanged = false;
- oldAutoSyncEnabled = settings.isAutoSyncEnabled();
- oldAutoSyncInterval = settings.getAutoSyncInterval();
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.connection_preferences, rootKey);
- autoSyncQueueChanged = false;
- oldAutoSyncQueueEnabled = settings.isAutoSyncQueueEnabled();
+ settings = new Settings(App.getInstance());
- checkUserChanged = false;
oldUrl = settings.getUrl();
oldHttpAuthUsername = settings.getHttpAuthUsername();
oldUsername = settings.getUsername();
oldApiClientID = settings.getApiClientID();
- imageCachingChanged = false;
- oldImageCacheEnabled = settings.isImageCacheEnabled();
-
- readingSpeedChanged = false;
- oldReadingSpeed = settings.getReadingSpeed();
-
- keepScreenOnChanged = false;
- oldkeepScreenOn = settings.isKeepScreenOn();
- }
- private void applyChanges() {
- Log.d(TAG, "applyChanges() started");
-
- if(autoSyncChanged) {
- autoSyncChanged = false;
- Log.d(TAG, "applyChanges() autoSyncChanged is true");
-
- boolean newAutoSyncEnabled = settings.isAutoSyncEnabled();
- long newAutoSyncInterval = settings.getAutoSyncInterval();
- if(newAutoSyncEnabled != oldAutoSyncEnabled) {
- if(newAutoSyncEnabled) {
- AlarmHelper.setAlarm(getActivity(), newAutoSyncInterval, true);
- } else {
- AlarmHelper.unsetAlarm(getActivity(), true);
- }
- } else if(newAutoSyncEnabled) {
- if(newAutoSyncInterval != oldAutoSyncInterval) {
- AlarmHelper.updateAlarmInterval(getActivity(), newAutoSyncInterval);
- }
- }
- }
-
- if(autoSyncQueueChanged) {
- autoSyncQueueChanged = false;
- Log.d(TAG, "applyChanges() autoSyncQueueChanged is true");
-
- boolean newAutoSyncQueueEnabled = settings.isAutoSyncQueueEnabled();
- if(newAutoSyncQueueEnabled != oldAutoSyncQueueEnabled) {
- if(newAutoSyncQueueEnabled) {
- if(settings.isOfflineQueuePending()) {
- Settings.enableConnectivityChangeReceiver(getActivity(), true);
- }
- } else {
- Settings.enableConnectivityChangeReceiver(getActivity(), false);
- }
- }
- }
-
- if(checkUserChanged) {
- checkUserChanged = false;
-
- boolean userChanged = false;
- if(!TextUtils.equals(settings.getUrl(), oldUrl)
- || !TextUtils.equals(settings.getUsername(), oldUsername)
- || !TextUtils.equals(settings.getApiClientID(), oldApiClientID)) {
- userChanged = true;
- } else if(!TextUtils.equals(settings.getHttpAuthUsername(), oldHttpAuthUsername)
- && (settings.getUsername() == null || settings.getUsername().isEmpty())) {
- userChanged = true;
- }
-
- if(userChanged) {
- settings.setApiRefreshToken("");
- settings.setApiAccessToken("");
-
- OperationsHelper.wipeDB(settings);
- }
- }
-
- if(invalidateConfiguration) {
- invalidateConfiguration = false;
-
- Log.i(TAG, "applyChanges() setting isConfigurationOk(false)");
- settings.setConfigurationOk(false);
- }
-
- if(serviceWrapperReinitializationNeeded) {
- serviceWrapperReinitializationNeeded = false;
-
- Log.i(TAG, "applyChanges() calling WallabagServiceWrapper.resetInstance()");
- WallabagServiceWrapper.resetInstance();
- }
-
- if(imageCachingChanged) {
- imageCachingChanged = false;
-
- if(!oldImageCacheEnabled && settings.isImageCacheEnabled()
- && settings.isFirstSyncDone()) {
- Log.i(TAG, "applyChanges() image caching changed, starting image fetching");
- ServiceHelper.fetchImages(App.getInstance());
- }
- }
-
- if(readingSpeedChanged) {
- readingSpeedChanged = false;
-
- if(oldReadingSpeed != settings.getReadingSpeed()) {
- Log.i(TAG, "applyChanges() reading speed changed, posting event");
-
- ArticlesChangedEvent event = new ArticlesChangedEvent();
- event.invalidateAll(FeedsChangedEvent.ChangeType.ESTIMATED_READING_TIME_CHANGED);
- EventHelper.postEvent(event);
- }
- }
-
- if(keepScreenOnChanged) {
- keepScreenOnChanged = false;
-
- if(!oldkeepScreenOn) {
- Log.i(TAG, "applyChanges() keep screen on changed, keep screen on");
- }
+ Preference connectionAutofillPreference = findPreference(getString(R.string.pref_key_connection_autofill));
+ if (connectionAutofillPreference != null) {
+ connectionAutofillPreference.setOnPreferenceClickListener(this);
}
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
- Log.d(TAG, String.format("onPreferenceChange(key: %s, newValue: %s)",
+ Log.d(TITLE_TAG, String.format("onPreferenceChange(key: %s, newValue: %s)",
preference.getKey(), newValue));
-
- int keyID = Settings.getPrefKeyIDByValue(preference.getKey());
- switch(keyID) {
- case R.string.pref_key_misc_handleHttpScheme:
- settings.setHandleHttpScheme((Boolean)newValue);
- break;
-
- case R.string.pref_key_storage_dbPath:
- if(TextUtils.equals(settings.getDbPath(), (String)newValue)) {
- Log.d(TAG, "onPreferenceChange() new DbPath is the same");
- } else if(settings.moveDb((String)newValue)) { // TODO: do in a background thread
- DbConnection.resetSession();
-
- Toast.makeText(getActivity(), R.string.pref_name_storage_dbPath_dbMoved,
- Toast.LENGTH_SHORT).show();
- } else {
- Log.e(TAG, "onPreferenceChange() couldn't move DB; ignoring preference change");
- return false;
- }
- break;
- }
-
return true;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- Log.d(TAG, "onSharedPreferenceChanged(" + key + ")");
+ Log.d(TITLE_TAG, "onSharedPreferenceChanged(" + key + ")");
boolean themeChanged = false;
int keyResID = Settings.getPrefKeyIDByValue(key);
- switch(keyResID) {
- case R.string.pref_key_ui_theme:
- themeChanged = true;
- break;
-
- case R.string.pref_key_autoSync_enabled:
- autoSyncChanged = true;
- break;
-
- case R.string.pref_key_autoSync_interval:
- autoSyncChanged = true;
- break;
-
- case R.string.pref_key_autoSyncQueue_enabled:
- autoSyncQueueChanged = true;
- break;
+ switch (keyResID) {
case R.string.pref_key_connection_advanced_customSSLSettings:
case R.string.pref_key_connection_url:
- Log.d(TAG, "onSharedPreferenceChanged() serviceWrapperReinitializationNeeded");
- serviceWrapperReinitializationNeeded = true;
+ Log.d(TITLE_TAG, "onSharedPreferenceChanged() serviceWrapperReinitializationNeeded");
+ Log.i(TITLE_TAG, "applyChanges() calling WallabagServiceWrapper.resetInstance()");
+ WallabagServiceWrapper.resetInstance();
case R.string.pref_key_connection_advanced_httpAuthUsername:
case R.string.pref_key_connection_advanced_httpAuthPassword:
case R.string.pref_key_connection_username:
case R.string.pref_key_connection_password:
case R.string.pref_key_connection_api_clientID:
case R.string.pref_key_connection_api_clientSecret:
- Log.i(TAG, "onSharedPreferenceChanged() invalidateConfiguration");
- invalidateConfiguration = true;
- break;
-
- case R.string.pref_key_imageCache_enabled:
- imageCachingChanged = true;
- break;
-
- case R.string.pref_key_ui_readingSpeed:
- readingSpeedChanged = true;
- break;
-
- case R.string.pref_key_ui_keepScreenOn:
- keepScreenOnChanged = true;
+ Log.i(TITLE_TAG, "onSharedPreferenceChanged() invalidateConfiguration");
break;
}
- switch(keyResID) {
+ switch (keyResID) {
case R.string.pref_key_connection_url:
case R.string.pref_key_connection_advanced_httpAuthUsername:
case R.string.pref_key_connection_username:
case R.string.pref_key_connection_api_clientID:
- checkUserChanged = true;
+ boolean userChanged = false;
+ if(!TextUtils.equals(settings.getUrl(), oldUrl)
+ || !TextUtils.equals(settings.getUsername(), oldUsername)
+ || !TextUtils.equals(settings.getApiClientID(), oldApiClientID)) {
+ userChanged = true;
+ } else if(!TextUtils.equals(settings.getHttpAuthUsername(), oldHttpAuthUsername)
+ && (settings.getUsername() == null || settings.getUsername().isEmpty())) {
+ userChanged = true;
+ }
+
+ if(userChanged) {
+ settings.setApiRefreshToken("");
+ settings.setApiAccessToken("");
+
+ OperationsHelper.wipeDB(settings);
+ }
break;
}
// not optimal :/
updateSummary(keyResID);
-
- if(themeChanged) {
- Log.d(TAG, "onSharedPreferenceChanged() theme changed");
-
- Themes.init();
-
- Activity activity = getActivity();
- if(activity != null) Themes.checkTheme(activity);
- }
}
@Override
public boolean onPreferenceClick(Preference preference) {
- switch(Settings.getPrefKeyIDByValue(preference.getKey())) {
- case R.string.pref_key_connection_wizard: {
- Activity activity = getActivity();
- if(activity != null) {
- ConnectionWizardActivity.runWizard(activity, true);
-
- activity.finish();
- }
-
- return true;
- }
+ switch (Settings.getPrefKeyIDByValue(preference.getKey())) {
case R.string.pref_key_connection_autofill: {
- configurationTestHelper = new ConfigurationTestHelper(
+ ConfigurationTestHelper configurationTestHelper = new ConfigurationTestHelper(
getActivity(), this, this, settings, false);
configurationTestHelper.test();
return true;
}
- case R.string.pref_key_sync_syncTypes_description: {
- Activity activity = getActivity();
- if(activity != null) {
- new AlertDialog.Builder(activity)
- .setTitle(R.string.pref_name_sync_syncTypes)
- .setMessage(R.string.pref_desc_sync_syncTypes_text)
- .setPositiveButton(R.string.ok, null)
- .show();
- }
- return true;
- }
- case R.string.pref_key_ui_disableTouch_keyCode: {
+ }
+
+ return false;
+ }
+
+ private void setTextPreference(int preferenceID, String value) {
+ EditTextPreference preference = (EditTextPreference)
+ findPreference(getString(preferenceID));
+
+ if (preference != null) {
+ preference.setText(value);
+ }
+ }
+
+ private void updateSummary(int keyResID) {
+// String key = getString(keyResID);
+//
+// switch (keyResID) {
+// case R.string.pref_key_connection_url:
+// EditTextPreference preference = (EditTextPreference)
+// findPreference(key);
+// if (preference != null) {
+// String value = preference.getText();
+// setSummary(key, (value == null || value.isEmpty())
+// ? getString(R.string.pref_desc_connection_url) : value);
+// }
+// break;
+//
+// case R.string.pref_key_connection_username:
+// case R.string.pref_key_connection_api_clientID:
+// case R.string.pref_key_connection_advanced_httpAuthUsername:
+// setEditTextSummaryFromContent(key);
+// break;
+// case R.string.pref_key_connection_password:
+// case R.string.pref_key_connection_api_clientSecret:
+// case R.string.pref_key_connection_advanced_httpAuthPassword:
+// setPasswordSummary(key);
+// break;
+//
+// }
+ }
+ }
+
+ public static class UIFragment extends PreferenceFragmentCompat {
+ private static final int[] SUMMARIES_TO_INITIATE = {
+ R.string.pref_key_ui_theme,
+ R.string.pref_key_ui_article_fontSize,
+ R.string.pref_key_ui_screenScrolling_percent
+ };
+
+ private Settings settings;
+
+ @Override
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.ui_preferences, rootKey);
+
+ settings = new Settings(App.getInstance());
+
+ Preference uiDisableTouchPreference = findPreference(getString(R.string.pref_key_ui_disableTouch_keyCode));
+ if (uiDisableTouchPreference != null) {
+ uiDisableTouchPreference.setOnPreferenceClickListener(preference -> {
showDisableTouchSetKeyCodeDialog();
return true;
- }
- case R.string.pref_key_misc_wipeDB: {
+ });
+ }
+
+ Preference uiThemePreference = findPreference(getString(R.string.pref_key_ui_theme));
+ if (uiThemePreference != null) {
+ uiThemePreference.setOnPreferenceChangeListener((preference, result) -> {
+ Log.d(TITLE_TAG, "onSharedPreferenceChanged() theme changed");
+
+ Themes.init();
+
Activity activity = getActivity();
- if(activity != null) {
- new AlertDialog.Builder(activity)
- .setTitle(R.string.pref_name_misc_wipeDB_confirmTitle)
- .setMessage(R.string.pref_name_misc_wipeDB_confirmMessage)
- .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialogInterface, int i) {
- OperationsHelper.wipeDB(App.getInstance().getSettings());
- }
- })
- .setNegativeButton(R.string.negative_answer, null)
- .show();
- }
+ if (activity != null) Themes.checkTheme(activity);
return true;
- }
+ });
}
- return false;
+ ListPreference themeListPreference = (ListPreference) findPreference(
+ getString(R.string.pref_key_ui_theme));
+ if (themeListPreference != null) {
+ Themes.Theme[] themes = Themes.Theme.values();
+ String[] themeEntries = new String[themes.length];
+ String[] themeEntryValues = new String[themes.length];
+ for (int i = 0; i < themes.length; i++) {
+ themeEntries[i] = getString(themes[i].getNameId());
+ themeEntryValues[i] = themes[i].toString();
+ }
+
+ themeListPreference.setEntries(themeEntries);
+ themeListPreference.setEntryValues(themeEntryValues);
+ }
}
+
private void showDisableTouchSetKeyCodeDialog() {
Activity activity = getActivity();
- if(activity != null) {
+ if (activity != null) {
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle(R.string.d_disableTouch_changeKey_title);
- @SuppressLint("InflateParams")
- final View view = activity.getLayoutInflater().inflate(R.layout.dialog_set_key, null);
- final TextView keyCodeTextView = (TextView)view.findViewById(R.id.tv_keyCode);
+ @SuppressLint("InflateParams") final View view = activity.getLayoutInflater().inflate(R.layout.dialog_set_key, null);
+ final TextView keyCodeTextView = view.findViewById(R.id.tv_keyCode);
- setIntToTextView(keyCodeTextView, settings.getDisableTouchKeyCode());
+ // Just a Int so US locale works
+ keyCodeTextView.setText(String.format(Locale.US, "%d", settings.getDisableTouchKeyCode()));
builder.setView(view);
@@ -524,7 +383,7 @@ private void showDisableTouchSetKeyCodeDialog() {
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (event.getAction() != KeyEvent.ACTION_DOWN) return false;
- setIntToTextView(keyCodeTextView, keyCode);
+ keyCodeTextView.setText(String.format(Locale.US, "%d", keyCode));
return false;
}
@@ -536,7 +395,8 @@ public void onClick(DialogInterface dialog, int which) {
try {
settings.setDisableTouchKeyCode(Integer.parseInt(
keyCodeTextView.getText().toString()));
- } catch(NumberFormatException ignored) {}
+ } catch (NumberFormatException ignored) {
+ }
}
});
builder.setNegativeButton(android.R.string.cancel, null);
@@ -545,142 +405,137 @@ public void onClick(DialogInterface dialog, int which) {
builder.show();
}
}
+ }
- @SuppressLint("SetTextI18n")
- private void setIntToTextView(TextView textView, int value) {
- textView.setText(Integer.toString(value));
- }
-
- @Override
- public void onGetCredentialsResult(ClientCredentials clientCredentials) {
- setTextPreference(R.string.pref_key_connection_api_clientID,
- clientCredentials.clientID);
- setTextPreference(R.string.pref_key_connection_api_clientSecret,
- clientCredentials.clientSecret);
- }
+ public static class SyncFragment extends PreferenceFragmentCompat {
+ private static final int[] SUMMARIES_TO_INITIATE = {
+ R.string.pref_key_autoSync_interval,
+ R.string.pref_key_autoSync_type
+ };
@Override
- public void onGetCredentialsFail() {}
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.sync_preferences, rootKey);
- @Override
- public void onConfigurationTestSuccess(String url) {
- Log.d(TAG, String.format("onConfigurationTestSuccess(%s)", url));
+ // Show sync types description dialog
+ Preference sync_type_preference = findPreference(getString(R.string.pref_key_sync_syncTypes_description));
+ if (sync_type_preference != null) {
+ sync_type_preference.setOnPreferenceClickListener(preference -> {
+ Activity activity = getActivity();
+ if (activity != null) {
+ new AlertDialog.Builder(activity)
+ .setTitle(R.string.pref_name_sync_syncTypes)
+ .setMessage(R.string.pref_desc_sync_syncTypes_text)
+ .setPositiveButton(R.string.ok, null)
+ .show();
+ }
+ return true;
+ });
+ }
- if(url != null) {
- setTextPreference(R.string.pref_key_connection_url, url);
+ // Set sync interval
+ ListPreference autoSyncIntervalListPreference = (ListPreference) findPreference(
+ getString(R.string.pref_key_autoSync_interval));
+ if (autoSyncIntervalListPreference != null) {
+ // may set arbitrary values on Android API 19+
+ autoSyncIntervalListPreference.setEntries(new String[]{
+ getString(R.string.pref_option_autoSync_interval_15m),
+ getString(R.string.pref_option_autoSync_interval_30m),
+ getString(R.string.pref_option_autoSync_interval_1h),
+ getString(R.string.pref_option_autoSync_interval_12h),
+ getString(R.string.pref_option_autoSync_interval_24h)
+ });
+ autoSyncIntervalListPreference.setEntryValues(new String[]{
+ String.valueOf(AlarmManager.INTERVAL_FIFTEEN_MINUTES),
+ String.valueOf(AlarmManager.INTERVAL_HALF_HOUR),
+ String.valueOf(AlarmManager.INTERVAL_HOUR),
+ String.valueOf(AlarmManager.INTERVAL_HALF_DAY),
+ String.valueOf(AlarmManager.INTERVAL_DAY)
+ });
}
+ }
- settings.setConfigurationOk(true);
- settings.setConfigurationErrorShown(false);
- invalidateConfiguration = false;
+ }
- Toast.makeText(getActivity(), R.string.settings_parametersAutofilled,
- Toast.LENGTH_SHORT).show();
- }
+ public static class MiscellaneousFragment extends PreferenceFragmentCompat {
+ private static final int[] SUMMARIES_TO_INITIATE = {
+ R.string.pref_key_storage_dbPath
+ };
+ private Settings settings;
@Override
- public void onConnectionTestFail(WallabagWebService.ConnectionTestResult result,
- String details) {}
+ public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+ setPreferencesFromResource(R.xml.miscellaneous_preferences, rootKey);
- @Override
- public void onApiAccessTestFail(TestApiAccessTask.Result result, String details) {}
+ settings = new Settings(App.getInstance());
- private void setOnClickListener(int keyResID) {
- Preference preference = findPreference(getString(keyResID));
- if(preference != null) {
- preference.setOnPreferenceClickListener(this);
+ Preference wipe_db_preference = findPreference(getString(R.string.pref_key_misc_wipeDB));
+ if (wipe_db_preference != null) {
+ wipe_db_preference.setOnPreferenceClickListener(preference -> {
+ Activity activity = getActivity();
+ if (activity != null) {
+ new AlertDialog.Builder(activity)
+ .setTitle(R.string.pref_name_misc_wipeDB_confirmTitle)
+ .setMessage(R.string.pref_name_misc_wipeDB_confirmMessage)
+ .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialogInterface, int i) {
+ OperationsHelper.wipeDB(App.getInstance().getSettings());
+ }
+ })
+ .setNegativeButton(R.string.negative_answer, null)
+ .show();
+ }
+ return true;
+ });
}
- }
- private void setTextPreference(int preferenceID, String value) {
- EditTextPreference preference = (EditTextPreference)
- findPreference(getString(preferenceID));
- if(preference != null) {
- preference.setText(value);
+ Preference handleHttpSchemePreference = findPreference(
+ getString(R.string.pref_key_misc_handleHttpScheme));
+ if (handleHttpSchemePreference != null) {
+ handleHttpSchemePreference.setDefaultValue(settings.isHandlingHttpScheme());
+ handleHttpSchemePreference.setOnPreferenceChangeListener((preference, newValue) -> {
+ settings.setHandleHttpScheme((Boolean) newValue);
+ return true;
+ });
}
- }
- private void updateSummary(int keyResID) {
- String key = getString(keyResID);
+ ListPreference dbPathListPreference = (ListPreference) findPreference(
+ getString(R.string.pref_key_storage_dbPath));
+ if (dbPathListPreference != null) {
+ List entriesList = new ArrayList<>(2);
+ List entryValuesList = new ArrayList<>(2);
- switch(keyResID) {
- case R.string.pref_key_connection_url:
- EditTextPreference preference = (EditTextPreference)
- findPreference(key);
- if(preference != null) {
- String value = preference.getText();
- setSummary(key, (value == null || value.isEmpty())
- ? getString(R.string.pref_desc_connection_url) : value);
- }
- break;
+ entriesList.add(getString(R.string.pref_name_storage_dbPath_internalStorage));
+ entryValuesList.add("");
- case R.string.pref_key_connection_username:
- case R.string.pref_key_connection_api_clientID:
- case R.string.pref_key_connection_advanced_httpAuthUsername:
- case R.string.pref_key_ui_article_fontSize:
- case R.string.pref_key_ui_screenScrolling_percent:
- setEditTextSummaryFromContent(key);
- break;
+ if (StorageHelper.isExternalStorageWritable()) {
+ entriesList.add(getString(R.string.pref_name_storage_dbPath_externalStorage));
+ entryValuesList.add(StorageHelper.getExternalStoragePath());
+ }
- case R.string.pref_key_ui_theme:
- case R.string.pref_key_autoSync_interval:
- case R.string.pref_key_autoSync_type:
- setListSummaryFromContent(key);
- break;
+ dbPathListPreference.setEntries(entriesList.toArray(new String[0]));
+ dbPathListPreference.setEntryValues(entryValuesList.toArray(new String[0]));
- case R.string.pref_key_connection_password:
- case R.string.pref_key_connection_api_clientSecret:
- case R.string.pref_key_connection_advanced_httpAuthPassword:
- setPasswordSummary(key);
- break;
+ dbPathListPreference.setOnPreferenceChangeListener((preference, newValue) -> {
+ if (TextUtils.equals(settings.getDbPath(), (String) newValue)) {
+ Log.d(TITLE_TAG, "onPreferenceChange() new DbPath is the same");
+ } else if (settings.moveDb((String) newValue)) { // TODO: do in a background thread
+ DbConnection.resetSession();
- case R.string.pref_key_storage_dbPath:
- ListPreference dbPathListPreference = (ListPreference)findPreference(
- getString(R.string.pref_key_storage_dbPath));
- if(dbPathListPreference != null) {
- CharSequence value = dbPathListPreference.getEntry();
- if(TextUtils.isEmpty(value)) {
- dbPathListPreference.setSummary(R.string.pref_name_storage_dbPath_internalStorage);
- } else if(value.equals(StorageHelper.getExternalStoragePath())) {
- dbPathListPreference.setSummary(R.string.pref_name_storage_dbPath_externalStorage);
- } else {
- dbPathListPreference.setSummary(value);
- }
+ Toast.makeText(getActivity(), R.string.pref_name_storage_dbPath_dbMoved,
+ Toast.LENGTH_SHORT).show();
+ } else {
+ Log.e(TITLE_TAG, "onPreferenceChange() couldn't move DB; ignoring preference change");
+ return false;
}
- break;
- }
- }
-
- private void setSummary(String key, String text) {
- Preference preference = findPreference(key);
- if(preference != null) {
- preference.setSummary(text);
- }
- }
-
- private void setEditTextSummaryFromContent(String key) {
- EditTextPreference preference = (EditTextPreference)findPreference(key);
- if(preference != null) {
- preference.setSummary(preference.getText());
- }
- }
-
- private void setListSummaryFromContent(String key) {
- ListPreference preference = (ListPreference)findPreference(key);
- if(preference != null) {
- preference.setSummary(preference.getEntry());
+ return true;
+ });
}
}
- private void setPasswordSummary(String key) {
- EditTextPreference preference = (EditTextPreference)findPreference(key);
- if(preference != null) {
- String value = preference.getText();
- preference.setSummary(value == null || value.isEmpty() ? "" : "********");
- }
- }
}
diff --git a/app/src/main/res/anim/bottom_sheet_slide_in.xml b/app/src/main/res/anim/bottom_sheet_slide_in.xml
new file mode 100644
index 000000000..75b489191
--- /dev/null
+++ b/app/src/main/res/anim/bottom_sheet_slide_in.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/anim/bottom_sheet_slide_out.xml b/app/src/main/res/anim/bottom_sheet_slide_out.xml
new file mode 100644
index 000000000..465f9730e
--- /dev/null
+++ b/app/src/main/res/anim/bottom_sheet_slide_out.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable-hdpi/ic_action_next_item.png b/app/src/main/res/drawable-hdpi/ic_action_next_item.png
deleted file mode 100644
index fc998a511..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_action_next_item.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_previous_item.png b/app/src/main/res/drawable-hdpi/ic_action_previous_item.png
deleted file mode 100644
index 10fcec8a6..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_action_previous_item.png and /dev/null differ
diff --git a/app/src/main/res/drawable-hdpi/ic_action_refresh.png b/app/src/main/res/drawable-hdpi/ic_action_refresh.png
deleted file mode 100644
index dae27903e..000000000
Binary files a/app/src/main/res/drawable-hdpi/ic_action_refresh.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/ic_action_refresh.png b/app/src/main/res/drawable-mdpi/ic_action_refresh.png
deleted file mode 100644
index 94ab6f4c5..000000000
Binary files a/app/src/main/res/drawable-mdpi/ic_action_refresh.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/welcome.png b/app/src/main/res/drawable-mdpi/welcome.png
deleted file mode 100755
index 8aeb2b3d7..000000000
Binary files a/app/src/main/res/drawable-mdpi/welcome.png and /dev/null differ
diff --git a/app/src/main/res/drawable-mdpi/welcome_white.png b/app/src/main/res/drawable-mdpi/welcome_white.png
deleted file mode 100755
index 1919b2a8c..000000000
Binary files a/app/src/main/res/drawable-mdpi/welcome_white.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_action_refresh.png b/app/src/main/res/drawable-xhdpi/ic_action_refresh.png
deleted file mode 100644
index ab4ab9da6..000000000
Binary files a/app/src/main/res/drawable-xhdpi/ic_action_refresh.png and /dev/null differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png b/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png
deleted file mode 100644
index 44ee117ee..000000000
Binary files a/app/src/main/res/drawable-xxhdpi/ic_action_refresh.png and /dev/null differ
diff --git a/app/src/main/res/drawable/ic_account_circle_24dp.xml b/app/src/main/res/drawable/ic_account_circle_24dp.xml
new file mode 100644
index 000000000..3e6344ab0
--- /dev/null
+++ b/app/src/main/res/drawable/ic_account_circle_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_add_black_24dp.xml b/app/src/main/res/drawable/ic_add_24dp.xml
similarity index 78%
rename from app/src/main/res/drawable/ic_add_black_24dp.xml
rename to app/src/main/res/drawable/ic_add_24dp.xml
index 0258249cc..c443e922b 100644
--- a/app/src/main/res/drawable/ic_add_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_add_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_before_24dp.xml b/app/src/main/res/drawable/ic_before_24dp.xml
new file mode 100644
index 000000000..e794c28de
--- /dev/null
+++ b/app/src/main/res/drawable/ic_before_24dp.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_cloud_24dp.xml b/app/src/main/res/drawable/ic_cloud_24dp.xml
new file mode 100644
index 000000000..c11445a0b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_cloud_24dp.xml
@@ -0,0 +1,10 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_delete_black_24dp.xml b/app/src/main/res/drawable/ic_delete_24dp.xml
similarity index 81%
rename from app/src/main/res/drawable/ic_delete_black_24dp.xml
rename to app/src/main/res/drawable/ic_delete_24dp.xml
index 39e64d698..192880452 100644
--- a/app/src/main/res/drawable/ic_delete_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_delete_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_done_24dp.xml b/app/src/main/res/drawable/ic_done_24dp.xml
new file mode 100644
index 000000000..c108a0bd7
--- /dev/null
+++ b/app/src/main/res/drawable/ic_done_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_done_black_24dp.xml b/app/src/main/res/drawable/ic_done_black_24dp.xml
deleted file mode 100644
index 83ee7bb4e..000000000
--- a/app/src/main/res/drawable/ic_done_black_24dp.xml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_done_solarized_24dp.xml b/app/src/main/res/drawable/ic_done_solarized_24dp.xml
deleted file mode 100644
index 7196f0d21..000000000
--- a/app/src/main/res/drawable/ic_done_solarized_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_done_white_24dp.xml b/app/src/main/res/drawable/ic_done_white_24dp.xml
deleted file mode 100644
index 6541ee3e3..000000000
--- a/app/src/main/res/drawable/ic_done_white_24dp.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
diff --git a/app/src/main/res/drawable/ic_fast_forward_24dp.xml b/app/src/main/res/drawable/ic_fast_forward_24dp.xml
index fd9249f61..f80224d03 100644
--- a/app/src/main/res/drawable/ic_fast_forward_24dp.xml
+++ b/app/src/main/res/drawable/ic_fast_forward_24dp.xml
@@ -1,8 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:tint="?colorOnSurface"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
diff --git a/app/src/main/res/drawable/ic_fast_rewind_24dp.xml b/app/src/main/res/drawable/ic_fast_rewind_24dp.xml
index 6d7685e7a..15c5d39c3 100644
--- a/app/src/main/res/drawable/ic_fast_rewind_24dp.xml
+++ b/app/src/main/res/drawable/ic_fast_rewind_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_favorite_24dp.xml b/app/src/main/res/drawable/ic_favorite_24dp.xml
new file mode 100644
index 000000000..8b28112a4
--- /dev/null
+++ b/app/src/main/res/drawable/ic_favorite_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_favorite_outline_24dp.xml b/app/src/main/res/drawable/ic_favorite_outline_24dp.xml
new file mode 100644
index 000000000..024b2911b
--- /dev/null
+++ b/app/src/main/res/drawable/ic_favorite_outline_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_file_download_24dp.xml b/app/src/main/res/drawable/ic_file_download_24dp.xml
index e43b8645a..6fd93116b 100644
--- a/app/src/main/res/drawable/ic_file_download_24dp.xml
+++ b/app/src/main/res/drawable/ic_file_download_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_info_outline_black_24dp.xml b/app/src/main/res/drawable/ic_info_outline_24dp.xml
similarity index 67%
rename from app/src/main/res/drawable/ic_info_outline_black_24dp.xml
rename to app/src/main/res/drawable/ic_info_outline_24dp.xml
index cf53e145c..3f66d8d8b 100644
--- a/app/src/main/res/drawable/ic_info_outline_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_info_outline_24dp.xml
@@ -1,8 +1,9 @@
+ android:width="24dp"
+ android:height="24dp"
+ android:tint="?colorOnSurface"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
diff --git a/app/src/main/res/drawable/ic_list_black_24dp.xml b/app/src/main/res/drawable/ic_list_24dp.xml
similarity index 82%
rename from app/src/main/res/drawable/ic_list_black_24dp.xml
rename to app/src/main/res/drawable/ic_list_24dp.xml
index 4c2fb8834..6e32ba49d 100644
--- a/app/src/main/res/drawable/ic_list_black_24dp.xml
+++ b/app/src/main/res/drawable/ic_list_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_mark_unread_24dp.xml b/app/src/main/res/drawable/ic_mark_unread_24dp.xml
new file mode 100644
index 000000000..daf9f20ca
--- /dev/null
+++ b/app/src/main/res/drawable/ic_mark_unread_24dp.xml
@@ -0,0 +1,6 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_24dp.xml b/app/src/main/res/drawable/ic_menu_24dp.xml
index 84b1d3b4f..098986543 100644
--- a/app/src/main/res/drawable/ic_menu_24dp.xml
+++ b/app/src/main/res/drawable/ic_menu_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_messages_24dp.xml b/app/src/main/res/drawable/ic_messages_24dp.xml
new file mode 100644
index 000000000..d75652b6f
--- /dev/null
+++ b/app/src/main/res/drawable/ic_messages_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_more_horiz_24dp.xml b/app/src/main/res/drawable/ic_more_horiz_24dp.xml
index 2acd55b29..dab5b236e 100644
--- a/app/src/main/res/drawable/ic_more_horiz_24dp.xml
+++ b/app/src/main/res/drawable/ic_more_horiz_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_musical_notes_24dp.xml b/app/src/main/res/drawable/ic_musical_notes_24dp.xml
index 8b3bd637d..d3dc6cabc 100644
--- a/app/src/main/res/drawable/ic_musical_notes_24dp.xml
+++ b/app/src/main/res/drawable/ic_musical_notes_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_next_24dp.xml b/app/src/main/res/drawable/ic_next_24dp.xml
new file mode 100644
index 000000000..64ea74687
--- /dev/null
+++ b/app/src/main/res/drawable/ic_next_24dp.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_play_arrow_24dp.xml b/app/src/main/res/drawable/ic_play_arrow_24dp.xml
index bf9b895ac..805761b0e 100644
--- a/app/src/main/res/drawable/ic_play_arrow_24dp.xml
+++ b/app/src/main/res/drawable/ic_play_arrow_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_redo_24dp.xml b/app/src/main/res/drawable/ic_redo_24dp.xml
index 424e788f5..e6b5bcf19 100644
--- a/app/src/main/res/drawable/ic_redo_24dp.xml
+++ b/app/src/main/res/drawable/ic_redo_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
diff --git a/app/src/main/res/drawable/ic_refresh_24dp.xml b/app/src/main/res/drawable/ic_refresh_24dp.xml
new file mode 100644
index 000000000..32550e832
--- /dev/null
+++ b/app/src/main/res/drawable/ic_refresh_24dp.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_running_24dp.xml b/app/src/main/res/drawable/ic_running_24dp.xml
index e88d5160f..3e5c2df0e 100644
--- a/app/src/main/res/drawable/ic_running_24dp.xml
+++ b/app/src/main/res/drawable/ic_running_24dp.xml
@@ -2,7 +2,8 @@
android:width="24dp"
android:height="24dp"
android:viewportWidth="24.0"
- android:viewportHeight="24.0">
+ android:viewportHeight="24.0"
+ android:tint="?colorOnSurface">
+
+
+
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 07aba89fe..4c984e8b0 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -6,7 +6,7 @@
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:fitsSystemWindows="true"
+ android:theme="@style/ThemeOverlay.MyTheme.NavigationView"
tools:openDrawer="start">
-
-
+
-
-
-
-
-
-
-
+ android:layout_height="wrap_content"
+ app:layout_scrollFlags="scroll|enterAlways"
+ app:titleTextColor="?colorOnBackground" />
diff --git a/app/src/main/res/layout/article.xml b/app/src/main/res/layout/article.xml
index 75ae797ff..6e8d599d8 100644
--- a/app/src/main/res/layout/article.xml
+++ b/app/src/main/res/layout/article.xml
@@ -1,29 +1,49 @@
-
-
+
+
+
+
+
+
+
+ tools:ignore="UselessParent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
-
-
-
-
@@ -89,6 +105,8 @@
-
+
+
+
+
-
diff --git a/app/src/main/res/layout/connection_wizard_framabag_config_fragment.xml b/app/src/main/res/layout/connection_wizard_framabag_config_fragment.xml
index 0e823a780..754c937fb 100644
--- a/app/src/main/res/layout/connection_wizard_framabag_config_fragment.xml
+++ b/app/src/main/res/layout/connection_wizard_framabag_config_fragment.xml
@@ -1,5 +1,6 @@
-
-
+ android:layout_height="wrap_content">
-
+ android:gravity="start"
+ android:paddingBottom="20dp"
+ android:text="@string/connectionWizard_provider_framabag_titleMessage"
+ android:textAppearance="?textAppearanceHeadline3" />
-
-
-
+
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/connection_wizard_generic_config_fragment.xml b/app/src/main/res/layout/connection_wizard_generic_config_fragment.xml
index cca51dd2e..7912a39e5 100644
--- a/app/src/main/res/layout/connection_wizard_generic_config_fragment.xml
+++ b/app/src/main/res/layout/connection_wizard_generic_config_fragment.xml
@@ -1,5 +1,6 @@
-
-
+ android:layout_height="wrap_content">
-
+ android:gravity="start"
+ android:paddingBottom="20dp"
+ android:text="@string/connectionWizard_provider_general_titleMessage"
+ android:textAppearance="?textAppearanceHeadline3" />
-
+
-
+ android:layout_marginBottom="16dp"
+ android:orientation="horizontal"
+ android:layout_gravity="bottom">
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/connection_wizard_provider_selection_fragment.xml b/app/src/main/res/layout/connection_wizard_provider_selection_fragment.xml
index 1936f8c88..a46e39d1d 100644
--- a/app/src/main/res/layout/connection_wizard_provider_selection_fragment.xml
+++ b/app/src/main/res/layout/connection_wizard_provider_selection_fragment.xml
@@ -1,13 +1,13 @@
-
-
+ android:layout_height="wrap_content">
-
+ android:layout_marginBottom="20dp"
+ android:gravity="start"
+ android:text="@string/connectionWizard_providerSelection_titleMessage"
+ android:textAppearance="?textAppearanceHeadline3" />
-
+ android:text="@string/connectionWizard_providerSelection_provider_general_desc"
+ android:textAppearance="?textAppearanceCaption" />
-
-
-
+
+ android:layout_marginBottom="16dp"
+ android:orientation="horizontal"
+ android:layout_gravity="bottom">
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/connection_wizard_summary_fragment.xml b/app/src/main/res/layout/connection_wizard_summary_fragment.xml
index c9096ff89..f50f50d1a 100644
--- a/app/src/main/res/layout/connection_wizard_summary_fragment.xml
+++ b/app/src/main/res/layout/connection_wizard_summary_fragment.xml
@@ -1,13 +1,13 @@
-
-
+ android:layout_height="wrap_content">
+ android:layout_marginBottom="20dp"
+ android:gravity="start"
+ android:text="@string/connectionWizard_summary_titleMessage"
+ android:textAppearance="?textAppearanceHeadline3" />
+ android:gravity="start"
+ android:text="@string/connectionWizard_summary_text"
+ android:textAppearance="?textAppearanceSubtitle1" />
-
+
-
+ android:layout_marginBottom="16dp"
+ android:orientation="horizontal"
+ android:layout_gravity="bottom">
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/connection_wizard_wallabagit_config_fragment.xml b/app/src/main/res/layout/connection_wizard_wallabagit_config_fragment.xml
index 89570f097..563943191 100644
--- a/app/src/main/res/layout/connection_wizard_wallabagit_config_fragment.xml
+++ b/app/src/main/res/layout/connection_wizard_wallabagit_config_fragment.xml
@@ -1,5 +1,6 @@
-
-
+ android:layout_height="wrap_content" >
+ android:gravity="start"
+ android:paddingBottom="20dp"
+ android:text="@string/connectionWizard_provider_wallabagit_titleMessage"
+ android:textAppearance="?textAppearanceHeadline3" />
-
-
-
+
-
+ android:layout_marginBottom="16dp"
+ android:orientation="horizontal"
+ android:layout_gravity="bottom">
-
-
-
-
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/connection_wizard_welcome_fragment.xml b/app/src/main/res/layout/connection_wizard_welcome_fragment.xml
index c260ee541..53a3db022 100644
--- a/app/src/main/res/layout/connection_wizard_welcome_fragment.xml
+++ b/app/src/main/res/layout/connection_wizard_welcome_fragment.xml
@@ -1,14 +1,14 @@
-
-
+ android:layout_height="wrap_content">
-
+ android:layout_margin="20dp"
+ android:gravity="start"
+ android:text="@string/connectionWizard_welcome_titleMessage"
+ android:textAppearance="?textAppearanceHeadline3" />
-
-
-
+
-
+ android:layout_marginBottom="16dp"
+ android:orientation="horizontal"
+ android:layout_gravity="bottom">
-
-
-
-
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_add.xml b/app/src/main/res/layout/dialog_add.xml
index b82c5b7fa..9b891bd19 100644
--- a/app/src/main/res/layout/dialog_add.xml
+++ b/app/src/main/res/layout/dialog_add.xml
@@ -4,7 +4,7 @@
android:padding="16dp"
android:layout_height="wrap_content">
-
-
-
+
+
diff --git a/app/src/main/res/layout/dialog_set_key.xml b/app/src/main/res/layout/dialog_set_key.xml
index e3bcb44eb..4ef0a53f7 100644
--- a/app/src/main/res/layout/dialog_set_key.xml
+++ b/app/src/main/res/layout/dialog_set_key.xml
@@ -5,21 +5,20 @@
android:padding="16dp"
android:orientation="vertical">
-
-
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_title_url.xml b/app/src/main/res/layout/dialog_title_url.xml
index 187f7261e..58675bf83 100644
--- a/app/src/main/res/layout/dialog_title_url.xml
+++ b/app/src/main/res/layout/dialog_title_url.xml
@@ -6,8 +6,8 @@
\ No newline at end of file
diff --git a/app/src/main/res/layout/fragment_article_lists.xml b/app/src/main/res/layout/fragment_article_lists.xml
index f083eb5e1..09d94b8e0 100644
--- a/app/src/main/res/layout/fragment_article_lists.xml
+++ b/app/src/main/res/layout/fragment_article_lists.xml
@@ -1,7 +1,8 @@
+ android:layout_height="wrap_content"
+ app:layout_scrollFlags="scroll|enterAlways"
+ android:elevation="4dp"
+ />
+
+
-
+ android:layout_height="match_parent"
+ android:orientation="vertical"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
-
-
+ android:orientation="vertical">
-
+ android:layout_gravity="center"
+ android:orientation="horizontal">
+ android:src="@drawable/ic_running_24dp" />
-
-
-
+ android:layout_gravity="center"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
-
+ android:layout_height="match_parent"
+ android:orientation="horizontal">
+ android:src="@drawable/ic_musical_notes_24dp" />
-
+ android:textAppearance="?android:attr/textAppearanceSmall" />
-
-
+ android:layout_column="1"
+ android:layout_gravity="center"
+ android:layout_weight="0.9"
+ android:contentDescription="@string/ttsPitch"
+ android:paddingTop="10sp"
+ android:paddingBottom="10sp" />
+
-
+ android:visibility="visible"
+ android:orientation="horizontal">
+ android:src="@drawable/ic_volume_up_24dp" />
-
+
+
+
-
-
-
-
+ android:orientation="horizontal">
+ android:contentDescription="TODO"
+ android:src="@drawable/ic_snooze_24dp" />
+ android:layout_gravity="center"
+ android:layout_weight="0.9" />
-
-
-
+ android:layout_gravity="center"
+ android:textAppearance="?android:attr/textAppearanceSmall" />
+
-
+
+
-
+
+
+ android:paddingHorizontal="16dp">
+
-
+
-
-
-
+ android:paddingHorizontal="16dp">
-
+
-
+
+
+
-
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom"
+ android:gravity="center_horizontal"
+ android:orientation="horizontal"
+ android:paddingHorizontal="16dp">
-
+ android:contentDescription="@string/ttsFastRewind"
+ android:icon="@drawable/ic_fast_rewind_24dp"
+ app:iconTint="#00000000" />
-
+ android:contentDescription="@string/ttsPlayPause"
+ android:icon="@drawable/ic_play_arrow_24dp" />
-
+ android:contentDescription="@string/ttsFastForward"
+ android:icon="@drawable/ic_fast_forward_24dp" />
-
+ android:contentDescription="@string/ttsOptions"
+ android:src="@drawable/ic_menu_24dp"
+ app:iconTint="@color/colorPrimary" />
+
-
+
+
+
+
+
-
+
diff --git a/app/src/main/res/layout/list_item.xml b/app/src/main/res/layout/list_item.xml
index aecaffe4d..fb658cdc7 100644
--- a/app/src/main/res/layout/list_item.xml
+++ b/app/src/main/res/layout/list_item.xml
@@ -17,22 +17,21 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Medium Text"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:textColor="?android:attr/textColorPrimary"/>
+ android:textAppearance="?textAppearanceSubtitle1"/>
+ android:src="@drawable/ic_favorite_24dp"/>
+ android:src="@drawable/ic_list_24dp"/>
+ android:text="New Text"
+ android:textAppearance="?textAppearanceCaption"/>
\ No newline at end of file
diff --git a/app/src/main/res/layout/nav_header_main.xml b/app/src/main/res/layout/nav_header_main.xml
index 66a292002..84ee09f6c 100644
--- a/app/src/main/res/layout/nav_header_main.xml
+++ b/app/src/main/res/layout/nav_header_main.xml
@@ -1,33 +1,33 @@
+ android:padding="@dimen/keyline_4">
+ android:textAppearance="?textAppearanceBody2"
+ android:layout_marginTop="@dimen/keyline_1"
+ android:layout_marginBottom="@dimen/keyline_2"
+ android:text="@string/lastUpdateTimeLabel"
+ android:alpha="?alphaEmphasisMedium"/>
diff --git a/app/src/main/res/layout/settings_activity.xml b/app/src/main/res/layout/settings_activity.xml
new file mode 100644
index 000000000..a7a7ccfdc
--- /dev/null
+++ b/app/src/main/res/layout/settings_activity.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/tag_list_item.xml b/app/src/main/res/layout/tag_list_item.xml
index be928ab99..054528c7c 100644
--- a/app/src/main/res/layout/tag_list_item.xml
+++ b/app/src/main/res/layout/tag_list_item.xml
@@ -3,15 +3,13 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
- android:padding="10dp"
- android:background="?attr/selectableItemBackground">
+ android:padding="10dp">
+ android:textAppearance="?textAppearanceSubtitle1" />
diff --git a/app/src/main/res/layout/tag_list_removable_item.xml b/app/src/main/res/layout/tag_list_removable_item.xml
index c0254afcd..be3b0bba6 100644
--- a/app/src/main/res/layout/tag_list_removable_item.xml
+++ b/app/src/main/res/layout/tag_list_removable_item.xml
@@ -1,25 +1,28 @@
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:orientation="horizontal"
+ android:padding="10dp"
+ android:background="?attr/selectableItemBackground"
+ android:gravity="center_vertical">
-
+ android:textAppearance="?textAppearanceSubtitle1" />
-
+ android:gravity="center"
+ app:icon="@drawable/ic_delete_24dp"/>
diff --git a/app/src/main/res/menu/activity_manage_tags.xml b/app/src/main/res/menu/activity_manage_tags.xml
index 1dff149bd..434fd2b1c 100644
--- a/app/src/main/res/menu/activity_manage_tags.xml
+++ b/app/src/main/res/menu/activity_manage_tags.xml
@@ -6,7 +6,7 @@
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
index c2c7ea52a..0ff85912c 100644
--- a/app/src/main/res/menu/main.xml
+++ b/app/src/main/res/menu/main.xml
@@ -4,14 +4,14 @@
+ android:title="@string/menuCopyOriginalURL"
+ />
diff --git a/app/src/main/res/raw/webview_htmlbase.html b/app/src/main/res/raw/webview_htmlbase.html
index f1f11c6cc..c2d588bf9 100644
--- a/app/src/main/res/raw/webview_htmlbase.html
+++ b/app/src/main/res/raw/webview_htmlbase.html
@@ -1,3 +1,4 @@
+
@@ -10,13 +11,17 @@
- %3$s
-
- %5$s
- %6$s
+ %3$s
+
+
+ %5$s
+
+ %6$s
+
+ %7$s
- %7$s
+ %8$s
diff --git a/app/src/main/res/values-night/color.xml b/app/src/main/res/values-night/color.xml
new file mode 100644
index 000000000..a62196afb
--- /dev/null
+++ b/app/src/main/res/values-night/color.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+ #bb86fc
+ #4b01d0
+ #03dac6
+ #018786
+
+ #000000
+ #121212
+ #cf6679
+
+ #000000
+ #000000
+ #ffffff
+ #ffffff
+ #000000
+
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
new file mode 100644
index 000000000..2eaf29a80
--- /dev/null
+++ b/app/src/main/res/values-night/themes.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
index 82499d05c..a07f42d32 100644
--- a/app/src/main/res/values-v21/styles.xml
+++ b/app/src/main/res/values-v21/styles.xml
@@ -1,66 +1,66 @@
-
+
+
+
+
+
+
-
+
+
+
+
+
+
-
+
+
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml
index 7eb65fad1..8a83cc3c6 100644
--- a/app/src/main/res/values/arrays.xml
+++ b/app/src/main/res/values/arrays.xml
@@ -27,4 +27,14 @@
- XML
- CSV
+
+
+ - Reply
+ - Reply to all
+
+
+
+ - reply
+ - reply_all
+
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
new file mode 100644
index 000000000..2174fa913
--- /dev/null
+++ b/app/src/main/res/values/attrs.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/color.xml b/app/src/main/res/values/color.xml
new file mode 100644
index 000000000..83f318d59
--- /dev/null
+++ b/app/src/main/res/values/color.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ #000000
+ #ffffff
+ #4E0D3A
+ #6B38FB
+ #018786
+
+
+
+
+
+ #ffffff
+ #ffffff
+ #C5032B
+
+
+
+ #ffffff
+ #ffffff
+ #442B2D
+ #442B2D
+ #FFFBFA
+
+
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 400893e01..cf449d382 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -17,6 +17,8 @@
#2aa198
#859900
#000000
- #FFFFFF
+ #ffffff
#9c9c9c
+ #ffffff
+
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 9953c8521..86e5544d0 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -12,4 +12,23 @@ Refer to App Widget Documentation for margin information
http://developer.android.com/guide/topics/appwidgets/index.html#CreatingLayout
-->
8dp
-
+
+
+
+ 2dp
+ 4dp
+ 8dp
+ 16dp
+ 24dp
+
+ @dimen/keyline_4
+
+ 4dp
+
+
+ @dimen/mtrl_emphasis_high_type
+ @dimen/mtrl_emphasis_medium
+ @dimen/mtrl_emphasis_disabled
+
+ 192dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/drawables.xml b/app/src/main/res/values/drawables.xml
index a7d08dd73..06a7f5ef6 100644
--- a/app/src/main/res/values/drawables.xml
+++ b/app/src/main/res/values/drawables.xml
@@ -1,9 +1,9 @@
- - @drawable/ic_list_black_24dp
- - @drawable/ic_tag_black_24dp
- - @drawable/ic_list_black_24dp
- - @drawable/ic_add_black_24dp
- - @drawable/ic_settings_black_24dp
- - @drawable/ic_info_outline_black_24dp
+ - @drawable/ic_list_24dp
+ - @drawable/ic_tag_24dp
+ - @drawable/ic_list_24dp
+ - @drawable/ic_add_24dp
+ - @drawable/ic_settings_24dp
+ - @drawable/ic_info_outline_24dp
diff --git a/app/src/main/res/values/font_certs.xml b/app/src/main/res/values/font_certs.xml
new file mode 100644
index 000000000..aabbebf00
--- /dev/null
+++ b/app/src/main/res/values/font_certs.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ - @array/com_google_android_gms_fonts_certs_dev
+ - @array/com_google_android_gms_fonts_certs_prod
+
+
+ -
+ MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
+
+
+
+ -
+ MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
+
+
+
diff --git a/app/src/main/res/values/ic_launcher_background.xml b/app/src/main/res/values/ic_launcher_background.xml
new file mode 100644
index 000000000..62139b232
--- /dev/null
+++ b/app/src/main/res/values/ic_launcher_background.xml
@@ -0,0 +1,20 @@
+
+
+
+
+ #FFFFFF
+
diff --git a/app/src/main/res/values/motion.xml b/app/src/main/res/values/motion.xml
new file mode 100644
index 000000000..cdf173897
--- /dev/null
+++ b/app/src/main/res/values/motion.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/preloaded_fonts.xml b/app/src/main/res/values/preloaded_fonts.xml
new file mode 100644
index 000000000..8c6d1e48c
--- /dev/null
+++ b/app/src/main/res/values/preloaded_fonts.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+ - @font/roboto_black_italic
+
+
diff --git a/app/src/main/res/values/shape.xml b/app/src/main/res/values/shape.xml
new file mode 100644
index 000000000..94d5d79c1
--- /dev/null
+++ b/app/src/main/res/values/shape.xml
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index e9d10989b..49cdca12a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -255,23 +255,19 @@
12 hours
24 hours
Auto-sync type
-
- - Fast
- - Full
-
Separate auto-sync for local changes
This allows local changes (added links, archived articles, etc.) to be synced to the server as soon as network becomes available.
Download newly added articles
Automatically download new articles right after they were added via the app. Note: Fetching will not occur if you have unsynchronized offline changes.
Put article images in cache
Automatically downloads all images from every article and saves them to the device. Depending on the length of your wallabag article list, this can take up a lot of time and space.
-
Database location
+
Internal storage
External storage
Database moved
-
Miscellaneous
+
Append wallabag mention
Append \"via @wallabagapp\" to shared texts
Handle HTTP scheme
@@ -280,16 +276,16 @@
Wipes all the articles from local database, also removes all not synchronized local changes and URLs
Wipe Database?
Are you sure you want to wipe the database?
-
Incorrect connection URI used
Welcome to wallabag.
+
Before you can use wallabag app you need to set up a connection. The connection wizard will help you do so.
You can always re-run the connection wizard from \"Settings\".
Skip
Next
-
Select wallabag provider
+
Other
Select this to input required settings manually
wallabag.it
@@ -298,23 +294,43 @@
Select this if you have an account on https://framabag.org
Skip
Next
-
Basic configuration
+
Back
Connect
-
wallabag.it configuration
+
Back
Connect
-
Framabag configuration
+
Back
Connect
-
All done.
+
Click to save and go to the main screen.
Setup complete
Back
Save settings
Remove tag
-
+ Settings
+ Messages
+
+
+ Sync
+ Your signature
+
+
+ Default reply action
+ Sync email periodically
+
+
+ Download incoming attachments
+ Automatically download attachments for incoming emails
+
+ Only download attachments when manually requested
+
+ - Fast
+ - Full
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index e88eff2d9..a9366cd86 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,127 +1,76 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
new file mode 100644
index 000000000..c7c9605a5
--- /dev/null
+++ b/app/src/main/res/values/themes.xml
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/type.xml b/app/src/main/res/values/type.xml
new file mode 100644
index 000000000..349a41cc6
--- /dev/null
+++ b/app/src/main/res/values/type.xml
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/connection_preferences.xml b/app/src/main/res/xml/connection_preferences.xml
new file mode 100644
index 000000000..6b93ace57
--- /dev/null
+++ b/app/src/main/res/xml/connection_preferences.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/icon_unread_info.xml b/app/src/main/res/xml/icon_unread_info.xml
index 39f15dbbf..bcd32cb2f 100644
--- a/app/src/main/res/xml/icon_unread_info.xml
+++ b/app/src/main/res/xml/icon_unread_info.xml
@@ -6,4 +6,5 @@
android:minWidth="40dp"
android:previewImage="@drawable/icon"
android:updatePeriodMillis="86400000"
- android:widgetCategory="home_screen" />
\ No newline at end of file
+ android:widgetCategory="home_screen"
+ />
\ No newline at end of file
diff --git a/app/src/main/res/xml/miscellaneous_preferences.xml b/app/src/main/res/xml/miscellaneous_preferences.xml
new file mode 100644
index 000000000..512e12248
--- /dev/null
+++ b/app/src/main/res/xml/miscellaneous_preferences.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml
index fc7bbef49..03a5a4506 100644
--- a/app/src/main/res/xml/preferences.xml
+++ b/app/src/main/res/xml/preferences.xml
@@ -1,279 +1,45 @@
-
-
+
+
+
+ app:key="@string/pref_key_connection_wizard"
+ app:summary="@string/pref_desc_runConnectionWizard"
+ app:title="@string/pref_name_runConnectionWizard"
+ app:icon="@drawable/ic_account_circle_24dp">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/xml/sync_preferences.xml b/app/src/main/res/xml/sync_preferences.xml
new file mode 100644
index 000000000..c3e909d9e
--- /dev/null
+++ b/app/src/main/res/xml/sync_preferences.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/xml/ui_preferences.xml b/app/src/main/res/xml/ui_preferences.xml
new file mode 100644
index 000000000..8c6694548
--- /dev/null
+++ b/app/src/main/res/xml/ui_preferences.xml
@@ -0,0 +1,108 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/q b/q
new file mode 100644
index 000000000..a35d66c06
--- /dev/null
+++ b/q
@@ -0,0 +1,9519 @@
+[33mcommit 02c5ff6244f3d5a417aba929da1ab40db7c275b0[m[33m ([m[1;36mHEAD -> [m[1;32mxcffl/ui-refresh[m[33m)[m
+Merge: c23fbb6 1ca23ab
+Author: xcffl
+Date: Sat Aug 24 21:27:12 2019 +0800
+
+ Merge branch 'xcffl/ui-refresh' of github.com:xcffl/wallabag-android into xcffl/ui-refresh
+
+[33mcommit c23fbb6e9ca15c565fc179ef728cdca80e324da5[m
+Author: xcffl
+Date: Sat Aug 24 21:16:42 2019 +0800
+
+ Use Material Design Theming templete. \n Use vector icons. \n Use customized typography.\nMany fixes.
+
+[33mcommit e318175f6d09f4eb2900ee242a1177301d46b643[m
+Author: xcffl
+Date: Fri Aug 23 23:55:25 2019 +0800
+
+ Fix setup wizard
+
+[33mcommit bd045e4e9c6c63b04e31f17470d90293c4c20294[m
+Author: xcffl
+Date: Fri Aug 23 18:56:56 2019 +0800
+
+ Refactor UI implentation
+
+[33mcommit a4368db77c352df64d681589a623cb7f37c0348e[m
+Author: xcffl
+Date: Tue Aug 20 23:43:46 2019 +0800
+
+ Replace legacy styles and inherit from the new Material Design ones
+
+[33mcommit 1ca23abac345ca50012e7dd3939c2a3f1dc2bec0[m[33m ([m[1;31morigin/xcffl/ui-refresh[m[33m)[m
+Author: xcffl
+Date: Sat Aug 24 21:16:42 2019 +0800
+
+ Use Material Design Theming templete. \n Use vector icons. \n Use customized typography.\nMany fixes.
+
+[33mcommit 88b8ba369b13c3d155c85504d8be259f8cd4403b[m
+Author: xcffl
+Date: Fri Aug 23 23:55:25 2019 +0800
+
+ Fix setup wizard
+
+[33mcommit bd2fdb1eb3efc5d00b06d63922cfb1e1b6c6b434[m
+Author: xcffl
+Date: Fri Aug 23 18:56:56 2019 +0800
+
+ Refactor UI implentation
+
+[33mcommit 4a0136625cd8f1f0ec1f0860fbbd39d9bef52058[m[33m ([m[1;31morigin/msf/upstream-contrib[m[33m, [m[1;31mmsfjarvis/msf/upstream-contrib[m[33m)[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Wed Aug 21 09:31:02 2019 +0000
+
+ Bump gradle from 3.4.2 to 3.5.0
+
+ Bumps gradle from 3.4.2 to 3.5.0.
+
+ Signed-off-by: dependabot-preview[bot]
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit 47cae04b2f5abbb843a2aae72e62cf3c2510c927[m
+Merge: 18c4e8b b7ef995
+Author: Harsh Shandilya
+Date: Fri Aug 23 01:23:58 2019 +0530
+
+ Merge remote-tracking branch 'origin/master' into msf/upstream-contrib
+
+ * origin/master:
+ Version 2.2.4
+ Show nice notification when adding entry without connected server
+ Fix initial sort order of articles
+
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit b7ef995fbaf2a8d15264b46f01b5c2c74aeeb522[m
+Author: Thomas Citharel
+Date: Tue Aug 20 21:37:38 2019 +0200
+
+ Version 2.2.4
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit cba1a79de213400c5433ec630023303768ca9845[m
+Merge: 7544f19 ec8e35b
+Author: Dmitriy Bogdanov
+Date: Tue Aug 20 22:55:24 2019 +0400
+
+ Merge branch 'NWuensche-fixExceptionAddEntryNoServer'
+
+[33mcommit ec8e35b6583187d0579b9d07c07f53da295f91a3[m
+Author: nwuensche
+Date: Mon Aug 19 15:11:26 2019 +0200
+
+ Show nice notification when adding entry without connected server
+
+ Close #806
+
+[33mcommit cd0f17ed0958ee70de57ab83034695cc67304b5f[m
+Author: xcffl
+Date: Tue Aug 20 23:43:46 2019 +0800
+
+ Replace legacy styles and inherit from the new Material Design ones
+
+[33mcommit 7544f190fc57195396c9b739fce2b84b3fc1683e[m[33m ([m[1;32mmaster[m[33m)[m
+Merge: 9e9f9df ddcb1cc
+Author: Thomas Citharel
+Date: Mon Aug 19 14:39:04 2019 +0200
+
+ Fix initial sort order of articles (#805)
+
+ Fix initial sort order of articles
+
+[33mcommit ddcb1cc8daf7a1b15ff2934943281814b381fb3c[m
+Author: Dmitriy Bogdanov
+Date: Sun Aug 18 15:48:02 2019 +0400
+
+ Fix initial sort order of articles
+
+ Propagate parameters to `ArticleListFragment`s right after their creation
+
+[33mcommit 18c4e8b95abddd300209127fe7f5a7c0fcbaaf17[m[33m ([m[1;32mmsf/upstream-contrib[m[33m)[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Thu Aug 15 10:24:17 2019 +0000
+
+ Bump aboutlibraries from 6.0.2 to 7.0.2
+
+ Bumps [aboutlibraries](https://github.com/mikepenz/AboutLibraries) from 6.0.2 to 7.0.2.
+ - [Release notes](https://github.com/mikepenz/AboutLibraries/releases)
+ - [Changelog](https://github.com/mikepenz/AboutLibraries/blob/develop/gradle-release.gradle)
+ - [Commits](https://github.com/mikepenz/AboutLibraries/compare/v6.0.2...v7.0.2)
+
+ Signed-off-by: dependabot-preview[bot]
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit 81f2ef75b8b072496cc8d8a5479caf643c22d3fb[m
+Author: Harsh Shandilya
+Date: Thu Aug 15 15:58:05 2019 +0530
+
+ Rewrite Travis-CI configuration to enable caching
+
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit 34fc9d680fd3e6769fd77752b63e693143cc3439[m
+Author: Harsh Shandilya
+Date: Thu Aug 15 15:48:05 2019 +0530
+
+ Bump eventbus from 3.0.1 to 3.1.1
+
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit 5c3608819d9d210d4ef3b804f49bf26ce6bd01c3[m
+Author: Harsh Shandilya
+Date: Thu Aug 15 15:47:30 2019 +0530
+
+ build: Exclude all kotlin_module files
+
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit fdab55d4bb02b7a978c4b57fd73a0c1ae40c4455[m
+Author: Harsh Shandilya
+Date: Thu Aug 15 15:40:13 2019 +0530
+
+ Migrate to AndroidX
+
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit e817515ce191112bdb53d4bef9ef8fdab54a2a89[m
+Author: Harsh Shandilya
+Date: Thu Aug 15 15:21:39 2019 +0530
+
+ Bump Gradle wrapper to 5.6
+
+ Signed-off-by: Harsh Shandilya
+
+[33mcommit fc73726664c118d529ab18b2b04ae95e5d98923d[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Thu Aug 15 09:33:54 2019 +0000
+
+ Bump okhttp from 3.14.2 to 4.1.0
+
+ Bumps [okhttp](https://github.com/square/okhttp) from 3.14.2 to 4.1.0.
+ - [Release notes](https://github.com/square/okhttp/releases)
+ - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md)
+ - [Commits](https://github.com/square/okhttp/compare/parent-3.14.2...parent-4.1.0)
+
+ Signed-off-by: dependabot-preview[bot]
+
+[33mcommit 31cc298bd332d7592dc6f69ece44cd89d9803ae6[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Thu Aug 15 09:19:08 2019 +0000
+
+ Bump okhttp-urlconnection from 3.14.2 to 4.1.0
+
+ Bumps [okhttp-urlconnection](https://github.com/square/okhttp) from 3.14.2 to 4.1.0.
+ - [Release notes](https://github.com/square/okhttp/releases)
+ - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md)
+ - [Commits](https://github.com/square/okhttp/compare/parent-3.14.2...parent-4.1.0)
+
+ Signed-off-by: dependabot-preview[bot]
+
+[33mcommit 496d9376c2543a38d705d3e00f077424a9ebb71e[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Thu Aug 15 08:54:19 2019 +0000
+
+ Bump stetho-okhttp3 from 1.5.0 to 1.5.1
+
+ Bumps [stetho-okhttp3](https://github.com/facebook/stetho) from 1.5.0 to 1.5.1.
+ - [Release notes](https://github.com/facebook/stetho/releases)
+ - [Changelog](https://github.com/facebook/stetho/blob/master/CHANGELOG.md)
+ - [Commits](https://github.com/facebook/stetho/compare/v1.5.0...v1.5.1)
+
+ Signed-off-by: dependabot-preview[bot]
+
+[33mcommit 4e041bb78d2594fff1e613f340b74afe36b6cecd[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Thu Aug 15 08:47:33 2019 +0000
+
+ Bump eventbus-annotation-processor from 3.0.1 to 3.1.1
+
+ Bumps [eventbus-annotation-processor](https://github.com/greenrobot/EventBus) from 3.0.1 to 3.1.1.
+ - [Release notes](https://github.com/greenrobot/EventBus/releases)
+ - [Commits](https://github.com/greenrobot/EventBus/commits/V3.1.1)
+
+ Signed-off-by: dependabot-preview[bot]
+
+[33mcommit 9a5b8d584a5cca0660f06c1c9d8ffb15fef53236[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Thu Aug 15 08:40:51 2019 +0000
+
+ Bump slf4j-android from 1.7.25 to 1.7.28
+
+ Bumps slf4j-android from 1.7.25 to 1.7.28.
+
+ Signed-off-by: dependabot-preview[bot]
+
+[33mcommit 3a6107b15a2eb8073779841e267b8eaa1f98b2e0[m
+Author: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
+Date: Thu Aug 15 08:39:50 2019 +0000
+
+ Bump stetho from 1.5.0 to 1.5.1
+
+ Bumps [stetho](https://github.com/facebook/stetho) from 1.5.0 to 1.5.1.
+ - [Release notes](https://github.com/facebook/stetho/releases)
+ - [Changelog](https://github.com/facebook/stetho/blob/master/CHANGELOG.md)
+ - [Commits](https://github.com/facebook/stetho/compare/v1.5.0...v1.5.1)
+
+ Signed-off-by: dependabot-preview[bot]
+
+[33mcommit 9e9f9dff925ed9d5fbe96247113a718fcfe829cd[m[33m ([m[1;33mtag: 2.2.3[m[33m)[m
+Author: Thomas Citharel
+Date: Mon Aug 12 14:05:34 2019 +0200
+
+ Release 2.2.3
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit 1203f9275a8a189516446d1d3a83653b06b8b470[m
+Merge: 261e83b 9327b7f
+Author: Thomas Citharel
+Date: Mon Aug 12 13:26:20 2019 +0200
+
+ Merge pull request #801 from NWuensche/773-fix-white-on-white
+
+ Make menu background black in dark high contrast theme
+
+[33mcommit 9327b7f97cb5f2794ebc9b379c7f1b9f8e0e83db[m
+Author: nwuensche
+Date: Mon Aug 12 11:34:09 2019 +0200
+
+ Make menu background black in dark high contrast theme
+
+ Close #773
+
+[33mcommit 261e83b3a434477028648f0dfea7bd174661931e[m
+Merge: f6b0470 f5d06cc
+Author: Thomas Citharel
+Date: Tue Jul 30 09:50:30 2019 +0200
+
+ Fix D-pad navigation in article view (#795)
+
+ Fix D-pad navigation in article view
+
+[33mcommit f6b04705857c0295dce176a1eb0367f99f57678b[m
+Merge: 2d177c5 170de15
+Author: Dmitriy Bogdanov
+Date: Mon Jul 29 17:06:57 2019 +0400
+
+ Merge branch 'update-okhttp-3.14.2'
+
+[33mcommit 2d177c50e9309479282af70c15642ae93793f55a[m
+Merge: f2a4281 0029002
+Author: Dmitriy Bogdanov
+Date: Mon Jul 29 17:01:42 2019 +0400
+
+ Merge branch 'update-gradle'
+
+[33mcommit 0029002d74117f0f5027d4aea792921e77d766c1[m
+Author: Dmitriy Bogdanov
+Date: Mon Jul 29 17:00:40 2019 +0400
+
+ Update gradle from 3.4.1 to 3.4.2
+
+[33mcommit f5d06cc4bd9a4096b147760b3339b07c1c169b9f[m
+Author: Dmitriy Bogdanov
+Date: Fri Jul 5 17:03:52 2019 +0400
+
+ Fix D-pad navigation in article view
+
+[33mcommit f2a42815c3356dd20a35f004d48f7a5d50badf3d[m[33m ([m[1;33mtag: 2.2.2[m[33m)[m
+Author: Thomas Citharel
+Date: Tue Jul 2 14:04:06 2019 +0200
+
+ Version 2.2.2
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit eca0d1dd87c9dba68c3af524f1ec1d29ccac8577[m
+Merge: 8f8d950 11aa617
+Author: Thomas Citharel
+Date: Tue Jul 2 14:02:26 2019 +0200
+
+ Merge pull request #794 from wallabag/notification_channels
+
+ Add notification channels support
+
+[33mcommit 11aa6173c87d98dec958bf8743ecbc7f8a56c646[m
+Author: Dmitriy Bogdanov
+Date: Sun Jun 23 17:50:58 2019 +0400
+
+ Add notification channels support
+
+[33mcommit 170de15db948f2341cccbceef803eb94e6a5edc9[m
+Author: Sven Fischer
+Date: Sat Jun 1 22:53:43 2019 +0200
+
+ update okhttp to 3.14.2 from 3.13.1
+
+[33mcommit 306785cfaaaa5bbb018768a9f6cd1ff7fef21057[m
+Author: Sven Fischer
+Date: Sat Jun 1 22:47:49 2019 +0200
+
+ update gradle to 3.4.1 from 3.4.0
+
+[33mcommit 8f8d95077e85eb9c18ce9338a0feb6cdeb2c31b4[m[33m ([m[1;33mtag: 2.2.1[m[33m)[m
+Merge: 904f80e 862e66c
+Author: Thomas Citharel
+Date: Sat May 4 20:22:45 2019 +0200
+
+ Merge pull request #783 from wallabag/release/2.2.1
+
+ Release/2.2.1
+
+[33mcommit 862e66c8604b4e9bc9552a057f9534b34177d99d[m
+Author: Thomas Citharel
+Date: Sat May 4 20:02:19 2019 +0200
+
+ Release 2.2.1
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit 472615a85d7f97a54d3490f4a3f34e47e5733a21[m
+Author: Thomas Citharel
+Date: Sat May 4 20:01:59 2019 +0200
+
+ Bump graddle
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit 904f80ecfd60698a7ba11b82f66c24d773dce97e[m
+Merge: f9d9d2c c31bedf
+Author: Thomas Citharel
+Date: Sat May 4 19:43:47 2019 +0200
+
+ Merge pull request #782 from di72nn/tenkabuto-patch-1
+
+ Split themes and remove font-weight
+
+[33mcommit f9d9d2ce77497e8a8a72e8cdcd138314139b331f[m
+Merge: f3dad22 8e46dea
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Apr 11 15:47:58 2019 +0200
+
+ Merge pull request #780 from wallabag/fix_translations
+
+ Fix translations
+
+[33mcommit c31bedf39e52dfa299ccf467a7595b3d95f43a37[m
+Author: Dmitriy Bogdanov
+Date: Thu Apr 11 16:16:23 2019 +0400
+
+ Move font-weight into a separate theme
+
+[33mcommit 8e46deaabf81dae8cd5d3757f0bab9e556ba5ce5[m
+Author: Dmitriy Bogdanov
+Date: Thu Apr 11 14:44:44 2019 +0400
+
+ Escape HTML tags in strings, remove unused tags
+
+[33mcommit 1fc94e8058022b04adcb798b63a207e5f0eb0f26[m
+Author: Arda Kilicdagi
+Date: Thu Mar 14 16:09:45 2019 +0000
+
+ Translated using Weblate (Turkish)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit c7fd5354d3f1ddf08919881d9b1a1c4a597d4819[m
+Author: Brandon Hall
+Date: Fri Mar 15 05:25:05 2019 -0700
+
+ Update main.css
+
+ Removed font-weight; previously I had just commented it out.
+
+[33mcommit 55813906882d7f75624531e09c151efb9e5c58ea[m
+Author: Brandon Hall
+Date: Thu Mar 14 20:51:08 2019 -0700
+
+ Update main.css
+
+ Comment out the font-weight change upon becoming high contrast
+
+[33mcommit f3dad22354cad4dde350332d261abc37b620cdfc[m
+Merge: 1001e99 6205dd4
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Mar 14 17:57:08 2019 +0100
+
+ Merge pull request #771 from wallabag/Strubbl-patch-1-readme-legacy
+
+ Update README.md
+
+[33mcommit 1001e998ab4015b3b67041ac820de845d9937bfc[m
+Merge: ccdfc30 1a14b61
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Mar 14 17:56:47 2019 +0100
+
+ Merge pull request #774 from Strubbl/weblate-translations
+
+ Weblate translations
+
+[33mcommit 1a14b614e1e37f20f506515321d4f2ae246d1e75[m
+Merge: ccdfc30 606410c
+Author: Sven Fischer
+Date: Thu Mar 14 17:48:21 2019 +0100
+
+ Merge branch 'master' of https://hosted.weblate.org/git/wallabag/android-app into weblate-translations
+
+[33mcommit 606410c45e805d3be8950e30ceb100fbddbff2a0[m
+Author: Arda Kilicdagi
+Date: Fri Mar 8 12:33:13 2019 +0000
+
+ Translated using Weblate (Turkish)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit 0ac6b2e2a633b0fce28ca00bbbe62688db45dfa3[m
+Author: Arda Kilicdagi
+Date: Wed Mar 6 21:06:25 2019 +0000
+
+ Translated using Weblate (Turkish)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit 6205dd40c47c27021ee75ef4db7b2b46d9dd1626[m
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Mar 7 18:19:47 2019 +0100
+
+ Update README.md
+
+[33mcommit 873edb225c8a1da72f6e3d498889b9091cf61d6f[m
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Mar 7 18:17:41 2019 +0100
+
+ Update README.md
+
+ add info about legacy branches
+
+[33mcommit ccdfc304e2a7ae9e627118f382d8a290fb8cba88[m[33m ([m[1;33mtag: 2.2.0[m[33m)[m
+Author: Thomas Citharel
+Date: Thu Mar 7 09:28:08 2019 +0100
+
+ Version 2.2.0
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit cd3680883a78f843fa98df3550ad04dec1eda7a1[m
+Merge: c07062e f2452ab
+Author: Thomas Citharel
+Date: Wed Mar 6 22:00:38 2019 +0100
+
+ Merge pull request #769 from Strubbl/fix-624-wbg-server-cached-image-display
+
+ fix image display when wbg server caches them
+
+[33mcommit c07062e658b6a6364276581b76bceae0ddd52b26[m
+Merge: f8e5b99 40b3769
+Author: Thomas Citharel
+Date: Wed Mar 6 21:57:24 2019 +0100
+
+ Merge pull request #762 from GeorgeHahn/allow-cleartext-android-9
+
+ Allow cleartext network traffic on Android 9
+
+[33mcommit f8e5b990b81244d6097f3e9c09c589c1d7e93c36[m
+Merge: f7d7c26 c7ffba8
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Wed Mar 6 18:43:35 2019 +0100
+
+ Merge pull request #770 from Strubbl/update-gradle-3.3.2
+
+ update gradle to 3.3.2
+
+[33mcommit c7ffba8083449e359baa7e5679420765a02e3fd4[m
+Author: Sven Fischer
+Date: Wed Mar 6 18:35:05 2019 +0100
+
+ update gradle to 3.3.2
+
+[33mcommit f2452abf1e7be5872d779a5d6ecf68b4c2ca148c[m
+Author: Sven Fischer
+Date: Wed Mar 6 18:30:27 2019 +0100
+
+ fix image display when wbg server caches them
+
+ This commit fixes the display of images when wallabag server image
+ caching feature is on, but this app's image downloading is not on.
+
+ fixes #624
+
+[33mcommit f7d7c26c06528feefce2352d7438062d7f1069f5[m
+Merge: a64060c 89e356b
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Wed Mar 6 18:05:28 2019 +0100
+
+ Merge pull request #763 from Strubbl/update-to-okhttp-3.13.1
+
+ update to okhttp 3.13.1
+
+[33mcommit a64060ced9e36df8798dc3ff75dcdbc6caa2ecf4[m
+Merge: 87d42ef f132b6f
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Wed Mar 6 18:05:03 2019 +0100
+
+ Merge pull request #766 from Strubbl/fix-dark-theme-navbar-color
+
+ fix navbar color in dark themes
+
+[33mcommit 89e356bf054fe61aaaa789a48913d1615a22666c[m
+Author: Sven Fischer
+Date: Tue Feb 12 23:17:31 2019 +0100
+
+ okhttp 3.13 branch requires Android API 25+
+
+ okhttp 3.13 requires Android 5.0 and Java 8 now.
+ For details please see:
+ https://github.com/square/okhttp/blob/933bb401e8d70b4566ea0a7c6f1e3b9817ff1979/README.md#requirements
+
+[33mcommit b9a62a521a3eed453e71e0a1a0742b16f96da829[m
+Author: Sven Fischer
+Date: Tue Feb 12 21:37:13 2019 +0100
+
+ update to okhttp 3.13.1
+
+[33mcommit f132b6fdf8d1e304dd8d393151bb13bede64f4dc[m
+Author: Sven Fischer
+Date: Tue Feb 12 22:54:46 2019 +0100
+
+ fix navbar color in dark themes
+
+ This fixes the navigation bar color in the dark themes. Before this
+ commit it was light colored. Now it is colored to the primary color of
+ dark theme, so some grey.
+
+ The problem is fixed for both styles: dark and high contrast dark.
+
+[33mcommit 87d42ef55204c96acf91946c9366b7156dd35578[m
+Merge: 82c1c32 67c8b22
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Tue Feb 12 22:41:16 2019 +0100
+
+ Merge pull request #765 from Strubbl/translation-updates
+
+ Translation updates
+
+[33mcommit 67c8b226e919423d7592a2abb070104c56cc8ef9[m
+Merge: 82c1c32 5f40c46
+Author: Sven Fischer
+Date: Tue Feb 12 22:30:04 2019 +0100
+
+ Merge branch 'master' of https://hosted.weblate.org/git/wallabag/android-app into translation-updates
+
+[33mcommit 82c1c3240fca4f682535036e6ee608206a53973e[m
+Merge: 97e7fd8 432a019
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Tue Feb 12 22:27:21 2019 +0100
+
+ Merge pull request #730 from NWuensche/fix-dark-contrast-black
+
+ Black on black consistent in dark (high contrast) theme
+
+[33mcommit 97e7fd82915e2e5a3bd2966439aa858ffa8f249d[m
+Merge: cef934b b215dbe
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Tue Feb 12 22:24:16 2019 +0100
+
+ Merge pull request #741 from tyndare/tts-fix-issue-735
+
+ tts: try to fix issue #735 by creating a notification channel
+
+[33mcommit cef934b081da541d1c07d77465a2b22b5f0f64af[m
+Merge: cf8fab9 064c5b0
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Tue Feb 12 22:14:30 2019 +0100
+
+ Merge pull request #764 from Strubbl/update-to-gradle-to-3.3.1
+
+ update gradle to 3.3.1
+
+[33mcommit 064c5b0009d18d4fc46ad151fbb6b86102c0ab09[m
+Author: Sven Fischer
+Date: Tue Feb 12 22:08:00 2019 +0100
+
+ update gradle to 3.3.1
+
+[33mcommit 40b3769747090199a3bfd54ecc7619a74917ced2[m
+Author: George Hahn
+Date: Sat Feb 2 22:00:27 2019 -0600
+
+ Allow cleartext network traffic on Android 9
+
+[33mcommit 5f40c4651172abc991acd5cb750b22626ab74cdc[m
+Author: naofum
+Date: Mon Jan 14 11:57:00 2019 +0000
+
+ Translated using Weblate (Japanese)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit e3ac91f8967468af01b27b2a321559dfdbc1a883[m
+Author: Louies
+Date: Fri Jan 11 16:04:12 2019 +0000
+
+ Added translation using Weblate (Chinese (Traditional))
+
+[33mcommit cf8fab9f9ddaebc6faaf00edaf5ba0847b0092f5[m[33m ([m[1;33mtag: 2.1.0[m[33m)[m
+Author: Thomas Citharel
+Date: Sun Jan 20 14:32:15 2019 +0100
+
+ Version 2.1.0
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit 88efeb5dcd3ee1d3be8999dc28acdbd076fb4689[m
+Merge: c7f2a2c 98c435a
+Author: Thomas Citharel
+Date: Fri Jan 18 17:44:46 2019 +0100
+
+ Merge pull request #759 from Strubbl/update-dep
+
+ update dependencies (gradle:3.3.0, gradle-4.10.1-all, okhttp:3.12.1)
+
+[33mcommit 98c435a32316e89bb635cb7c2b9c3efc21d58eb5[m
+Author: Sven Fischer
+Date: Fri Jan 18 17:24:29 2019 +0100
+
+ update dependencies (gradle:3.3.0, gradle-4.10.1-all, okhttp:3.12.1)
+
+[33mcommit c7f2a2c48940f057a97e970d1ac09604fe5da6a4[m
+Merge: 8f08357 787b8f7
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Wed Dec 19 21:34:53 2018 +0100
+
+ Merge pull request #755 from wallabag/weblate-update
+
+ Weblate update
+
+[33mcommit 787b8f72538f6e767cfc270e349f1f66bd6c6734[m
+Author: Strubbl
+Date: Wed Dec 19 20:13:19 2018 +0000
+
+ Translated using Weblate (German)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit 3a636c2b14e93243c093ac42e22732e9d9e4ac32[m
+Author: Eloi Coutant
+Date: Wed Dec 19 01:00:46 2018 +0000
+
+ Translated using Weblate (French)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit 8f083576f5f4b0cd838bedb101a0399727dbe699[m
+Merge: 7046e18 8879658
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Dec 13 20:10:41 2018 +0100
+
+ Merge pull request #753 from wallabag/move-jcenter-last
+
+ move jcenter as last source of dependencies
+
+[33mcommit 7046e18a0f3c2fbfcd5f0b453dc886b77da561a8[m[33m ([m[1;33mtag: 2.1.0-beta[m[33m)[m
+Author: Thomas Citharel
+Date: Thu Dec 13 11:11:47 2018 +0100
+
+ Version 2.1.0-beta
+
+ Signed-off-by: Thomas Citharel
+
+[33mcommit 887965877020491bf5754bb13e8496b0358eeb35[m
+Author: Sven Fischer
+Date: Thu Dec 13 11:07:12 2018 +0100
+
+ move jcenter as last source of dependencies
+
+ Because "Everyone can simply push things to jcenter in other's name/package."
+
+ https://twitter.com/PreusslerBerlin/status/1073099443585630210
+ --> https://blog.autsoft.hu/a-confusing-dependency/
+
+[33mcommit f4f6c0f6eca793c3048b6a1da5cd7a1cf37c5e18[m
+Merge: a038559 5f08f71
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Fri Nov 23 01:33:23 2018 +0100
+
+ Merge pull request #746 from wallabag/update-dependencies
+
+ Update dependencies
+
+[33mcommit 5f08f71a28464a089440e98eed621f8570ab93f4[m
+Author: Sven Fischer
+Date: Fri Nov 23 01:17:39 2018 +0100
+
+ Revert "Add fake dep to override another dep's dep version"
+
+ This reverts commit c02a6b27ff1dc405d2fd2855386372a7468c94b2.
+
+ The issue is solved https://issuetracker.google.com/issues/37131436#comment12
+
+[33mcommit 3a7594990549ac40cbb6f4c5954bcd4cf8e234af[m
+Author: Sven Fischer
+Date: Fri Nov 23 00:51:50 2018 +0100
+
+ increase sdk version to 28
+
+[33mcommit b59d5d13a63af129d68dd3443a44c388f6fad704[m
+Author: Sven Fischer
+Date: Fri Nov 23 00:40:21 2018 +0100
+
+ remove buildToolsVersion
+
+ Removed buildToolsVersion to suppress the following warning:
+ "To suppress this warning, remove "buildToolsVersion '27.0.3'" from your build.gradle file, as each version of the Android Gradle Plugin now has a default version of the build tools."
+
+[33mcommit e14d87c651dbc3bb92853e58ad231d47d2bd1e41[m
+Author: Sven Fischer
+Date: Fri Nov 23 00:40:04 2018 +0100
+
+ update gradle to 3.2.1 and gradle-wrapper to 4.6
+
+[33mcommit a0385591d25fd1135c0464ccb8a674a1ebce031b[m
+Merge: f9d9754 b52675e
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sun Nov 4 18:18:01 2018 +0100
+
+ Merge pull request #743 from Strubbl/fix-weblate
+
+ Fix weblate & update translations
+
+[33mcommit b52675e159266f43442cf70bf770ac90d24d3ce2[m
+Author: Sven Fischer
+Date: Sun Nov 4 18:08:43 2018 +0100
+
+ values-fr/strings.xml: remove duplicate
+
+[33mcommit fecf709d354ae107e83c494a66621ef8d8a3df94[m
+Merge: f9d9754 00095cb
+Author: Sven Fischer
+Date: Sun Nov 4 17:59:26 2018 +0100
+
+ Merge remote-tracking branch 'weblate/master'
+
+[33mcommit f9d975495145918d655546f5ff196c779b413085[m
+Merge: 1dddcb0 875e47a
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Wed Oct 31 12:13:17 2018 +0100
+
+ Merge pull request #721 from StelFux/master
+
+ Updated fr (French) translation
+
+[33mcommit 875e47a8d280cfb3b63112eefd96f36f2765f323[m
+Author: StelFux
+Date: Tue Oct 30 12:19:53 2018 +0100
+
+ Update strings.xml
+
+[33mcommit 00095cbb73e011a83a5a2b3bc85411b656ed7c5e[m
+Author: kak mi
+Date: Fri Sep 21 11:41:42 2018 +0000
+
+ Translated using Weblate (Chinese (Simplified))
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit 7163bd0f5cb2c00b9cf62e6cf9dca6f29a720292[m
+Author: Henrique Combochi
+Date: Wed Sep 19 02:44:55 2018 +0000
+
+ Translated using Weblate (Portuguese)
+
+ Currently translated at 22.9% (60 of 262 strings)
+
+[33mcommit 043af7178fef4dd8c8f50629bf335c7f0661941a[m
+Author: Allan Nordhøy
+Date: Tue Sep 18 09:03:25 2018 +0000
+
+ Translated using Weblate (Norwegian Bokmål)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit c2b2ffabc577607fbc2a7060182386cae509655f[m
+Author: Szilágyi Gyula
+Date: Mon Sep 10 07:07:53 2018 +0000
+
+ Translated using Weblate (Hungarian)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit 12443490994854ca59c5cc8406ae5d0a24cffda2[m
+Author: WaldiS
+Date: Sun Sep 9 09:28:44 2018 +0000
+
+ Translated using Weblate (Polish)
+
+ Currently translated at 100.0% (262 of 262 strings)
+
+[33mcommit 049b789252491e49767cbef4f14460ae87e265b2[m
+Author: tianyu
+Date: Mon Aug 27 07:25:42 2018 +0000
+
+ Translated using Weblate (Chinese (Simplified))
+
+ Currently translated at 5.7% (15 of 260 strings)
+
+[33mcommit b8b2108203e24ded8c492973fecf582a1300ba4d[m
+Author: tianyu
+Date: Mon Aug 27 07:22:15 2018 +0000
+
+ Added translation using Weblate (Chinese (Simplified))
+
+[33mcommit 5f877d558a82a703500fdfaaf2eae4f9524931f1[m
+Author: Rodrigo Souza
+Date: Thu Aug 9 14:25:45 2018 +0000
+
+ Translated using Weblate (Portuguese)
+
+ Currently translated at 6.1% (16 of 260 strings)
+
+[33mcommit a506d15855b3a553537026b967c7f5eaf217ca80[m
+Author: Weblate
+Date: Wed Jun 20 09:46:59 2018 +0000
+
+ Added translation using Weblate (Romanian)
+
+[33mcommit 8533796cb34d8f0709834ca6abccf1b742bd802b[m
+Author: Weblate
+Date: Wed Jun 20 09:46:28 2018 +0000
+
+ Added translation using Weblate (Portuguese)
+
+[33mcommit d4edbcc8efbb6f5b705c3c2a636ec9e86e7aa4f7[m
+Author: Weblate
+Date: Wed Jun 20 09:45:35 2018 +0000
+
+ Added translation using Weblate (Persian)
+
+[33mcommit bc16b44576bbaf0408d039018909fd72fed9052b[m
+Author: Weblate
+Date: Wed Jun 20 09:44:53 2018 +0000
+
+ Added translation using Weblate (Occitan)
+
+[33mcommit a02f106860ee22e9d95d34bef6fa39a6ef2d75c9[m
+Author: Weblate
+Date: Wed Jun 20 09:44:13 2018 +0000
+
+ Added translation using Weblate (Danish)
+
+[33mcommit 9588d4bed2c1fb83eced009391ad152a0bcea641[m
+Author: Weblate
+Date: Wed Jun 20 09:42:27 2018 +0000
+
+ Added translation using Weblate (Aragonese)
+
+[33mcommit e2b09e3caf49ad679dfb9a58c189ffa2b8769dfe[m
+Author: Étienne Deparis
+Date: Wed Apr 4 12:01:01 2018 +0000
+
+ Translated using Weblate (French)
+
+ Currently translated at 95.3% (248 of 260 strings)
+
+[33mcommit 82b5b7c0ed7ba87a135b1e824c55e7743f3aa285[m
+Author: Dmitriy Bogdanov
+Date: Sun Feb 25 09:27:12 2018 +0000
+
+ Translated using Weblate (Russian)
+
+ Currently translated at 99.6% (259 of 260 strings)
+
+[33mcommit 0757cdb7b83976e6d9bed00966a66d971abe4b86[m
+Author: anonymous <>
+Date: Sun Feb 25 08:45:34 2018 +0000
+
+ Translated using Weblate (Russian)
+
+ Currently translated at 77.6% (202 of 260 strings)
+
+[33mcommit 269324ba0da2bd6326d1cfc0275d9a526f04dab6[m
+Author: naofum
+Date: Sun Feb 25 05:07:23 2018 +0000
+
+ Translated using Weblate (Japanese)
+
+ Currently translated at 100.0% (260 of 260 strings)
+
+[33mcommit c82114b567c181b25c5eb09f8848e11822d5ec01[m
+Author: Allan Nordhøy
+Date: Fri Feb 23 16:46:58 2018 +0000
+
+ Translated using Weblate (Norwegian Bokmål)
+
+ Currently translated at 99.6% (259 of 260 strings)
+
+[33mcommit c16a894a1b500e7c2cfe6ddcafa16f600072bbec[m
+Author: Szilágyi Gyula
+Date: Sat Feb 24 07:51:15 2018 +0000
+
+ Translated using Weblate (Hungarian)
+
+ Currently translated at 100.0% (260 of 260 strings)
+
+[33mcommit cd8d3424108b530ea0e312163cfa3605abbcead9[m
+Author: naofum
+Date: Sun Feb 4 14:38:19 2018 +0000
+
+ Translated using Weblate (Japanese)
+
+ Currently translated at 100.0% (259 of 259 strings)
+
+[33mcommit c6b090dd5908a75bfc21ecdb13f9f06a17436004[m
+Author: Ismael Reyes
+Date: Tue Jan 30 12:06:10 2018 +0000
+
+ Translated using Weblate (Spanish)
+
+ Currently translated at 86.8% (225 of 259 strings)
+
+[33mcommit 1dddcb0c4db97ab9a70b3b596d8a7d671061d71b[m
+Merge: a96a44f 495955e
+Author: Kevin Decherf
+Date: Sat Oct 27 14:18:00 2018 +0200
+
+ Merge pull request #740 from wallabag/Strubbl-gh-issue-template-2fa
+
+ Update issue_template.md
+
+[33mcommit b215dbe75153fd51d287ddfe8f200e739618c2aa[m
+Author: tyndare
+Date: Sun Oct 21 19:55:48 2018 +0200
+
+ tts: avoid NPE when calling abandonAudioFocusRequest
+
+[33mcommit 4ba91da9233acf295b5227eedd639d7c2d9d4e06[m
+Author: tyndare
+Date: Sun Oct 21 01:07:58 2018 +0200
+
+ tts: fix issue #735: create notification channel
+
+ Update for Android >= 8.1
+ - create a notification channel, and use its id to send notifications
+ - create an audio focus request object
+
+[33mcommit 495955e3dda55a060b392b1066bb4a4ebc167356[m
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Fri Oct 19 20:50:20 2018 +0200
+
+ Update issue_template.md
+
+ add question Do you have Two-Factor-Authentication enabled?
+
+[33mcommit a96a44f7fcc5872e320dc40355ef11d5ccbc4bc3[m
+Merge: c7a402b 6980d46
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Sep 13 19:05:54 2018 +0200
+
+ Merge pull request #728 from NWuensche/Catch-Socket-Exception
+
+ Save socket exception in log when network shuts down
+
+[33mcommit 6980d4674cd075fd66cf7dd6c80e121f3832a699[m
+Author: nwuensche
+Date: Tue Sep 11 12:49:13 2018 +0200
+
+ Catch Socket Exception properly
+
+ Fix #727
+
+ A java.net.SocketException occurs when syncing started and the internet
+ connection shuts down while syncing.
+ Instead of showing the exception to the user it will be caught in
+ IntentServiceBase.processException() now.
+
+[33mcommit 432a0196280b38cd7bd6a9254254237f78755ffb[m
+Author: nwuensche
+Date: Thu Sep 13 09:23:08 2018 +0200
+
+ Only change text color in navigation bar for dark (high contrast) theme
+
+ Only change the text color for this theme and not for the other ones.
+
+[33mcommit e2b8dc8e6f39c32fc5454b6e56218d669f6e7f2e[m
+Author: nwuensche
+Date: Wed Sep 12 18:14:16 2018 +0200
+
+ Adjust text color in navigation bar
+
+ Because the space behind the items isn't black anymore, a grey was used
+ as the icon and text color of the selected navbar item.
+
+ Fixes #552
+
+[33mcommit 0c9dbc48f57f790f015b99242ab8a3021b2b6964[m
+Author: nwuensche
+Date: Wed Sep 12 17:41:22 2018 +0200
+
+ Use right color for dark contrast theme
+
+ Use a real black instead of grey in the dark contrast theme for the
+ app bar. Also remove the black square in the navigation bar for the selected item
+ and instead use grey to highlight it.
+ This was done by changing the primary color of the theme and not
+ changing the background attribute in the theme to not always be black.
+
+[33mcommit c7a402b5a37a7476581b36e8c28c7d6ca5ed3005[m
+Merge: 660f264 49b7579
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Sep 8 12:18:30 2018 +0200
+
+ Merge pull request #709 from tyndare/tts-language-select
+
+ tts: automatic switch to article's language
+
+[33mcommit 660f264355ebfff850ed9b7f24e23b1ca778f721[m
+Merge: 750a320 453e97a
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Sep 8 12:05:48 2018 +0200
+
+ Merge pull request #725 from kpchungdev/feature-696-show-password
+
+ Feature 696: Show Password
+
+[33mcommit 750a32057a2efbb4e2a88419a6dd765a08da3559[m
+Merge: 2715435 4f8838e
+Author: Sven Fischer
+Date: Sat Sep 8 12:02:12 2018 +0200
+
+ Merge branch 'NWuensche-screenOnReading'
+
+[33mcommit 4f8838e65af493052e94c1851093d7059046da09[m
+Merge: 2715435 cd34793
+Author: Sven Fischer
+Date: Sat Sep 8 12:00:48 2018 +0200
+
+ Merge branch 'screenOnReading' of https://github.com/NWuensche/android-app into NWuensche-screenOnReading
+
+[33mcommit 2715435fe6974943f2f50c350bce06b5c8d14deb[m
+Merge: c9f8100 5d2699f
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Sep 8 11:59:15 2018 +0200
+
+ Merge pull request #726 from Strubbl/update-gradle-3.1.4
+
+ update gradle to 3.1.4
+
+[33mcommit 5d2699ffd5530a01ad8345a397d0b0a28b52f9ff[m
+Author: Sven Fischer
+Date: Sat Sep 8 11:58:08 2018 +0200
+
+ update gradle to 3.1.4
+
+[33mcommit 453e97af500864c034ee3abb3a76e22e1d4cf0e9[m
+Merge: 0a31194 2c053af
+Author: kpchungdev
+Date: Thu Aug 16 22:03:39 2018 -0700
+
+ Merge branch 'feature-696-show-password' of https://github.com/kpchungdev/android-app into feature-696-show-password
+
+[33mcommit 0a311941a27c0911a0c607ef862fd0bcdfec59fa[m
+Author: kpchungdev
+Date: Thu Aug 16 21:54:35 2018 -0700
+
+ Added password toggle
+
+[33mcommit 66e33c1921a8f593ed3fc1f9bff3b6ffb86fea59[m
+Merge: fbd6bef 89404ce
+Author: Strubbl
+Date: Tue Mar 6 19:47:16 2018 +0100
+
+ Merge pull request #699 from wallabag/update-to-okhttp-3.10.0
+
+ update okttp to 3.10.0
+
+[33mcommit 2c053afa8bdf1b6cef7de78ca5d2051689ccab77[m
+Author: kpchungdev
+Date: Thu Aug 16 21:25:28 2018 -0700
+
+ Add password toggle
+
+[33mcommit cd34793ba9d81a7cdffbc51fb21127ac0227f549[m
+Author: nwuensche
+Date: Fri Aug 10 15:44:01 2018 +0200
+
+ Fix typo
+
+[33mcommit c9f810026a9dac4fa2e6747ae60568003981c8f3[m
+Merge: 0dbdb18 c2a1b01
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Thu Aug 9 21:48:12 2018 +0200
+
+ Merge pull request #717 from wallabag/Strubbl-patch-1
+
+ Update README.md
+
+[33mcommit feb459824c883ebc8502be99d9cb57e2a3b13a1f[m
+Author: nwuensche
+Date: Thu Aug 9 21:04:49 2018 +0200
+
+ Add functionality behind "keep screen on" option
+
+ Close #436
+
+[33mcommit 57ec60a886b302f29b69db79259f84747eec9db8[m
+Author: nwuensche
+Date: Tue Aug 7 21:03:29 2018 +0200
+
+ Add checkbox to keep screen on in settings
+
+ Also add German localization. This commit just contains the
+ placeholders without any functionality.
+
+[33mcommit d4b7d133fe575652de1144ea6424f25d9f006512[m
+Merge: a907741 9b9d016
+Author: Stelfux
+Date: Tue Jul 31 20:21:33 2018 +0200
+
+ Merge branch 'master' of https://github.com/StelFux/android-app
+
+[33mcommit a90774129470426fbfc1d17411a87b7d6d631ffd[m
+Author: StelFux
+Date: Tue Jul 31 19:42:46 2018 +0200
+
+ modification of the French translation
+
+[33mcommit 9b9d016cf0058a292a90f1791f8c1d3548a14cce[m
+Author: Charles Lesecq
+Date: Tue Jul 31 19:42:46 2018 +0200
+
+ modification of the French translation
+
+[33mcommit 0dbdb18bf88027c21393bcac4bfdd5e05f3c0979[m
+Merge: b5d8ec9 eccfbe0
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Tue Jul 31 18:35:03 2018 +0200
+
+ Merge pull request #720 from wallabag/Strubbl-patch-2
+
+ Update issue_template.md
+
+[33mcommit eccfbe01d1ccc658d89d3138dc4d3da8ec0db2ba[m
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Tue Jul 31 18:28:21 2018 +0200
+
+ Update issue_template.md
+
+[33mcommit b5d8ec9a6669c5cd9820335f5d41f6251dbe2673[m
+Merge: 091981c 48b094b
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Jul 28 01:22:12 2018 +0200
+
+ Merge pull request #718 from Strubbl/update-okhttp311
+
+ update okhttp-urlconnection to 3.11.0
+
+[33mcommit 48b094b42895aba71a02cb5fe4162a93a9814dab[m
+Author: Sven Fischer
+Date: Sat Jul 28 01:14:40 2018 +0200
+
+ update okhttp-urlconnection to 3.11.0
+
+[33mcommit c2a1b010ee76601fdf519a9f5e5de26b46747129[m
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Jul 28 01:05:39 2018 +0200
+
+ Update README.md
+
+ * add two features to the list
+ * remove paragraph that we are actively developing the app now
+
+[33mcommit 091981cb8d3f0e930ef83e264a48d6d478e3697b[m
+Merge: 44acce4 f0daef9
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Jul 28 00:51:11 2018 +0200
+
+ Merge pull request #690 from silberzwiebel/scrollArticleList
+
+ add scrolling via hardware keys in article lists
+
+[33mcommit 44acce43c7ede8938ac508b11255aefc9fe0d958[m
+Merge: ccf06b1 471fbd8
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Jul 28 00:45:12 2018 +0200
+
+ Merge pull request #707 from wallabag/add-issue-template
+
+ Add issue template
+
+[33mcommit ccf06b197125b5843580567429691758c746c5f1[m
+Merge: 29231f9 c2454ce
+Author: Strubbl <97055+Strubbl@users.noreply.github.com>
+Date: Sat Jul 28 00:42:28 2018 +0200
+
+ Merge pull request #716 from Strubbl/attapalace-master
+
+ android & dependency updates
+
+[33mcommit c2454ce011cd47a25b6c78c90fd83d6821017fbf[m
+Author: Sven Fischer
+Date: Sat Jul 28 00:35:38 2018 +0200
+
+ update android support libs to 27.1.1
+
+[33mcommit fd50f5452cc159604033bc27601b9422b641ffcc[m
+Author: Sven Fischer
+Date: Sat Jul 28 00:33:02 2018 +0200
+
+ update okhttp3 to 3.11.0
+
+[33mcommit 287a97aa2d8a4669e7049c04a7d58c02f8821475[m
+Author: Sven Fischer
+Date: Sat Jul 28 00:31:14 2018 +0200
+
+ travis: android sdk, update build-tools
+
+[33mcommit c4e9a1de938f6012477b8893cf5e10ac59ff2525[m
+Author: attapalace
+Date: Sun Jul 15 13:50:21 2018 +0200
+
+ update dependencies and NotificationCompat support library
+
+[33mcommit 471fbd8762c48b3e6a6cfd6f6be6a966bed2c7d9[m
+Author: Sven Fischer
+Date: Thu Apr 19 19:51:30 2018 +0200
+
+ issue template: add closing question
+
+ * add final question w.r.t. user's experience with the app
+ * fix displaying of tag in path to server logs (was left out
+ in the markdown view)
+
+ inspired by second holiday story from Joey http://joeyh.name/blog/entry/two_holiday_stories/
+
+[33mcommit 49b757928553159f0abbfa94684d5e48c29531d4[m
+Author: tyndare
+Date: Wed Apr 4 04:32:48 2018 +0200
+
+ tts: automatic switch to article's language
+
+[33mcommit 2b56ab798be09818c09014d34144dd7c8c2adb28[m
+Author: Thomas Citharel
+Date: Thu Mar 22 14:53:36 2018 +0100
+
+ Add issue template
+
+[33mcommit f0daef9b8bdc49202abbb1fc1ced087c1fb9e81e[m
+Author: Thomas Kluth
+Date: Sun Mar 4 19:35:18 2018 +0100
+
+ fix broken back button
+
+[33mcommit 9ac6d3af3dedced4b9ef28fc57fa2458ee4d71cc[m
+Author: Thomas Kluth
+Date: Sat Feb 3 11:32:09 2018 +0100
+
+ add null checks
+
+[33mcommit d749e0ad3b0b3cb9d4937f2d1d6a387e0b19a843[m
+Author: Thomas Kluth
+Date: Fri Jan 26 23:54:55 2018 +0100
+
+ add scrolling via hardware keys in article lists
+
+[33mcommit 29231f9021323a5674576fc7d4b80848654312f0[m
+Merge: fbd6bef 89404ce
+Author: Strubbl
+Date: Tue Mar 6 19:47:16 2018 +0100
+
+ Merge pull request #699 from wallabag/update-to-okhttp-3.10.0
+
+ update okttp to 3.10.0
+
+[33mcommit 89404ce87abac7116e4eefcaa31f6ee32d722ad1[m
+Author: Sven Fischer
+Date: Sun Feb 25 17:57:32 2018 +0100
+
+ update okttp to 3.10.0
+
+[33mcommit fbd6beffaaec9841473d62c4c6425234eae23860[m
+Author: Niklas Wünsche
+Date: Fri Feb 23 17:37:56 2018 +0100
+
+ Add Share and Copy options for link menu Fix #610 (#677)
+
+ * Add Share and Copy options for link menu
+ * Fix #610
+ * Added the option to add a link to clipboard or share it. Also add a German translation for both of them.
+ * Reuse methods to copy and share URL
+ * Overload shareArticle the Right Way
+ * Rename and Overload copyOriginalURL
+
+[33mcommit 4a64be2debf372cd446c811422961c2b59696e8a[m
+Merge: b649a26 ae349c7
+Author: Strubbl
+Date: Fri Feb 23 17:36:24 2018 +0100
+
+ Merge pull request #683 from wallabag/fix-337-adding-icons-all-colors
+
+ theme: define per theme icon colors
+
+[33mcommit b649a26b5ce8968954274e09f39de9a9132ff33f[m
+Merge: fff08d4 1df3be9
+Author: Strubbl
+Date: Mon Feb 5 19:50:06 2018 +0100
+
+ Merge pull request #695 from wallabag/update_dependencies
+
+ update to okhttp 3.9.1 and aboutlibraries 6.0.2
+
+[33mcommit 1df3be920ec62433ceadbb16002924ab5a81121d[m
+Author: Sven Fischer
+Date: Mon Jan 29 21:03:00 2018 +0100
+
+ update to okhttp 3.9.1 and aboutlibraries 6.0.2
+
+[33mcommit fff08d4d6012a2cfa37edd3ebcbaa680da4aa5cf[m
+Merge: 9c2e6f2 1be0f6b
+Author: Strubbl
+Date: Mon Jan 29 20:11:48 2018 +0100
+
+ Merge pull request #590 from wallabag/fix-567-ArrayIndexOutOfBoundsException
+
+ Fixes #567 ArrayIndexOutOfBoundsException itemList.get(position)
+
+[33mcommit 9c2e6f282f226a62824834a51ad67a402dd6ba6c[m
+Merge: 4061082 a44df1c
+Author: Strubbl
+Date: Mon Jan 29 20:07:42 2018 +0100
+
+ Merge pull request #659 from Strubbl/fix-lint-assertions
+
+ fix lint Assert: Assertions
+
+[33mcommit 406108280bd2d05810c39335554a95bbdb28f3e6[m
+Merge: bfcaf78 58ff646
+Author: Strubbl
+Date: Mon Jan 29 20:06:45 2018 +0100
+
+ Merge pull request #665 from Strubbl/fix-lint-hardcoded-text
+
+ fix lint Hardcoded text
+
+[33mcommit bfcaf78b5c5b6d0b0fc3dd7406a4cc0a7c2a1d5f[m
+Merge: 1996fc1 60e5350
+Author: Strubbl
+Date: Mon Jan 29 20:05:59 2018 +0100
+
+ Merge pull request #693 from wallabag/update_translations
+
+ Update translations
+
+[33mcommit 58ff64630e92d4fbc953c9899daf0fc34b039d5a[m
+Author: Sven Fischer
+Date: Tue Dec 5 20:33:44 2017 +0100
+
+ fix lint Hardcoded text
+
+ fixes lint message in src/main/res/layout/list_item.xml:56: Hardcoded string "5 min", should use @string resource
+
+[33mcommit 60e5350e29395d4cfbe8d11f8757c41e6dee18a3[m
+Author: Strubbl
+Date: Mon Jan 29 17:54:59 2018 +0000
+
+ Translated using Weblate (German)
+
+ Currently translated at 100.0% (259 of 259 strings)
+
+[33mcommit ae349c7782440254d51559b3e8cb88d01069d0fc[m
+Author: Sven Fischer
+Date: Mon Jan 29 18:47:20 2018 +0100
+
+ fix icon color (read, star) in list_item.xml for light theme
+
+[33mcommit 89dd14b710526e7eda937a9fd8bd3d495dc394a8[m
+Author: Szilágyi Gyula
+Date: Mon Jan 29 07:40:33 2018 +0000
+
+ Translated using Weblate (Hungarian)
+
+ Currently translated at 100.0% (259 of 259 strings)
+
+[33mcommit 1996fc1d10073e935eef690634ccc52746a02a4c[m
+Merge: d1228ee 3eb7f85
+Author: Strubbl
+Date: Sun Jan 28 20:24:31 2018 +0100
+
+ Merge pull request #678 from silberzwiebel/fullscreenCleanBranch
+
+ fullscreen article view (clean branch, supersedes #642)
+
+[33mcommit d1228ee66b77099924cd81cd9d1e8aa4b23bbbb7[m
+Merge: 49e2d79 3931570
+Author: Strubbl
+Date: Sun Jan 14 20:28:54 2018 +0100
+
+ Merge pull request #689 from wallabag/update_translations
+
+ Update translations
+
+[33mcommit 39315704f0073f7c42b97f2e61f6435c4a2ba16c[m
+Author: naofum
+Date: Sun Jan 14 01:06:17 2018 +0000
+
+ Translated using Weblate (Japanese)
+
+ Currently translated at 100.0% (257 of 257 strings)
+
+[33mcommit 5129b1936ef2d3f0d4bc8e4c36f2b6b92d1e57c7[m
+Author: Szilágyi Gyula
+Date: Sat Jan 13 19:13:57 2018 +0000
+
+ Translated using Weblate (Hungarian)
+
+ Currently translated at 100.0% (257 of 257 strings)
+
+[33mcommit 49e2d79b532e7982c2ca0382c2bd82b0b51830de[m
+Merge: c7f0672 e5b4703
+Author: Strubbl
+Date: Sun Jan 14 20:10:31 2018 +0100
+
+ Merge pull request #688 from wallabag/update_translations
+
+ Update translations
+
+[33mcommit e5b4703eeed072c12ebe70fb32bb0175e4ba4517[m
+Author: Allan Nordhøy
+Date: Fri Jan 12 22:50:15 2018 +0000
+
+ Translated using Weblate (Norwegian Bokmål)
+
+ Currently translated at 100.0% (257 of 257 strings)
+
+[33mcommit f08f9cfa132c4ecfe043f62c2602c249dd1649cd[m
+Author: Strubbl
+Date: Fri Jan 12 18:10:08 2018 +0000
+
+ Translated using Weblate (German)
+
+ Currently translated at 100.0% (257 of 257 strings)
+
+[33mcommit a566e19e945162da10fff58628944f22a52f5da0[m
+Author: Yoann Sculo
+Date: Fri Jan 12 12:19:01 2018 +0000
+
+ Translated using Weblate (French)
+
+ Currently translated at 94.1% (242 of 257 strings)
+
+[33mcommit c7f06726a0c2540b694b6fe57a2c1233e862ee34[m
+Merge: c540ca4 8262784
+Author: Strubbl
+Date: Fri Jan 12 19:22:45 2018 +0100
+
+ Merge pull request #681 from comradekingu/patch-2
+
+ Spelling: Mark _as_ read
+
+[33mcommit c540ca443db3526a3dddcf700474341e57498618[m
+Merge: ce59742 bec4652
+Author: Strubbl
+Date: Fri Jan 12 19:03:05 2018 +0100
+
+ Merge pull request #686 from wallabag/2fa-warning
+
+ concretize error message usually coming from 2FA
+
+[33mcommit ce597426fb2e50a1dc19d47134be32aa4b1e2105[m
+Merge: 362dc3c 52e0051
+Author: Strubbl
+Date: Fri Jan 12 19:02:39 2018 +0100
+
+ Merge pull request #687 from yoannsculo/french_translation
+
+ French translation: fix agreement
+
+[33mcommit 52e0051706dd8e622f652f4775fef6ffab59369e[m
+Author: Yoann Sculo
+Date: Fri Jan 12 12:54:13 2018 +0100
+
+ French: fix agreement
+
+[33mcommit bec4652507be18e4daaae634c133be1040cf4223[m
+Author: Sven Fischer
+Date: Thu Jan 11 19:57:21 2018 +0100
+
+ concretize error message usually coming from 2FA
+
+ until #359 is implemented, the user gets a concretized error message.
+
+[33mcommit 362dc3cce732e451c9db63228588ea62196a23eb[m
+Merge: 0d8a089 36d28fb
+Author: Strubbl
+Date: Wed Jan 10 19:47:19 2018 +0100
+
+ Merge pull request #684 from wallabag/update_translations
+
+ Update translations
+
+[33mcommit 36d28fbe742b237fb7dcd97edd1f9e16245488a3[m
+Author: Allan Nordhøy
+Date: Tue Jan 9 04:44:42 2018 +0000
+
+ Translated using Weblate (Norwegian Bokmål)
+
+ Currently translated at 99.6% (256 of 257 strings)
+
+[33mcommit bc4e19b132eb83c9f13f26673caf37c68d942e78[m
+Author: naofum
+Date: Tue Jan 9 13:58:40 2018 +0000
+
+ Translated using Weblate (Japanese)
+
+ Currently translated at 100.0% (257 of 257 strings)
+
+[33mcommit 5a202cc1b5a842c5d48729e81e0194ff065c5d44[m
+Author: Szilágyi Gyula
+Date: Tue Jan 9 07:05:42 2018 +0000
+
+ Translated using Weblate (Hungarian)
+
+ Currently translated at 100.0% (257 of 257 strings)
+
+[33mcommit 4193760d89d6d39b034a6cfa24a3527fe64fc79e[m
+Author: Sven Fischer
+Date: Tue Jan 9 21:52:51 2018 +0100
+
+ theme: define per theme icon colors
+
+ fixes #337
+
+[33mcommit 0d8a0890a1beadf13162fef60ef163fe07af8a23[m
+Merge: e386f3a a80eacb
+Author: Strubbl
+Date: Tue Jan 9 17:35:17 2018 +0100
+
+ Merge pull request #679 from wallabag/scroll_over_bottom
+
+ Improve "scroll over bottom" logic
+
+[33mcommit 826278458e454c997cef8fbe150e196190e1f3ab[m
+Author: Allan Nordhøy
+Date: Tue Jan 9 05:47:56 2018 +0100
+
+ Spelling: Mark _as_ read
+
+[33mcommit e386f3a52e8a88d0bb2e8d0eaadc15507763d05f[m
+Merge: 1793b35 3439ddc
+Author: Strubbl
+Date: Tue Jan 9 00:05:03 2018 +0100
+
+ Merge pull request #680 from wallabag/update_translations
+
+ Update translations
+
+[33mcommit 3439ddc7a3975a48496f6b7329b5a98621911061[m
+Author: Dmitriy Bogdanov
+Date: Tue Jan 9 00:00:21 2018 +0400
+
+ Translations corrections
+
+[33mcommit aebbe9642ca6d9199d32434eedad4a89eff81d14[m
+Author: naofum
+Date: Fri Jan 5 14:56:58 2018 +0000
+
+ Translated using Weblate (Japanese)
+
+ Currently translated at 100.0% (253 of 253 strings)
+
+[33mcommit 668c0ffdc6cdc698eb400b06ba85492e53ab571c[m
+Author: naofum
+Date: Sun Dec 31 01:16:05 2017 +0000
+
+ Translated using Weblate (Japanese)
+
+ Currently translated at 91.3% (231 of 253 strings)
+
+[33mcommit c4476aa9c435c1993b5167352d6c2dd6c4e9afee[m
+Author: Florian
+Date: Thu Dec 28 21:47:17 2017 +0000
+
+ Translated using Weblate (French)
+
+ Currently translated at 83.0% (210 of 253 strings)
+
+[33mcommit f5bc73b6a2f468b6fd9879826f0bfb89fdd30dca[m
+Author: Albiz Aranberri
+Date: Tue Dec 26 21:49:51 2017 +0000
+
+ Translated using Weblate (Basque)
+
+ Currently translated at 84.9% (215 of 253 strings)
+
+[33mcommit e45c6ed58dace35aa5a0df82de46fa55875ed844[m
+Author: Allan Nordhøy
+Date: Thu Dec 14 05:54:54 2017 +0000
+
+ Translated using Weblate (Norwegian Bokmål)
+
+ Currently translated at 100.0% (253 of 253 strings)
+
+[33mcommit ad680205d89196ea1634efe76f20d0c02bc61bd0[m
+Author: Strubbl
+Date: Tue Dec 12 09:59:08 2017 +0000
+
+ Translated using Weblate (German)
+
+ Currently translated at 100.0% (253 of 253 strings)
+
+[33mcommit c1d4c6a3a5bb21a901c1780b91f21cb8628f4eab[m
+Author: Szilágyi Gyula
+Date: Tue Dec 12 09:55:06 2017 +0000
+
+ Translated using Weblate (Hungarian)
+
+ Currently translated at 100.0% (253 of 253 strings)
+
+[33mcommit a80eacbbf07fc06ee1314de0f3b5f83bc5b348de[m
+Author: Dmitriy Bogdanov
+Date: Mon Jan 8 22:24:11 2018 +0400
+
+ Improve "scroll over bottom" logic
+
+[33mcommit 1793b35299f2ecb27e2633e5a25ea3d34e56bfd2[m
+Merge: 7dc54bb 06cb4ee
+Author: Strubbl
+Date: Mon Jan 8 19:21:01 2018 +0100
+
+ Merge pull request #673 from yoannsculo/french_translation
+
+ French translation
+
+[33mcommit 7dc54bbbedeeb5857885ceffc1cd6d965546e3a1[m
+Merge: 7483a92 c32193f
+Author: Strubbl
+Date: Mon Jan 8 19:19:21 2018 +0100
+
+ Merge pull request #648 from silberzwiebel/scrollToBottom
+
+ add possibility to scroll towards the bottom to mark article as read
+
+[33mcommit 3eb7f8511f5a07c2aa01ddc3de144f20e06baecb[m
+Author: Thomas Kluth
+Date: Wed Nov 1 18:09:32 2017 +0100
+
+ use ACTION_UP only for PAGE_UP/DOWN keys
+
+[33mcommit 7263b16c1e17b1f7ad49e3da5aecc7d09e4b15e9[m
+Author: Thomas Kluth
+Date: Sun Oct 22 15:04:13 2017 +0200
+
+ hide actionBar as well for fullscreen article view; fixes #114 and #636
+
+[33mcommit 6f6435d1cad08e8e76d556f3dafa6426a6426dd1[m
+Author: Thomas Kluth
+Date: Mon Oct 2 11:32:13 2017 +0200
+
+ added TODOs of smaller issues that should be resolved before a pull-request
+
+[33mcommit 461698268544c6fa24e51b26f2d122ea12a6e7b3[m
+Author: Thomas Kluth
+Date: Mon Oct 2 11:07:31 2017 +0200
+
+ added fullscreen support for article view, toggable via settings
+
+[33mcommit 06cb4eebeabfae5d41fb99a8ae6c1866983fd48b[m
+Author: Yoann Sculo
+Date: Thu Jan 4 16:09:19 2018 +0100
+
+ French: remove uppercase when incorrect
+
+[33mcommit ef92a0d2c21680abd5f5885aa5aca58d14a09e26[m
+Author: Yoann Sculo
+Date: Thu Jan 4 14:12:29 2018 +0100
+
+ French: add missing translation
+
+[33mcommit e1f022876df9227bb9e78cbe6825cca12c4b68b7[m
+Author: Yoann Sculo
+Date: Thu Jan 4 13:53:27 2018 +0100
+
+ French: align translation order to English file
+
+ By sorting the file and aligning with reference English translation, it
+ eases future translation.
+
+ Signed-off-by: Yoann Sculo
+
+[33mcommit 23c83167181034f59d4d944ea4b8a50815409a00[m
+Author: Yoann Sculo
+Date: Thu Jan 4 12:41:17 2018 +0100
+
+ French: misc translation correcting
+
+[33mcommit d8367841af26d5e00c1d39a77414df4a539809e8[m
+Author: Yoann Sculo
+Date: Thu Jan 4 12:38:47 2018 +0100
+
+ French: translate remove_tag
+
+[33mcommit ff83cffed711afa4b1705a6a831bc928f15e6ccb[m
+Author: Yoann Sculo
+Date: Thu Jan 4 12:31:58 2018 +0100
+
+ French: reorder and fully translate Miscellaneous category
+
+[33mcommit a89a8695d8453bba47e773625b47244bc75c345a[m
+Author: Yoann Sculo
+Date: Thu Jan 4 12:16:42 2018 +0100
+
+ French: add Miscellanea group to Interface settings category
+
+ not fully translated yet
+
+[33mcommit 7591e84eb5c603a02287dc26443256b58cbee07c[m
+Author: Yoann Sculo
+Date: Thu Jan 4 12:01:11 2018 +0100
+
+ French: remove uppercase when incorrect
+
+[33mcommit a1fd7863d135da8d27cd1abc0af5f032ca5e6678[m
+Author: Yoann Sculo
+Date: Thu Jan 4 11:59:17 2018 +0100
+
+ French: be consistent with Wallabag (web) translations
+
+[33mcommit 7483a920a7cac256ad76916e628537c9aa4f04d3[m
+Merge: 6373f7a 2de1426
+Author: Strubbl
+Date: Wed Jan 3 15:24:26 2018 +0100
+
+ Merge pull request #672 from yoannsculo/master
+
+ Add missing French translation
+
+[33mcommit c32193fae6ab23a856af3746ade5a5e94077a031[m
+Author: Sven Fischer
+Date: Wed Jan 3 14:58:38 2018 +0100
+
+ set scroll to bottom to def. value 3
+
+[33mcommit 8601a378f19910e8815427146be7cefd8abbbf05[m
+Merge: cd9009b 49eb507
+Author: Thomas Kluth
+Date: Sat Dec 23 14:28:06 2017 +0100
+
+ merge
+
+[33mcommit cd9009ba4f1d27153415c22e14e7cf92abcae45c[m
+Author: Thomas Kluth
+Date: Sat Dec 23 14:26:35 2017 +0100
+
+ add preference for scroll over bottom to mark as read; only enable scroll over bottom via physical key presses
+
+[33mcommit da39effeea5db042218554df42451cc99f4f5183[m
+Merge: 38a8a50 6373f7a
+Author: Thomas Kluth
+Date: Sat Dec 23 13:26:55 2017 +0100
+
+ merge master branch
+
+[33mcommit 49eb5075b739614f54a1a779d0a9b2427fe4969d[m
+Merge: 38a8a50 6373f7a
+Author: kartoffelsalat
+Date: Sat Dec 23 13:23:28 2017 +0100
+
+ Merge branch 'master' into scrollToBottom
+
+[33mcommit 2de1426f35cfac868692aba05ec3ae81629dcfd4[m
+Author: Yoann Sculo
+Date: Fri Dec 22 17:19:21 2017 +0100
+
+ French translation: remove uppercase
+
+[33mcommit 115dda4f29c32c869d8de479a57427de063eddd5[m
+Author: Yoann Sculo
+Date: Fri Dec 22 17:18:17 2017 +0100
+
+ add missing French translation
+
+[33mcommit a44df1cd4e612a43c2fd0ecb78220e5feb21c720[m
+Author: Sven Fischer
+Date: Tue Dec 5 18:28:11 2017 +0100
+
+ fix lint Assert: Assertions
+
+ fixes lint messages in src/main/java/fr/gaulupeau/apps/Poche/tts/TtsService.java: Assertions are unreliable in Dalvik and unimplemented in ART. Use BuildConfig.DEBUG conditional checks instead.
+
+[33mcommit 6373f7a704e8ea214b4652920b975675d22c188b[m
+Merge: 75c27b8 9e6a5f6
+Author: Strubbl
+Date: Tue Dec 12 01:39:35 2017 +0100
+
+ Merge pull request #666 from Strubbl/update-dep-aboutlibraries-5.9.6
+
+ update aboutlibraries to latest stable 5.9.6
+
+[33mcommit 75c27b8c65c975de60c8d70bcd5eb0ca3f0cf924[m
+Merge: 1c11c10 d48ccfd
+Author: Strubbl
+Date: Mon Dec 11 20:22:59 2017 +0100
+
+ Merge pull request #669 from wallabag/update_translations
+
+ Update translations
+
+[33mcommit 1c11c10cdcf430c718a17b5e8f8af0a030245ded[m
+Merge: a4ead0a 3fad1cf
+Author: Strubbl
+Date: Mon Dec 11 20:22:29 2017 +0100
+
+ Merge pull request #663 from Strubbl/fix-lint-missing-contentDescription
+
+ fixes lint Image without contentDescription
+
+[33mcommit a4ead0aeb699dcfa0757278b5f486161d9676904[m
+Merge: e007d01 250391d
+Author: Strubbl
+Date: Mon Dec 11 20:22:05 2017 +0100
+
+ Merge pull request #662 from Strubbl/fix-lint-ObsoleteSdkInt
+
+ fix lint messages w.r.t. minSdkVersion is 14 and never below
+
+[33mcommit e007d01d3fb631337b7397a875f2552b9865a002[m
+Merge: 452e6e5 5027ade
+Author: Strubbl
+Date: Mon Dec 11 20:21:48 2017 +0100
+
+ Merge pull request #664 from Strubbl/fix-lint-click-focus
+
+ fix lint Keyboard inaccessible widget
+
+[33mcommit 452e6e54c15e01d450d05f6f5f21f42a8e1251a4[m
+Merge: 2ec107a df5e620
+Author: Strubbl