diff --git a/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java b/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java index 447ec21f1..277f5d41d 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java +++ b/app/src/full/java/org/fdroid/fdroid/views/main/MainViewController.java @@ -60,8 +60,17 @@ class MainViewController extends RecyclerView.ViewHolder { new CategoriesViewBinder(activity, frame); } + /** + * {@link android.os.Environment#isExternalStorageRemovable()} sometimes + * throughs {@link IllegalArgumentException}s when it can't find the + * storage. + */ public void bindSwapView() { - new NearbyViewBinder(activity, frame); + try { + new NearbyViewBinder(activity, frame); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } } /** diff --git a/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java b/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java index cf2a24223..26b3f56b2 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java +++ b/app/src/full/java/org/fdroid/fdroid/views/main/NearbyViewBinder.java @@ -81,8 +81,6 @@ class NearbyViewBinder { }); if (Build.VERSION.SDK_INT >= 21) { - Log.i(TAG, "Environment.isExternalStorageRemovable(activity.getExternalFilesDir(\"\")) " + - Environment.isExternalStorageRemovable(activity.getExternalFilesDir(""))); File[] dirs = activity.getExternalFilesDirs(""); if (dirs != null) { for (File dir : dirs) { diff --git a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java index 076d4ec45..88ad58021 100644 --- a/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java +++ b/app/src/full/java/org/fdroid/fdroid/views/swap/SwapAppsView.java @@ -288,9 +288,9 @@ public class SwapAppsView extends ListView implements @Override public void onChange(boolean selfChange) { Activity activity = getActivity(); - if (activity != null) { + if (activity != null && app != null) { app = AppProvider.Helper.findSpecificApp( - getActivity().getContentResolver(), + activity.getContentResolver(), app.packageName, app.repoId, AppMetadataTable.Cols.ALL); diff --git a/app/src/main/java/org/fdroid/fdroid/UpdateService.java b/app/src/main/java/org/fdroid/fdroid/UpdateService.java index 63f5da89b..e4627e4e7 100644 --- a/app/src/main/java/org/fdroid/fdroid/UpdateService.java +++ b/app/src/main/java/org/fdroid/fdroid/UpdateService.java @@ -19,7 +19,6 @@ package org.fdroid.fdroid; import android.app.AlarmManager; -import android.app.IntentService; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.job.JobInfo; @@ -33,8 +32,6 @@ import android.content.IntentFilter; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; -import android.os.Handler; -import android.os.Looper; import android.os.Process; import android.os.SystemClock; import android.support.annotation.NonNull; @@ -87,7 +84,6 @@ public class UpdateService extends JobIntentService { private static final int NOTIFY_ID_UPDATING = 0; private static UpdateService updateService; - private static Handler toastHandler; private NotificationManager notificationManager; private NotificationCompat.Builder notificationBuilder; @@ -391,22 +387,6 @@ public class UpdateService extends JobIntentService { } } - /** - * In order to send a {@link Toast} from a {@link IntentService}, we have to do these tricks. - */ - private void sendNoInternetToast() { - if (toastHandler == null) { - toastHandler = new Handler(Looper.getMainLooper()); - } - toastHandler.post(new Runnable() { - @Override - public void run() { - Toast.makeText(getApplicationContext(), - R.string.warning_no_internet, Toast.LENGTH_SHORT).show(); - } - }); - } - private static boolean isLocalRepoAddress(String address) { return address != null && (address.startsWith(BluetoothDownloader.SCHEME) @@ -453,7 +433,7 @@ public class UpdateService extends JobIntentService { if (!foundLocalRepo) { Utils.debugLog(TAG, "No internet, cannot update"); if (manualUpdate) { - sendNoInternetToast(); + Utils.showToastFromService(this, getString(R.string.warning_no_internet), Toast.LENGTH_SHORT); } return; } diff --git a/app/src/main/java/org/fdroid/fdroid/Utils.java b/app/src/main/java/org/fdroid/fdroid/Utils.java index 110838af2..392699f72 100644 --- a/app/src/main/java/org/fdroid/fdroid/Utils.java +++ b/app/src/main/java/org/fdroid/fdroid/Utils.java @@ -27,6 +27,8 @@ import android.database.Cursor; import android.graphics.Bitmap; import android.net.Uri; import android.os.Build; +import android.os.Handler; +import android.os.Looper; import android.os.StatFs; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -42,6 +44,7 @@ import android.text.style.TypefaceSpan; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; +import android.widget.Toast; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.nostra13.universalimageloader.core.assist.ImageScaleType; import com.nostra13.universalimageloader.core.display.FadeInBitmapDisplayer; @@ -101,6 +104,8 @@ public final class Utils { private static Pattern safePackageNamePattern; + private static Handler toastHandler; + public static final String FALLBACK_ICONS_DIR = "/icons/"; /* @@ -578,7 +583,8 @@ public final class Utils { Date result; try { result = format.parse(str); - } catch (ParseException e) { + } catch (ArrayIndexOutOfBoundsException | NumberFormatException | ParseException e) { + e.printStackTrace(); result = fallback; } return result; @@ -839,4 +845,21 @@ public final class Utils { Utils.debugLog(logTag, "[" + duration + "ms] " + message); } } + + /** + * In order to send a {@link Toast} from a {@link android.app.Service}, we + * have to do these tricks. + */ + public static void showToastFromService(final Context context, final String msg, final int length) { + if (toastHandler == null) { + toastHandler = new Handler(Looper.getMainLooper()); + } + toastHandler.post(new Runnable() { + + @Override + public void run() { + Toast.makeText(context.getApplicationContext(), msg, length).show(); + } + }); + } } diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index 23bf8af20..c7badbb29 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -1112,7 +1112,10 @@ public class App extends ValueObject implements Comparable, Parcelable { } eventType = xml.nextToken(); } - } catch (PackageManager.NameNotFoundException | IOException | XmlPullParserException e) { + } catch (PackageManager.NameNotFoundException + | IOException + | XmlPullParserException + | NumberFormatException e) { Log.e(TAG, "Could not get min/max sdk version", e); } if (targetSdkVersion < minSdkVersion) { diff --git a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java index 4022b3c79..5e9daf06b 100644 --- a/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java +++ b/app/src/main/java/org/fdroid/fdroid/views/main/MainActivity.java @@ -57,6 +57,7 @@ import org.fdroid.fdroid.UpdateService; import org.fdroid.fdroid.Utils; import org.fdroid.fdroid.data.NewRepoConfig; import org.fdroid.fdroid.localrepo.SDCardScannerService; +import org.fdroid.fdroid.net.WifiStateChangeService; import org.fdroid.fdroid.views.AppDetailsActivity; import org.fdroid.fdroid.views.ManageReposActivity; import org.fdroid.fdroid.views.apps.AppListActivity; @@ -249,6 +250,7 @@ public class MainActivity extends AppCompatActivity implements BottomNavigationB public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { // NOCHECKSTYLE LineLength super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_LOCATION_PERMISSIONS) { + WifiStateChangeService.start(this, null); startActivity(new Intent(this, SwapWorkflowActivity.class)); } else if (requestCode == REQUEST_STORAGE_PERMISSIONS) { Toast.makeText(this,