1
0
Fork 0
mirror of https://github.com/gsantner/dandelion synced 2024-06-16 16:44:53 +02:00

Allow to jump to last visited page on stream; FIX NullPtr in shared text methods

This commit is contained in:
Gregor Santner 2016-12-18 15:07:00 +01:00
parent d567b5fbdd
commit 4f3eac9977
No known key found for this signature in database
GPG key ID: 2AEB822A5CF48C9F
8 changed files with 125 additions and 40 deletions

View file

@ -28,6 +28,7 @@ import android.content.pm.PackageManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.provider.MediaStore; import android.provider.MediaStore;
import android.support.design.widget.Snackbar; import android.support.design.widget.Snackbar;
import android.view.Menu; import android.view.Menu;
@ -231,7 +232,10 @@ public class DiasporaStreamFragment extends BrowserFragment {
protected DiasporaStreamWebChromeClient.SharedTextCallback sharedTextCallback = new DiasporaStreamWebChromeClient.SharedTextCallback() { protected DiasporaStreamWebChromeClient.SharedTextCallback sharedTextCallback = new DiasporaStreamWebChromeClient.SharedTextCallback() {
@Override @Override
public String getSharedText() { public String getSharedText() {
return ((MainActivity) getActivity()).getTextToBeShared(); if(getActivity() != null) {
return ((MainActivity) getActivity()).getTextToBeShared();
}
return "";
} }
@Override @Override
@ -328,11 +332,16 @@ public class DiasporaStreamFragment extends BrowserFragment {
@SuppressWarnings("unused") @SuppressWarnings("unused")
@JavascriptInterface @JavascriptInterface
public void setUserProfile(final String webMessage) throws JSONException { public void setUserProfile(final String webMessage) throws JSONException {
DiasporaUserProfile pup = ((App) getActivity().getApplication()).getDiasporaUserProfile(); final DiasporaUserProfile pup = ((App) getActivity().getApplication()).getDiasporaUserProfile();
AppLog.spam(this, "StreamFragment.JavaScriptInterface.setUserProfile()"); AppLog.spam(this, "StreamFragment.JavaScriptInterface.setUserProfile()");
if (pup.isRefreshNeeded()) { if (pup.isRefreshNeeded()) {
AppLog.v(this, "DiasporaUserProfile needs refresh; Try to parse JSON"); AppLog.v(this, "DiasporaUserProfile needs refresh; Try to parse JSON");
pup.parseJson(webMessage); pup.parseJson(webMessage);
getActivity().runOnUiThread(new Runnable() {
public void run() {
pup.analyzeUrl(webView.getUrl());
}
});
} else { } else {
AppLog.spam(this, "No DiasporaUserProfile refresh needed"); AppLog.spam(this, "No DiasporaUserProfile refresh needed");
} }
@ -341,7 +350,9 @@ public class DiasporaStreamFragment extends BrowserFragment {
@SuppressWarnings("unused") @SuppressWarnings("unused")
@JavascriptInterface @JavascriptInterface
public void contentHasBeenShared() { public void contentHasBeenShared() {
((MainActivity) getActivity()).setTextToBeShared(null); if (getActivity() != null) {
((MainActivity) getActivity()).setTextToBeShared(null);
}
} }
} }

View file

@ -115,8 +115,7 @@ public class MainActivity extends ThemedActivity
private final Handler uiHandler = new Handler(); private final Handler uiHandler = new Handler();
private OpenExternalLinkReceiver brOpenExternalLink; private OpenExternalLinkReceiver brOpenExternalLink;
private BroadcastReceiver brSetTitle; private BroadcastReceiver brSetTitle;
private Snackbar snackbarExitApp; private Snackbar snackbarExitApp, snackbarNoInternet, snackbarLastVisitedTimestampInStream;
private Snackbar snackbarNoInternet;
private FragmentManager fm; private FragmentManager fm;
private CustomTabsSession customTabsSession; private CustomTabsSession customTabsSession;
@ -182,14 +181,15 @@ public class MainActivity extends ThemedActivity
brOpenExternalLink = new OpenExternalLinkReceiver(this); brOpenExternalLink = new OpenExternalLinkReceiver(this);
brSetTitle = new UpdateTitleReceiver(app, urls, new UpdateTitleReceiver.TitleCallback() { brSetTitle = new UpdateTitleReceiver(app, urls, new UpdateTitleReceiver.TitleCallback() {
public void setTitle(int resId) { public void setTitle(String url, int resId) {
CustomFragment top = getTopFragment(); CustomFragment top = getTopFragment();
if (top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) { if (top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) {
MainActivity.this.setTitle(resId); MainActivity.this.setTitle(resId);
showLastVisitedTimestampMessageIfNeeded(url);
} }
} }
public void setTitle(String title) { public void setTitle(String url, String title) {
CustomFragment top = getTopFragment(); CustomFragment top = getTopFragment();
if (top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) { if (top != null && top.getFragmentTag().equals(DiasporaStreamFragment.TAG)) {
MainActivity.this.setTitle(title); MainActivity.this.setTitle(title);
@ -238,12 +238,17 @@ public class MainActivity extends ThemedActivity
snackbarExitApp = Snackbar snackbarExitApp = Snackbar
.make(fragmentContainer, R.string.confirm_exit, Snackbar.LENGTH_LONG) .make(fragmentContainer, R.string.confirm_exit, Snackbar.LENGTH_LONG)
.setAction(android.R.string.yes, new View.OnClickListener() { .setAction(android.R.string.yes, new View.OnClickListener() {
@Override
public void onClick(View view) { public void onClick(View view) {
finish(); finish();
moveTaskToBack(true); moveTaskToBack(true);
} }
}); });
snackbarLastVisitedTimestampInStream = Snackbar.make(fragmentContainer, R.string.jump_to_last_visited_timestamp_in_stream, Snackbar.LENGTH_SHORT)
.setAction(android.R.string.yes, new View.OnClickListener() {
public void onClick(View view) {
openDiasporaUrl(urls.getStreamWithTimestampUrl(diasporaUserProfile.getLastVisitedPositionInStream()));
}
});
snackbarNoInternet = Snackbar.make(fragmentContainer, R.string.no_internet, Snackbar.LENGTH_LONG); snackbarNoInternet = Snackbar.make(fragmentContainer, R.string.no_internet, Snackbar.LENGTH_LONG);
// Load app settings // Load app settings
@ -251,18 +256,6 @@ public class MainActivity extends ThemedActivity
AppLog.v(this, "UI successfully set up"); AppLog.v(this, "UI successfully set up");
} }
/**
* Show DiasporaStreamFragment if necessary and load URL url
*
* @param url URL to load in the DiasporaStreamFragment
*/
public void openDiasporaUrl(String url) {
AppLog.v(this, "openDiasporaUrl()");
DiasporaStreamFragment streamFragment = (DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG);
showFragment(streamFragment);
streamFragment.loadUrl(url);
}
/** /**
* Get an instance of the CustomFragment with the tag fragmentTag. * Get an instance of the CustomFragment with the tag fragmentTag.
* If there was no instance so far, create a new one and add it to the FragmentManagers pool. * If there was no instance so far, create a new one and add it to the FragmentManagers pool.
@ -305,6 +298,26 @@ public class MainActivity extends ThemedActivity
} }
} }
/**
* Show DiasporaStreamFragment if necessary and load URL url
*
* @param url URL to load in the DiasporaStreamFragment
*/
public void openDiasporaUrl(String url) {
AppLog.v(this, "openDiasporaUrl()");
DiasporaStreamFragment streamFragment = (DiasporaStreamFragment) getFragment(DiasporaStreamFragment.TAG);
showFragment(streamFragment);
showLastVisitedTimestampMessageIfNeeded(url);
streamFragment.loadUrl(url);
}
public void showLastVisitedTimestampMessageIfNeeded(String url){
if (url.equals(urls.getStreamUrl()) && diasporaUserProfile.hasLastVisitedTimestampInStream()){
snackbarLastVisitedTimestampInStream.show();
diasporaUserProfile.resetLastVisitedPositionInStream();
}
}
/** /**
* Show the Fragment fragment in R.id.fragment_container. If the fragment was already visible, do nothing. * Show the Fragment fragment in R.id.fragment_container. If the fragment was already visible, do nothing.
* *

View file

@ -18,12 +18,14 @@
*/ */
package com.github.dfa.diaspora_android.data; package com.github.dfa.diaspora_android.data;
import android.net.ParseException;
import android.os.Handler; import android.os.Handler;
import com.github.dfa.diaspora_android.App; import com.github.dfa.diaspora_android.App;
import com.github.dfa.diaspora_android.listener.DiasporaUserProfileChangedListener; import com.github.dfa.diaspora_android.listener.DiasporaUserProfileChangedListener;
import com.github.dfa.diaspora_android.util.AppLog; import com.github.dfa.diaspora_android.util.AppLog;
import com.github.dfa.diaspora_android.util.AppSettings; import com.github.dfa.diaspora_android.util.AppSettings;
import com.github.dfa.diaspora_android.util.DiasporaUrlHelper;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@ -40,6 +42,7 @@ public class DiasporaUserProfile {
private DiasporaUserProfileChangedListener listener; private DiasporaUserProfileChangedListener listener;
private final App app; private final App app;
private final AppSettings appSettings; private final AppSettings appSettings;
DiasporaUrlHelper urls;
private JSONObject json; private JSONObject json;
private long userProfileLastLoadedTimestamp; private long userProfileLastLoadedTimestamp;
private boolean isWebUserProfileLoaded; private boolean isWebUserProfileLoaded;
@ -51,15 +54,17 @@ public class DiasporaUserProfile {
private String[] followedTags; private String[] followedTags;
private int notificationCount; private int notificationCount;
private int unreadMessagesCount; private int unreadMessagesCount;
private long lastVisitedPositionInStream = -1;
public DiasporaUserProfile(App app) { public DiasporaUserProfile(App app) {
this.app = app; this.app = app;
appSettings = app.getSettings(); appSettings = app.getSettings();
urls = new DiasporaUrlHelper(appSettings);
loadFromAppSettings(); loadFromAppSettings();
} }
public void loadFromAppSettings(){ public void loadFromAppSettings() {
avatarUrl = appSettings.getAvatarUrl(); avatarUrl = appSettings.getAvatarUrl();
guid = appSettings.getProfileId(); guid = appSettings.getProfileId();
name = appSettings.getName(); name = appSettings.getName();
@ -67,6 +72,7 @@ public class DiasporaUserProfile {
followedTags = appSettings.getFollowedTags(); followedTags = appSettings.getFollowedTags();
notificationCount = appSettings.getNotificationCount(); notificationCount = appSettings.getNotificationCount();
unreadMessagesCount = appSettings.getUnreadMessageCount(); unreadMessagesCount = appSettings.getUnreadMessageCount();
lastVisitedPositionInStream = appSettings.getLastVisitedPositionInStream();
} }
public DiasporaUserProfile(App app, Handler callbackHandler, DiasporaUserProfileChangedListener listener) { public DiasporaUserProfile(App app, Handler callbackHandler, DiasporaUserProfileChangedListener listener) {
@ -137,6 +143,16 @@ public class DiasporaUserProfile {
return isWebUserProfileLoaded; return isWebUserProfileLoaded;
} }
public void analyzeUrl(String url) {
String prefix = urls.getPodUrl() + DiasporaUrlHelper.SUBURL_STREAM_WITH_TIMESTAMP;
if (url.startsWith(prefix)) {
try {
setLastVisitedPositionInStream(Long.parseLong(url.replace(prefix, "")));
} catch (NumberFormatException ignored) {
}
}
}
/* /*
// Getters & Setters // Getters & Setters
*/ */
@ -169,6 +185,23 @@ public class DiasporaUserProfile {
return followedTags; return followedTags;
} }
public long getLastVisitedPositionInStream() {
return lastVisitedPositionInStream;
}
public void setLastVisitedPositionInStream(long lastVisitedPositionInStream) {
this.lastVisitedPositionInStream = lastVisitedPositionInStream;
appSettings.setLastVisitedPositionInStream(lastVisitedPositionInStream);
}
public boolean hasLastVisitedTimestampInStream() {
return appSettings.getLastVisitedPositionInStream() != -1;
}
public void resetLastVisitedPositionInStream() {
appSettings.setLastVisitedPositionInStream(-1);
}
/* /*
* Private property setters * Private property setters
*/ */

View file

@ -38,6 +38,7 @@ public class UpdateTitleReceiver extends BroadcastReceiver {
private AppSettings appSettings; private AppSettings appSettings;
private App app; private App app;
private TitleCallback callback; private TitleCallback callback;
private String lastUrl;
public UpdateTitleReceiver(App app, DiasporaUrlHelper urls, TitleCallback callback) { public UpdateTitleReceiver(App app, DiasporaUrlHelper urls, TitleCallback callback) {
this.urls = urls; this.urls = urls;
@ -48,9 +49,9 @@ public class UpdateTitleReceiver extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String url = intent.getStringExtra(MainActivity.EXTRA_URL); lastUrl = intent.getStringExtra(MainActivity.EXTRA_URL);
if (url != null && url.startsWith(urls.getPodUrl())) { if (lastUrl != null && lastUrl.startsWith(urls.getPodUrl())) {
String subUrl = url.substring((urls.getPodUrl()).length()); String subUrl = lastUrl.substring((urls.getPodUrl()).length());
AppLog.spam(this, "onReceive()- Set title for subUrl " + subUrl); AppLog.spam(this, "onReceive()- Set title for subUrl " + subUrl);
if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_STREAM)) { if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_STREAM)) {
setTitle(R.string.nav_stream); setTitle(R.string.nav_stream);
@ -74,24 +75,24 @@ public class UpdateTitleReceiver extends BroadcastReceiver {
setTitle(R.string.nav_mentions); setTitle(R.string.nav_mentions);
} else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_PUBLIC)) { } else if (subUrl.startsWith(DiasporaUrlHelper.SUBURL_PUBLIC)) {
setTitle(R.string.public_); setTitle(R.string.public_);
} else if (urls.isAspectUrl(url)) { } else if (urls.isAspectUrl(lastUrl)) {
setTitle(urls.getAspectNameFromUrl(url, app)); setTitle(urls.getAspectNameFromUrl(lastUrl, app));
} }
} else { } else {
AppLog.spam(this, "onReceive()- Invalid url: " + url); AppLog.spam(this, "onReceive()- Invalid url: " + lastUrl);
} }
} }
private void setTitle(int rId) { private void setTitle(int rId) {
callback.setTitle(rId); callback.setTitle(lastUrl, rId);
} }
private void setTitle(String title) { private void setTitle(String title) {
callback.setTitle(title); callback.setTitle(lastUrl, title);
} }
public interface TitleCallback { public interface TitleCallback {
void setTitle(int resId); void setTitle(String url, int resId);
void setTitle(String title); void setTitle(String url, String title);
} }
} }

View file

@ -87,6 +87,10 @@ public class AppSettings {
pref.edit().putInt(context.getString(keyRessourceId), value).apply(); pref.edit().putInt(context.getString(keyRessourceId), value).apply();
} }
private void setLong(SharedPreferences pref, int keyRessourceId, long value) {
pref.edit().putLong(context.getString(keyRessourceId), value).apply();
}
private void setBool(SharedPreferences pref, int keyRessourceId, boolean value) { private void setBool(SharedPreferences pref, int keyRessourceId, boolean value) {
pref.edit().putBoolean(context.getString(keyRessourceId), value).apply(); pref.edit().putBoolean(context.getString(keyRessourceId), value).apply();
} }
@ -123,11 +127,23 @@ public class AppSettings {
private int getInt(SharedPreferences pref, int ressourceId, int defaultValue) { private int getInt(SharedPreferences pref, int ressourceId, int defaultValue) {
return pref.getInt(context.getString(ressourceId), defaultValue); return pref.getInt(context.getString(ressourceId), defaultValue);
} }
private long getLong(SharedPreferences pref, int ressourceId, long defaultValue) {
return pref.getLong(context.getString(ressourceId), defaultValue);
}
public int getColor(SharedPreferences pref, String key, int defaultColor) { public int getColor(SharedPreferences pref, String key, int defaultColor) {
return pref.getInt(key, defaultColor); return pref.getInt(key, defaultColor);
} }
public void registerPrefAppPreferenceChangedListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
prefApp.registerOnSharedPreferenceChangeListener(listener);
}
public void unregisterPrefAppPreferenceChangedListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
prefApp.unregisterOnSharedPreferenceChangeListener(listener);
}
/* /*
// Setters & Getters // Setters & Getters
@ -396,6 +412,14 @@ public class AppSettings {
return getString(prefApp, R.string.pref_key__screen_rotation, R.string.rotation_val_system); return getString(prefApp, R.string.pref_key__screen_rotation, R.string.rotation_val_system);
} }
public long getLastVisitedPositionInStream(){
return getLong(prefPod, R.string.pref_key__podprofile_last_stream_position, -1);
}
public void setLastVisitedPositionInStream(long timestamp){
setLong(prefPod, R.string.pref_key__podprofile_last_stream_position, timestamp);
}
public void setPrimaryColorSettings(int base, int shade) { public void setPrimaryColorSettings(int base, int shade) {
setInt(prefApp, R.string.pref_key__primary_color_base, base); setInt(prefApp, R.string.pref_key__primary_color_base, base);
setInt(prefApp, R.string.pref_key__primary_color_shade, shade); setInt(prefApp, R.string.pref_key__primary_color_shade, shade);
@ -431,12 +455,4 @@ public class AppSettings {
public boolean isExtendedNotificationsActivated() { public boolean isExtendedNotificationsActivated() {
return getBoolean(prefApp, R.string.pref_key__extended_notifications, false); return getBoolean(prefApp, R.string.pref_key__extended_notifications, false);
} }
public void registerPrefAppPreferenceChangedListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
prefApp.registerOnSharedPreferenceChangeListener(listener);
}
public void unregisterPrefAppPreferenceChangedListener(SharedPreferences.OnSharedPreferenceChangeListener listener) {
prefApp.unregisterOnSharedPreferenceChangeListener(listener);
}
} }

View file

@ -34,6 +34,7 @@ public class DiasporaUrlHelper {
public static final String SUBURL_NOTIFICATIONS = "/notifications"; public static final String SUBURL_NOTIFICATIONS = "/notifications";
public static final String SUBURL_POSTS = "/posts/"; public static final String SUBURL_POSTS = "/posts/";
public static final String SUBURL_STREAM = "/stream"; public static final String SUBURL_STREAM = "/stream";
public static final String SUBURL_STREAM_WITH_TIMESTAMP = SUBURL_STREAM+"?max_time=";
public static final String SUBURL_CONVERSATIONS = "/conversations"; public static final String SUBURL_CONVERSATIONS = "/conversations";
public static final String SUBURL_NEW_POST = "/status_messages/new"; public static final String SUBURL_NEW_POST = "/status_messages/new";
public static final String SUBURL_PEOPLE = "/people/"; public static final String SUBURL_PEOPLE = "/people/";
@ -90,6 +91,15 @@ public class DiasporaUrlHelper {
return getPodUrl() + SUBURL_STREAM; return getPodUrl() + SUBURL_STREAM;
} }
/**
* Return a url that points to the stream of the configured diaspora account on a timestamp
*
* @return https://(pod-domain.tld)/stream?max_time=1482057867
*/
public String getStreamWithTimestampUrl(long timestamp) {
return getPodUrl() + SUBURL_STREAM_WITH_TIMESTAMP + timestamp;
}
/** /**
* Return a url that points to the notifications feed of the configured diaspora account * Return a url that points to the notifications feed of the configured diaspora account
* *

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- Key Names (Untranslatable) --> <!-- Key Names (Untranslatable) -->
<string name="pref_key__poddomain_legacy" translatable="false">podDomain</string>
<string name="pref_key__current_pod_0" translatable="false">pref_key__current_pod_0</string> <string name="pref_key__current_pod_0" translatable="false">pref_key__current_pod_0</string>
<string name="pref_key__font_size" translatable="false">pref_key_font_size</string> <string name="pref_key__font_size" translatable="false">pref_key_font_size</string>
<string name="pref_key__intellihide_toolbars" translatable="false">pref_key_intellihide_toolbars</string> <string name="pref_key__intellihide_toolbars" translatable="false">pref_key_intellihide_toolbars</string>
@ -59,6 +58,7 @@
<string name="pref_key__podprofile_followed_tags_favs" translatable="false">podUserProfile_followedTags_favs</string> <string name="pref_key__podprofile_followed_tags_favs" translatable="false">podUserProfile_followedTags_favs</string>
<string name="pref_key__podprofile_unread_message_count" translatable="false">podUserProfile_unreadMessageCount</string> <string name="pref_key__podprofile_unread_message_count" translatable="false">podUserProfile_unreadMessageCount</string>
<string name="pref_key__podprofile_notification_count" translatable="false">podUserProfile_NotificationCount</string> <string name="pref_key__podprofile_notification_count" translatable="false">podUserProfile_NotificationCount</string>
<string name="pref_key__podprofile_last_stream_position" translatable="false">podUserProfile_LastStreamPosition</string>
<!-- More --> <!-- More -->
<string name="pref_key__logging_spam_enabled" translatable="false">pref_key__logging_spam_enabled</string> <string name="pref_key__logging_spam_enabled" translatable="false">pref_key__logging_spam_enabled</string>

View file

@ -113,4 +113,5 @@
<string name="https" translatable="false">https</string> <string name="https" translatable="false">https</string>
<string name="pod_address">Pod address</string> <string name="pod_address">Pod address</string>
<string name="missing_value">Missing value</string> <string name="missing_value">Missing value</string>
<string name="jump_to_last_visited_timestamp_in_stream">Jump to last visited page?</string>
</resources> </resources>