Add auto loading images setting based on connectivity type

Requires the ACCESS_NETWORK_STATE permission unfortunately.
Options are always, wifi and none. Should be enough for all use cases.
filtering
Floens 10 years ago
parent bc5bc8564c
commit 84bba00ea2
  1. 1
      Clover/app/src/main/AndroidManifest.xml
  2. 32
      Clover/app/src/main/java/org/floens/chan/core/presenter/ImageViewerPresenter.java
  3. 30
      Clover/app/src/main/java/org/floens/chan/core/settings/ChanSettings.java
  4. 25
      Clover/app/src/main/java/org/floens/chan/ui/controller/MainSettingsController.java
  5. 15
      Clover/app/src/main/java/org/floens/chan/utils/AndroidUtils.java
  6. 6
      Clover/app/src/main/res/values/strings.xml

@ -22,6 +22,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application
android:name=".ChanApplication"

@ -17,6 +17,7 @@
*/
package org.floens.chan.core.presenter;
import android.net.ConnectivityManager;
import android.support.v4.view.ViewPager;
import org.floens.chan.core.model.Loadable;
@ -27,14 +28,13 @@ import org.floens.chan.ui.view.MultiImageView;
import java.util.ArrayList;
import java.util.List;
import static org.floens.chan.utils.AndroidUtils.isConnected;
public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.OnPageChangeListener {
private static final String TAG = "ImageViewerPresenter";
private final Callback callback;
private final boolean imageAutoLoad = ChanSettings.imageAutoLoad.get();
private final boolean movieAutoLoad = imageAutoLoad && ChanSettings.videoAutoLoad.get();
private boolean entering = true;
private boolean exiting = false;
private List<PostImage> images;
@ -178,12 +178,12 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.
private void onLowResInCenter() {
PostImage postImage = images.get(selectedPosition);
if (imageAutoLoad && !postImage.spoiler) {
if (imageAutoLoad() && !postImage.spoiler) {
if (postImage.type == PostImage.Type.STATIC) {
callback.setImageMode(postImage, MultiImageView.Mode.BIGIMAGE);
} else if (postImage.type == PostImage.Type.GIF) {
callback.setImageMode(postImage, MultiImageView.Mode.GIF);
} else if (postImage.type == PostImage.Type.MOVIE && movieAutoLoad) {
} else if (postImage.type == PostImage.Type.MOVIE && videoAutoLoad()) {
callback.setImageMode(postImage, MultiImageView.Mode.MOVIE);
}
}
@ -194,8 +194,8 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.
// Don't mistake a swipe when the pager is disabled as a tap
if (viewPagerVisible) {
PostImage postImage = images.get(selectedPosition);
if (imageAutoLoad && !postImage.spoiler) {
if (movieAutoLoad) {
if (imageAutoLoad() && !postImage.spoiler) {
if (videoAutoLoad()) {
onExit();
} else {
if (postImage.type == PostImage.Type.MOVIE) {
@ -257,6 +257,24 @@ public class ImageViewerPresenter implements MultiImageView.Callback, ViewPager.
callback.onVideoError(multiImageView);
}
private boolean imageAutoLoad() {
String autoLoadMode = ChanSettings.imageAutoLoadNetwork.get();
if (autoLoadMode.equals(ChanSettings.ImageAutoLoadMode.NONE.name)) {
return false;
} else if (autoLoadMode.equals(ChanSettings.ImageAutoLoadMode.WIFI.name)) {
return isConnected(ConnectivityManager.TYPE_WIFI);
} else if (autoLoadMode.equals(ChanSettings.ImageAutoLoadMode.ALL.name)) {
return true;
}
// Not connected or unrecognized
return false;
}
private boolean videoAutoLoad() {
return imageAutoLoad() && ChanSettings.videoAutoLoad.get();
}
private void setTitle(PostImage postImage, int position) {
callback.setTitle(postImage, position, images.size(),
postImage.spoiler && callback.getImageMode(postImage) == MultiImageView.Mode.LOWRES);

@ -30,11 +30,36 @@ import org.floens.chan.utils.AndroidUtils;
import java.io.File;
public class ChanSettings {
public enum ImageAutoLoadMode {
// ALways auto load, either wifi or mobile
ALL("all"),
// Only auto load if on wifi
WIFI("wifi"),
// Never auto load
NONE("none");
public String name;
ImageAutoLoadMode(String name) {
this.name = name;
}
public static ImageAutoLoadMode find(String name) {
for (ImageAutoLoadMode mode : ImageAutoLoadMode.values()) {
if (mode.name.equals(name)) {
return mode;
}
}
return null;
}
}
private static final StringSetting theme;
public static final StringSetting fontSize;
public static final BooleanSetting openLinkConfirmation;
public static final BooleanSetting autoRefreshThread;
public static final BooleanSetting imageAutoLoad;
// public static final BooleanSetting imageAutoLoad;
public static final StringSetting imageAutoLoadNetwork;
public static final BooleanSetting videoAutoLoad;
public static final BooleanSetting videoOpenExternal;
public static final BooleanSetting videoErrorIgnore;
@ -79,7 +104,8 @@ public class ChanSettings {
fontSize = new StringSetting(p, "preference_font", tablet ? "16" : "14");
openLinkConfirmation = new BooleanSetting(p, "preference_open_link_confirmation", true);
autoRefreshThread = new BooleanSetting(p, "preference_auto_refresh_thread", true);
imageAutoLoad = new BooleanSetting(p, "preference_image_auto_load", true);
// imageAutoLoad = new BooleanSetting(p, "preference_image_auto_load", true);
imageAutoLoadNetwork = new StringSetting(p, "preference_image_auto_load_network", ImageAutoLoadMode.WIFI.name);
videoAutoLoad = new BooleanSetting(p, "preference_autoplay", false);
videoOpenExternal = new BooleanSetting(p, "preference_video_external", false);
videoErrorIgnore = new BooleanSetting(p, "preference_video_error_ignore", false);

@ -102,7 +102,7 @@ public class MainSettingsController extends SettingsController implements Toolba
super.onPreferenceChange(item);
if (item == imageAutoLoadView) {
videoAutoLoadView.setEnabled(ChanSettings.imageAutoLoad.get());
videoAutoLoadView.setEnabled(!ChanSettings.imageAutoLoadNetwork.get().equals(ChanSettings.ImageAutoLoadMode.NONE.name));
} else if (item == fontView) {
EventBus.getDefault().post(new RefreshUIMessage("fontsize"));
}
@ -161,8 +161,27 @@ public class MainSettingsController extends SettingsController implements Toolba
browsing.add(new BooleanSettingView(this, ChanSettings.openLinkConfirmation, s(R.string.setting_open_link_confirmation), null));
browsing.add(new BooleanSettingView(this, ChanSettings.autoRefreshThread, s(R.string.setting_auto_refresh_thread), null));
imageAutoLoadView = browsing.add(new BooleanSettingView(this, ChanSettings.imageAutoLoad, s(R.string.setting_image_auto_load), null));
videoAutoLoadView = browsing.add(new BooleanSettingView(this, ChanSettings.videoAutoLoad, s(R.string.setting_video_auto_load), null));
List<ListSettingView.Item> imageAutoLoadTypes = new ArrayList<>();
for (ChanSettings.ImageAutoLoadMode mode : ChanSettings.ImageAutoLoadMode.values()) {
String name = "";
switch(mode) {
case ALL:
name = string(R.string.setting_image_auto_load_all);
break;
case WIFI:
name = string(R.string.setting_image_auto_load_wifi);
break;
case NONE:
name = string(R.string.setting_image_auto_load_none);
break;
}
imageAutoLoadTypes.add(new ListSettingView.Item(name, mode.name));
}
imageAutoLoadView = browsing.add(new ListSettingView(this, ChanSettings.imageAutoLoadNetwork, s(R.string.setting_image_auto_load), imageAutoLoadTypes.toArray(new ListSettingView.Item[imageAutoLoadTypes.size()])));
videoAutoLoadView = browsing.add(new BooleanSettingView(this, ChanSettings.videoAutoLoad, s(R.string.setting_video_auto_load), s(R.string.setting_video_auto_load_description)));
browsing.add(new BooleanSettingView(this, ChanSettings.videoOpenExternal, s(R.string.setting_video_open_external), s(R.string.setting_video_open_external_description)));
browsing.add(new LinkSettingView(this, string(R.string.setting_clear_thread_hides), null, new View.OnClickListener() {
@Override

@ -29,6 +29,8 @@ import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
@ -58,9 +60,13 @@ public class AndroidUtils {
public static Typeface ROBOTO_MEDIUM;
public static Typeface ROBOTO_MEDIUM_ITALIC;
private static ConnectivityManager connectivityManager;
public static void init() {
ROBOTO_MEDIUM = getTypeface("Roboto-Medium.ttf");
ROBOTO_MEDIUM_ITALIC = getTypeface("Roboto-MediumItalic.ttf");
connectivityManager = (ConnectivityManager) getAppRes().getSystemService(Context.CONNECTIVITY_SERVICE);
}
public static Resources getRes() {
@ -308,4 +314,13 @@ public class AndroidUtils {
((TextView) snackbar.getView().findViewById(R.id.snackbar_text)).setTextColor(0xffffffff);
snackbar.setActionTextColor(getAttrColor(context, R.attr.colorAccent));
}
public static ConnectivityManager getConnectivityManager() {
return connectivityManager;
}
public static boolean isConnected(int type) {
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(type);
return networkInfo != null && networkInfo.isConnected();
}
}

@ -200,7 +200,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
<string name="setting_open_link_confirmation">Ask before opening links</string>
<string name="setting_auto_refresh_thread">Auto refresh threads</string>
<string name="setting_image_auto_load">Auto load images</string>
<string name="setting_image_auto_load_all">Always</string>
<string name="setting_image_auto_load_wifi">Wi-Fi only</string>
<string name="setting_image_auto_load_none">Never</string>
<string name="setting_video_auto_load">Auto load videos</string>
<string name="setting_video_auto_load_description">Depends on auto load images</string>
<string name="setting_video_open_external">Open videos external</string>
<string name="setting_video_open_external_description">Open videos in an external media player</string>
<string name="setting_clear_thread_hides">Clear all thread hides</string>

Loading…
Cancel
Save