Эх сурвалжийг харах

Merge pull request #8509 from nextcloud/dropLollipop

Drop Android 5.0 Support
Andy Scherzinger 4 жил өмнө
parent
commit
a7ab5ae320

+ 9 - 0
CHANGELOG.md

@@ -1,3 +1,12 @@
+## 3.17.0 (-, -, -)
+
+- New upload manager @ezaquarii
+- UI improvements
+
+Minimum: NC 16 Server, Android 5.0 Lollipop 
+
+For a full list, please see https://github.com/nextcloud/android/milestone/59
+
 ## 3.16.1 (June, 01, 2021)
 
 - Fix media tab not showing images/videos

+ 1 - 1
build.gradle

@@ -126,7 +126,7 @@ android {
     compileSdkVersion 29
 
     defaultConfig {
-        minSdkVersion 21
+        minSdkVersion 22
         targetSdkVersion 29
 
         // arguments to be passed to functional tests

+ 1 - 1
scripts/analysis/lint-results.txt

@@ -1,2 +1,2 @@
 DO NOT TOUCH; GENERATED BY DRONE
-      <span class="mdl-layout-title">Lint Report: 234 warnings</span>
+      <span class="mdl-layout-title">Lint Report: 228 warnings</span>

+ 0 - 4
src/main/java/com/nextcloud/client/device/DeviceInfo.kt

@@ -34,8 +34,4 @@ class DeviceInfo {
     fun hasCamera(context: Context): Boolean {
         return context.packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)
     }
-
-    fun editorSupported(): Boolean {
-        return apiLevel < Build.VERSION_CODES.LOLLIPOP
-    }
 }

+ 5 - 14
src/main/java/com/nextcloud/client/device/PowerManagementServiceImpl.kt

@@ -21,12 +21,10 @@
 
 package com.nextcloud.client.device
 
-import android.annotation.TargetApi
 import android.content.Context
 import android.content.Intent
 import android.content.IntentFilter
 import android.os.BatteryManager
-import android.os.Build
 import android.os.PowerManager
 import com.nextcloud.client.preferences.AppPreferences
 import com.nextcloud.client.preferences.AppPreferencesImpl
@@ -60,12 +58,7 @@ internal class PowerManagementServiceImpl(
                 return false
             }
 
-            @TargetApi(Build.VERSION_CODES.LOLLIPOP)
-            if (deviceInfo.apiLevel >= Build.VERSION_CODES.LOLLIPOP) {
-                return platformPowerManager.isPowerSaveMode
-            }
-            // For older versions, we just say that device is not in power save mode
-            return false
+            return platformPowerManager.isPowerSaveMode
         }
 
     override val isPowerSavingExclusionAvailable: Boolean
@@ -76,12 +69,10 @@ internal class PowerManagementServiceImpl(
         get() {
             val intent: Intent? = context.registerReceiver(null, IntentFilter(Intent.ACTION_BATTERY_CHANGED))
             val isCharging = intent?.let {
-                val plugged = it.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0)
-                when {
-                    plugged == BatteryManager.BATTERY_PLUGGED_USB -> true
-                    plugged == BatteryManager.BATTERY_PLUGGED_AC -> true
-                    deviceInfo.apiLevel >= Build.VERSION_CODES.JELLY_BEAN_MR1 &&
-                        plugged == BatteryManager.BATTERY_PLUGGED_WIRELESS -> true
+                when (it.getIntExtra(BatteryManager.EXTRA_PLUGGED, 0)) {
+                    BatteryManager.BATTERY_PLUGGED_USB -> true
+                    BatteryManager.BATTERY_PLUGGED_AC -> true
+                    BatteryManager.BATTERY_PLUGGED_WIRELESS -> true
                     else -> false
                 }
             } ?: false

+ 2 - 8
src/main/java/com/owncloud/android/files/FileMenuFilter.java

@@ -28,7 +28,6 @@ import android.view.MenuItem;
 
 import com.google.gson.Gson;
 import com.nextcloud.client.account.User;
-import com.nextcloud.client.device.DeviceInfo;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.OCFile;
@@ -64,7 +63,6 @@ public class FileMenuFilter {
     private ComponentsGetter componentsGetter;
     private Context context;
     private boolean overflowMenu;
-    private DeviceInfo deviceInfo;
     private User user;
 
     /**
@@ -75,7 +73,6 @@ public class FileMenuFilter {
      * @param componentsGetter  Accessor to app components, needed to access synchronization services
      * @param context           Android {@link Context}, needed to access build setup resources.
      * @param overflowMenu      true if the overflow menu items are being filtered
-     * @param deviceInfo        Device information provider
      * @param user              currently active user
      */
     public FileMenuFilter(int numberOfAllFiles,
@@ -83,7 +80,6 @@ public class FileMenuFilter {
                           ComponentsGetter componentsGetter,
                           Context context,
                           boolean overflowMenu,
-                          DeviceInfo deviceInfo,
                           User user
     ) {
         this.numberOfAllFiles = numberOfAllFiles;
@@ -91,7 +87,6 @@ public class FileMenuFilter {
         this.componentsGetter = componentsGetter;
         this.context = context;
         this.overflowMenu = overflowMenu;
-        this.deviceInfo = deviceInfo;
         this.user = user;
     }
 
@@ -108,10 +103,9 @@ public class FileMenuFilter {
                           ComponentsGetter componentsGetter,
                           Context context,
                           boolean overflowMenu,
-                          DeviceInfo deviceInfo,
                           User user
     ) {
-        this(1, Collections.singletonList(file), componentsGetter, context, overflowMenu, deviceInfo, user);
+        this(1, Collections.singletonList(file), componentsGetter, context, overflowMenu, user);
     }
 
     /**
@@ -282,7 +276,7 @@ public class FileMenuFilter {
                             List<Integer> toHide,
                             OCCapability capability
     ) {
-        if (deviceInfo.editorSupported() || files.iterator().next().isEncrypted()) {
+        if (files.iterator().next().isEncrypted()) {
             toHide.add(R.id.action_edit);
             return;
         }

+ 1 - 4
src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt

@@ -23,10 +23,8 @@ package com.owncloud.android.ui.activity
 
 import android.annotation.SuppressLint
 import android.net.Uri
-import android.os.Build
 import android.os.Bundle
 import android.widget.Toast
-import androidx.annotation.RequiresApi
 import com.nextcloud.client.appinfo.AppInfo
 import com.nextcloud.client.device.DeviceInfo
 import com.owncloud.android.R
@@ -34,14 +32,13 @@ import com.owncloud.android.files.FileMenuFilter
 import com.owncloud.android.ui.asynctasks.TextEditorLoadUrlTask
 import javax.inject.Inject
 
-@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
 class TextEditorWebView : EditorWebView() {
     @Inject
     lateinit var appInfo: AppInfo
     @Inject
     lateinit var deviceInfo: DeviceInfo
 
-    @SuppressLint("AddJavascriptInterface") // suppress warning as webview is only used >= Lollipop
+    @SuppressLint("AddJavascriptInterface") // suppress warning as webview is only used > Lollipop
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 

+ 0 - 3
src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -40,7 +40,6 @@ import android.widget.ProgressBar;
 import com.google.android.material.tabs.TabLayout;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
-import com.nextcloud.client.device.DeviceInfo;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.network.ConnectivityService;
 import com.nextcloud.client.preferences.AppPreferences;
@@ -97,7 +96,6 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
     @Inject AppPreferences preferences;
     @Inject ConnectivityService connectivityService;
     @Inject UserAccountManager accountManager;
-    @Inject DeviceInfo deviceInfo;
 
     /**
      * Public factory method to create new FileDetailFragment instances.
@@ -351,7 +349,6 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
                 containerActivity,
                 getActivity(),
                 false,
-                deviceInfo,
                 currentUser
             );
 

+ 0 - 2
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -526,7 +526,6 @@ public class OCFileListFragment extends ExtendedListFragment implements
                                                Collections.singleton(file),
                                                mContainerActivity, getActivity(),
                                                true,
-                                               deviceInfo,
                                                accountManager.getUser());
         mf.filter(popup.getMenu(), true);
         popup.setOnMenuItemClickListener(item -> {
@@ -685,7 +684,6 @@ public class OCFileListFragment extends ExtendedListFragment implements
                 mContainerActivity,
                 getActivity(),
                 false,
-                deviceInfo,
                 accountManager.getUser()
             );
 

+ 29 - 44
src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -56,7 +56,6 @@ import com.github.chrisbanes.photoview.PhotoView;
 import com.google.android.material.snackbar.Snackbar;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
-import com.nextcloud.client.device.DeviceInfo;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.network.ConnectivityService;
 import com.owncloud.android.MainApp;
@@ -125,7 +124,6 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
 
     @Inject ConnectivityService connectivityService;
     @Inject UserAccountManager accountManager;
-    @Inject DeviceInfo deviceInfo;
     private PreviewImageFragmentBinding binding;
 
     /**
@@ -376,7 +374,6 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
                 containerActivity,
                 getActivity(),
                 false,
-                deviceInfo,
                 currentUser
             );
 
@@ -407,47 +404,38 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
      */
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        switch (item.getItemId()) {
-            case R.id.action_send_share_file:
-                if (getFile().isSharedWithMe() && !getFile().canReshare()) {
-                    Snackbar.make(requireView(),
-                                  R.string.resharing_is_not_allowed,
-                                  Snackbar.LENGTH_LONG
-                                 )
-                            .show();
-                } else {
-                    containerActivity.getFileOperationsHelper().sendShareFile(getFile());
-                }
-                return true;
-
-            case R.id.action_open_file_with:
-                openFile();
-                return true;
-
-            case R.id.action_remove_file:
-                RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(getFile());
-                dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION);
-                return true;
-
-            case R.id.action_see_details:
-                seeDetails();
-                return true;
-
-            case R.id.action_download_file:
-            case R.id.action_sync_file:
-                containerActivity.getFileOperationsHelper().syncFile(getFile());
-                return true;
-
-            case R.id.action_set_as_wallpaper:
-                containerActivity.getFileOperationsHelper().setPictureAs(getFile(), getImageView());
-                return true;
-
-            default:
-                return super.onOptionsItemSelected(item);
+        int itemId = item.getItemId();
+        if (itemId == R.id.action_send_share_file) {
+            if (getFile().isSharedWithMe() && !getFile().canReshare()) {
+                Snackbar.make(requireView(),
+                              R.string.resharing_is_not_allowed,
+                              Snackbar.LENGTH_LONG
+                             )
+                    .show();
+            } else {
+                containerActivity.getFileOperationsHelper().sendShareFile(getFile());
+            }
+            return true;
+        } else if (itemId == R.id.action_open_file_with) {
+            openFile();
+            return true;
+        } else if (itemId == R.id.action_remove_file) {
+            RemoveFilesDialogFragment dialog = RemoveFilesDialogFragment.newInstance(getFile());
+            dialog.show(getFragmentManager(), ConfirmationDialogFragment.FTAG_CONFIRMATION);
+            return true;
+        } else if (itemId == R.id.action_see_details) {
+            seeDetails();
+            return true;
+        } else if (itemId == R.id.action_download_file || itemId == R.id.action_sync_file) {
+            containerActivity.getFileOperationsHelper().syncFile(getFile());
+            return true;
+        } else if (itemId == R.id.action_set_as_wallpaper) {
+            containerActivity.getFileOperationsHelper().setPictureAs(getFile(), getImageView());
+            return true;
         }
+        return super.onOptionsItemSelected(item);
     }
 
-
     private void seeDetails() {
         containerActivity.showDetails(getFile());
     }
@@ -464,7 +452,6 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
         super.onDestroy();
     }
 
-
     /**
      * Opens the previewed image with an external application.
      */
@@ -473,7 +460,6 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
         finish();
     }
 
-
     private class LoadBitmapTask extends AsyncTask<OCFile, Void, LoadImage> {
         private static final int PARAMS_LENGTH = 1;
 
@@ -492,7 +478,6 @@ public class PreviewImageFragment extends FileFragment implements Injectable {
          */
         private int mErrorMessageId;
 
-
         /**
          * Constructor.
          *

+ 0 - 3
src/main/java/com/owncloud/android/ui/preview/PreviewMediaFragment.java

@@ -50,7 +50,6 @@ import android.widget.LinearLayout;
 
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
-import com.nextcloud.client.device.DeviceInfo;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.media.ErrorFormat;
 import com.nextcloud.client.media.PlayerServiceConnection;
@@ -112,7 +111,6 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
     private Uri videoUri;
     @Inject ClientFactory clientFactory;
     @Inject UserAccountManager accountManager;
-    @Inject DeviceInfo deviceInfo;
     FragmentPreviewMediaBinding binding;
     LinearLayout emptyListView;
 
@@ -325,7 +323,6 @@ public class PreviewMediaFragment extends FileFragment implements OnTouchListene
                 containerActivity,
                 getActivity(),
                 false,
-                deviceInfo,
                 currentUser
             );
 

+ 0 - 1
src/main/java/com/owncloud/android/ui/preview/PreviewTextFileFragment.java

@@ -271,7 +271,6 @@ public class PreviewTextFileFragment extends PreviewTextFragment {
                 containerActivity,
                 getActivity(),
                 false,
-                deviceInfo,
                 user
             );
             mf.filter(menu, true);

+ 2 - 37
src/test/java/com/nextcloud/client/device/TestPowerManagementService.kt

@@ -31,7 +31,6 @@ import com.nhaarman.mockitokotlin2.any
 import com.nhaarman.mockitokotlin2.anyOrNull
 import com.nhaarman.mockitokotlin2.eq
 import com.nhaarman.mockitokotlin2.mock
-import com.nhaarman.mockitokotlin2.never
 import com.nhaarman.mockitokotlin2.verify
 import com.nhaarman.mockitokotlin2.whenever
 import org.junit.Assert.assertEquals
@@ -83,9 +82,9 @@ class TestPowerManagementService {
         @Test
         fun `power saving queries power manager on API 21+`() {
             // GIVEN
-            //      API level >= 21
+            //      API level >= 22 (since 22+ is supported)
             //      power save mode is on
-            whenever(deviceInfo.apiLevel).thenReturn(Build.VERSION_CODES.LOLLIPOP)
+            whenever(deviceInfo.apiLevel).thenReturn(Build.VERSION_CODES.LOLLIPOP_MR1)
             whenever(platformPowerManager.isPowerSaveMode).thenReturn(true)
 
             // WHEN
@@ -97,22 +96,6 @@ class TestPowerManagementService {
             verify(platformPowerManager).isPowerSaveMode
         }
 
-        @Test
-        fun `power saving is not available below API 21`() {
-            // GIVEN
-            //      API level <21
-            whenever(deviceInfo.apiLevel).thenReturn(Build.VERSION_CODES.KITKAT)
-
-            // WHEN
-            //      power save mode is checked
-
-            // THEN
-            //      power save mode is disabled
-            //      power manager is not queried
-            assertFalse(powerManagementService.isPowerSavingEnabled)
-            verify(platformPowerManager, never()).isPowerSaveMode
-        }
-
         @Test
         fun `power saving exclusion is available for flagged vendors`() {
             for (vendor in PowerManagementServiceImpl.OVERLY_AGGRESSIVE_POWER_SAVING_VENDORS) {
@@ -204,24 +187,6 @@ class TestPowerManagementService {
             }
         }
 
-        @Test
-        fun `wireless charging is not supported in API 16`() {
-            // GIVEN
-            //      device has API level 16
-            //      battery status sticky intent is available
-            whenever(deviceInfo.apiLevel).thenReturn(Build.VERSION_CODES.JELLY_BEAN)
-
-            // WHEN
-            //      spurious wireless power source is returned
-            whenever(intent.getIntExtra(eq(BatteryManager.EXTRA_PLUGGED), any()))
-                .thenReturn(BatteryManager.BATTERY_PLUGGED_WIRELESS)
-
-            // THEN
-            //      power source value is ignored on this API level
-            //      charging flag is false
-            assertFalse(powerManagementService.battery.isCharging)
-        }
-
         @Test
         fun `battery status sticky intent is not available`() {
             // GIVEN