diff --git a/app/src/main/java/org/kiwix/kiwixmobile/KiwixMobileActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/KiwixMobileActivity.java index 9b95c3862..e79611759 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/KiwixMobileActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/KiwixMobileActivity.java @@ -181,6 +181,8 @@ public class KiwixMobileActivity extends BaseActivity implements WebViewCallback public static boolean refresh; + public static boolean wifiOnly; + private static Uri KIWIX_LOCAL_MARKET_URI; private static Uri KIWIX_BROWSER_MARKET_URI; @@ -303,6 +305,7 @@ public class KiwixMobileActivity extends BaseActivity implements WebViewCallback public void onCreate(Bundle savedInstanceState) { SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); nightMode = sharedPreferences.getBoolean(PREF_NIGHT_MODE, false); + wifiOnly = sharedPreferences.getBoolean(KiwixSettingsActivity.PREF_WIFI_ONLY, true); if (nightMode) { setTheme(R.style.AppTheme_Night); } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.java b/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.java index f78b4290d..7fa771762 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadFragment.java @@ -3,9 +3,12 @@ package org.kiwix.kiwixmobile.downloader; import android.app.Activity; import android.app.AlertDialog; +import android.content.Context; +import android.content.SharedPreferences; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; +import android.preference.PreferenceManager; import android.support.annotation.Nullable; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; @@ -25,6 +28,9 @@ import android.widget.TextView; import java.util.Arrays; import java.util.LinkedHashMap; +import org.kiwix.kiwixmobile.KiwixMobileActivity; +import org.kiwix.kiwixmobile.settings.KiwixSettingsActivity; +import org.kiwix.kiwixmobile.utils.NetworkUtils; import org.kiwix.kiwixmobile.zim_manager.library_view.LibraryFragment; import org.kiwix.kiwixmobile.R; import org.kiwix.kiwixmobile.zim_manager.fileselect_view.ZimFileSelectFragment; @@ -76,6 +82,22 @@ public class DownloadFragment extends Fragment { } } + public static void showNoWiFiWarning(Context context, Runnable yesAction) { + new AlertDialog.Builder(context) + .setTitle(R.string.wifi_only_title) + .setMessage(R.string.wifi_only_msg) + .setPositiveButton(R.string.yes, (dialog, i) -> { + PreferenceManager.getDefaultSharedPreferences(context) + .edit() + .putBoolean(KiwixSettingsActivity.PREF_WIFI_ONLY, false) + .apply(); + KiwixMobileActivity.wifiOnly = false; + yesAction.run(); + }) + .setNegativeButton(R.string.no, (dialog, i) -> {}) + .show(); + } + public class DownloadAdapter extends BaseAdapter { private LinkedHashMap mData = new LinkedHashMap(); @@ -141,8 +163,8 @@ public class DownloadFragment extends Fragment { private void setPlayState(ImageView pauseButton, int position, int newPlayState) { if(newPlayState == DownloadService.PLAY) { //Playing - LibraryFragment.mService.playDownload(mKeys[position]); - pauseButton.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_pause_black_24dp)); + if (LibraryFragment.mService.playDownload(mKeys[position])) + pauseButton.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_pause_black_24dp)); } else { //Pausing LibraryFragment.mService.pauseDownload(mKeys[position]); pauseButton.setImageDrawable(ContextCompat.getDrawable(getActivity(), R.drawable.ic_play_arrow_black_24dp)); @@ -185,6 +207,12 @@ public class DownloadFragment extends Fragment { pause.setOnClickListener(v -> { int newPlayPauseState = LibraryFragment.mService.downloadStatus.get(mKeys[position]) == DownloadService.PLAY ? DownloadService.PAUSE : DownloadService.PLAY; + + if (newPlayPauseState == DownloadService.PLAY && KiwixMobileActivity.wifiOnly && !NetworkUtils.isWiFi(getContext())) { + showNoWiFiWarning(getContext(), () -> {setPlayState(pause, position, newPlayPauseState);}); + return; + } + setPlayState(pause, position, newPlayPauseState); }); diff --git a/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadService.java b/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadService.java index 6d3ea092d..cf269e5cd 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadService.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/downloader/DownloadService.java @@ -2,6 +2,7 @@ package org.kiwix.kiwixmobile.downloader; import static org.kiwix.kiwixmobile.utils.files.FileUtils.getCurrentSize; +import android.app.AlertDialog; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; @@ -14,6 +15,7 @@ import android.os.IBinder; import android.os.Looper; import android.preference.PreferenceManager; import android.support.v4.app.NotificationCompat; +import android.util.Log; import android.util.Pair; import android.util.SparseArray; import android.util.SparseIntArray; @@ -30,7 +32,9 @@ import okhttp3.Response; import okio.BufferedSource; import org.kiwix.kiwixmobile.KiwixApplication; import org.kiwix.kiwixmobile.KiwixMobileActivity; +import org.kiwix.kiwixmobile.utils.NetworkUtils; import org.kiwix.kiwixmobile.utils.TestingUtils; +import org.kiwix.kiwixmobile.zim_manager.ZimManageActivity; import org.kiwix.kiwixmobile.zim_manager.library_view.LibraryFragment; import org.kiwix.kiwixmobile.R; import org.kiwix.kiwixmobile.database.BookDao; @@ -58,6 +62,7 @@ public class DownloadService extends Service { public static final int CANCEL = 4; public static final String ACTION_PAUSE = "PAUSE"; public static final String ACTION_STOP = "STOP"; + public static final String ACTION_NO_WIFI = "NO_WIFI"; public static final String NOTIFICATION_ID = "NOTIFICATION_ID"; public static int notificationCount = 1; public static ArrayList notifications = new ArrayList<>(); @@ -103,7 +108,11 @@ public class DownloadService extends Service { return START_NOT_STICKY; } if (intent.hasExtra(NOTIFICATION_ID) && intent.getAction().equals(ACTION_PAUSE)) { - toggleDownload(intent.getIntExtra(NOTIFICATION_ID, 0)); + if (KiwixMobileActivity.wifiOnly && !NetworkUtils.isWiFi(getApplicationContext())) { + startActivity(new Intent(this, ZimManageActivity.class).setAction(ACTION_NO_WIFI).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + this.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); + } else + toggleDownload(intent.getIntExtra(NOTIFICATION_ID, 0)); return START_NOT_STICKY; } @@ -201,7 +210,7 @@ public class DownloadService extends Service { downloadFragment.listView.invalidateViews(); } - public void playDownload(int notificationID) { + public boolean playDownload(int notificationID) { downloadStatus.put(notificationID, PLAY); synchronized (pauseLock) { pauseLock.notify(); @@ -211,6 +220,8 @@ public class DownloadService extends Service { notificationManager.notify(notificationID, notification.get(notificationID).build()); downloadFragment.downloadAdapter.notifyDataSetChanged(); downloadFragment.listView.invalidateViews(); + + return true; } private void downloadBook(String url, int notificationID, LibraryNetworkEntity.Book book) { @@ -365,6 +376,10 @@ public class DownloadService extends Service { attempts = timeout; break; } + + if (KiwixMobileActivity.wifiOnly && !NetworkUtils.isWiFi(getApplicationContext())) + pauseDownload(chunk.getNotificationID()); + if (downloadStatus.get(chunk.getNotificationID()) == PAUSE) { synchronized (pauseLock) { try { diff --git a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java index 617cc4ba8..6ac140b07 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/settings/KiwixSettingsActivity.java @@ -81,6 +81,8 @@ public class KiwixSettingsActivity extends AppCompatActivity { public static final String PREF_HIDETOOLBAR = "pref_hidetoolbar"; + public static final String PREF_WIFI_ONLY = "pref_wifi_only"; + public static String zimFile; public static boolean allHistoryCleared = false; @@ -266,6 +268,9 @@ public class KiwixSettingsActivity extends AppCompatActivity { KiwixMobileActivity.nightMode = sharedPreferences.getBoolean(PREF_NIGHTMODE, false); getActivity().recreate(); } + if (key.equals(PREF_WIFI_ONLY)) { + KiwixMobileActivity.wifiOnly = sharedPreferences.getBoolean(PREF_WIFI_ONLY, true); + } } diff --git a/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java b/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java index 83c2c052b..467bac5f6 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/utils/NetworkUtils.java @@ -3,6 +3,7 @@ package org.kiwix.kiwixmobile.utils; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; +import android.os.Build; import android.util.Log; import java.util.UUID; import org.kiwix.kiwixmobile.KiwixMobileActivity; @@ -29,6 +30,21 @@ public class NetworkUtils { return false; } + public static boolean isWiFi(Context context) { + ConnectivityManager connectivity = (ConnectivityManager) context + .getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivity == null) + return false; + + if (Build.VERSION.SDK_INT >= 23) { + NetworkInfo network = connectivity.getActiveNetworkInfo(); + return network.getType() == ConnectivityManager.TYPE_WIFI; + } else { + NetworkInfo wifi = connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI); + return wifi.isConnected(); + } + } + public static String getFileNameFromUrl(String url) { int index = url.lastIndexOf('?'); diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.java b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.java index b168fa7f7..7d7843b14 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/ZimManageActivity.java @@ -30,6 +30,7 @@ import java.util.ArrayList; import java.util.List; import org.kiwix.kiwixmobile.KiwixMobileActivity; +import org.kiwix.kiwixmobile.downloader.DownloadService; import org.kiwix.kiwixmobile.library.LibraryAdapter.Language; import org.kiwix.kiwixmobile.utils.TestingUtils; import org.kiwix.kiwixmobile.zim_manager.library_view.LibraryFragment; @@ -81,6 +82,10 @@ public class ZimManageActivity extends AppCompatActivity { setUpToolbar(); + if (DownloadService.ACTION_NO_WIFI.equals(getIntent().getAction())) { + DownloadFragment.showNoWiFiWarning(this, () -> {}); + } + // Create the adapter that will return a fragment for each of the three // primary sections of the activity. mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); diff --git a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.java b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.java index fae4a419e..d8afada5f 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.java +++ b/app/src/main/java/org/kiwix/kiwixmobile/zim_manager/library_view/LibraryFragment.java @@ -52,6 +52,7 @@ import org.kiwix.kiwixmobile.downloader.DownloadIntent; import org.kiwix.kiwixmobile.downloader.DownloadService; import org.kiwix.kiwixmobile.library.LibraryAdapter; import org.kiwix.kiwixmobile.network.KiwixService; +import org.kiwix.kiwixmobile.utils.NetworkUtils; import org.kiwix.kiwixmobile.utils.StorageUtils; import org.kiwix.kiwixmobile.utils.StyleUtils; import org.kiwix.kiwixmobile.utils.TestingUtils; @@ -190,20 +191,6 @@ public class LibraryFragment extends Fragment TestingUtils.unbindResource(LibraryFragment.class); } - - public void displayNetworkConfirmation() { - libraryList.removeFooterView(progressBar); - networkText.setText(R.string.download_over_network); - networkText.setVisibility(View.VISIBLE); - permissionButton.setVisibility(View.VISIBLE); - permissionButton.setOnClickListener(view -> { - presenter.loadBooks(); - permissionButton.setVisibility(View.GONE); - networkText.setVisibility(View.GONE); - }); - TestingUtils.unbindResource(LibraryFragment.class); - } - public void noNetworkConnection() { displayNoNetworkConnection(); } @@ -259,24 +246,14 @@ public class LibraryFragment extends Fragment return; } - if (isWiFi()) { - downloadFile((Book) parent.getAdapter().getItem(position)); + if (KiwixMobileActivity.wifiOnly && !NetworkUtils.isWiFi(getContext())) { + DownloadFragment.showNoWiFiWarning(getContext(), () -> {downloadFile((Book) parent.getAdapter().getItem(position));}); } else { - mobileDownloadDialog(position, parent); + downloadFile((Book) parent.getAdapter().getItem(position)); } } } - public boolean isWiFi() { - if (Build.VERSION.SDK_INT >= 23) { - NetworkInfo network = conMan.getActiveNetworkInfo(); - return network.getType() == ConnectivityManager.TYPE_WIFI; - } else { - NetworkInfo wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI); - return wifi.isConnected(); - } - } - public void mobileDownloadDialog(int position, AdapterView parent) { new AlertDialog.Builder(super.getActivity(), dialogStyle()) @@ -296,7 +273,7 @@ public class LibraryFragment extends Fragment @Override public void downloadFile(Book book) { downloadingBooks.add(book); - if (libraryAdapter != null && faActivity.searchView != null) { + if (libraryAdapter != null && faActivity != null && faActivity.searchView != null) { libraryAdapter.getFilter().filter(faActivity.searchView.getQuery()); } Toast.makeText(super.getActivity(), getString(R.string.download_started_library), Toast.LENGTH_LONG) @@ -365,11 +342,9 @@ public class LibraryFragment extends Fragment NetworkInfo network = conMan.getActiveNetworkInfo(); if ((books == null || books.isEmpty()) && network != null && network.isConnected()) { - if (isWiFi()) { - presenter.loadBooks(); - } else { - displayNetworkConfirmation(); - } + presenter.loadBooks(); + permissionButton.setVisibility(View.GONE); + networkText.setVisibility(View.GONE); } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9ee5a7423..77d99398f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -111,7 +111,6 @@ No downloads here No files here Download complete - Are you sure you want to start the download without WiFi? Insufficient space to download this file. Space Available: Simple @@ -165,4 +164,7 @@ Delete Tab Next Previous + Allow downloading content via mobile network? + If you choose "Yes" you won\'t be warned in future. However, you can always change this in Settings + Download content only via WiFi diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 524e12c95..7f07a911c 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -38,6 +38,11 @@ android:key="pref_full_text_search" android:title="@string/pref_full_text_search_title" android:summary="@string/pref_full_text_search_summary"/> + +