add battery optimization warning

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
This commit is contained in:
tobiasKaminsky 2018-12-12 11:46:16 +01:00
parent 396c8c4906
commit cb1bff1ce0
No known key found for this signature in database
GPG Key ID: 0E00D4D47D0C5AF7
5 changed files with 90 additions and 0 deletions

View File

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path d="M0 0h24v24H0z" fill="none" />
<path
d="M15.67 4H14V2h-4v2H8.33C7.6 4 7 4.6 7 5.33v15.33C7 21.4 7.6 22 8.33 22h7.33c.74 0 1.34-.6 1.34-1.33V5.33C17 4.6 16.4 4 15.67 4zM13 18h-2v-2h2v2zm0-4h-2V9h2v5z" />
</svg>

After

Width:  |  Height:  |  Size: 318 B

View File

@ -64,6 +64,7 @@
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
<!-- Apps that target Android 9 (API level 28) or higher and use foreground services
must request the FOREGROUND_SERVICE permission -->

View File

@ -22,10 +22,14 @@
package com.owncloud.android.ui.activity;
import android.accounts.Account;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.text.TextUtils;
import android.util.Log;
@ -38,6 +42,7 @@ import android.widget.TextView;
import com.google.android.material.appbar.AppBarLayout;
import com.google.android.material.appbar.CollapsingToolbarLayout;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import com.owncloud.android.BuildConfig;
import com.owncloud.android.MainApp;
import com.owncloud.android.R;
import com.owncloud.android.authentication.AccountUtils;
@ -72,12 +77,14 @@ import java.util.Map;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AlertDialog;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import static android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS;
import static com.google.android.material.appbar.AppBarLayout.LayoutParams.SCROLL_FLAG_ENTER_ALWAYS;
import static com.owncloud.android.datamodel.SyncedFolderDisplayItem.UNPERSISTED_ID;
@ -88,6 +95,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
SyncedFolderPreferencesDialogFragment.OnSyncedFolderPreferenceListener {
public static final String[] PRIORITIZED_FOLDERS = new String[]{"Camera", "Screenshots"};
public static final List<String> SPECIAL_MANUFACTURER = Arrays.asList("Samsung", "Huawei", "Xiaomi");
public static final String EXTRA_SHOW_SIDEBAR = "SHOW_SIDEBAR";
private static final String SYNCED_FOLDER_PREFERENCES_DIALOG_TAG = "SYNCED_FOLDER_PREFERENCES_DIALOG";
private static final String TAG = SyncedFoldersActivity.class.getSimpleName();
@ -511,6 +519,8 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
if (syncedFolderDisplayItem.isEnabled()) {
FilesSyncHelper.insertAllDBEntriesForSyncedFolder(syncedFolderDisplayItem);
showBatteryOptimizationInfo();
} else {
String syncedFolderInitiatedKey = "syncedFolderIntitiated_" + syncedFolderDisplayItem.getId();
arbitraryDataProvider.deleteKeyForAccount("global", syncedFolderInitiatedKey);
@ -601,6 +611,10 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
}
mSyncedFolderPreferencesDialogFragment = null;
if (syncedFolder.getEnabled()) {
showBatteryOptimizationInfo();
}
}
@Override
@ -681,4 +695,60 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
setDrawerMenuItemChecked(R.id.nav_synced_folders);
}
private void showBatteryOptimizationInfo() {
boolean isSpecialManufacturer = SPECIAL_MANUFACTURER.contains(Build.MANUFACTURER.toLowerCase());
if ((isSpecialManufacturer && checkIfBatteryOptimizationEnabled()) || checkIfBatteryOptimizationEnabled()) {
AlertDialog alertDialog = new AlertDialog.Builder(this, R.style.Theme_ownCloud_Dialog)
.setTitle(getString(R.string.battery_optimization_title))
.setMessage(getString(R.string.battery_optimization_message))
.setPositiveButton(getString(R.string.battery_optimization_disable), (dialog, which) -> {
// show instant upload
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Intent intent = new Intent(ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
Uri.parse("package:" + BuildConfig.APPLICATION_ID));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
} else {
Intent powerUsageIntent = new Intent(Intent.ACTION_POWER_USAGE_SUMMARY);
if (getPackageManager().resolveActivity(powerUsageIntent, 0) != null) {
startActivity(powerUsageIntent);
} else {
dialog.dismiss();
DisplayUtils.showSnackMessage(this, getString(R.string.battery_optimization_no_setting));
}
}
})
.setNegativeButton(getString(R.string.battery_optimization_close), (dialog, which) -> dialog.dismiss())
.setIcon(R.drawable.ic_battery_alert)
.show();
int color = ThemeUtils.primaryAccentColor(this);
alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(color);
alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(color);
}
}
/**
* Check if battery optimization is enabled. If unknown, fallback to true.
*
* @return true if battery optimization is enabled
*/
private boolean checkIfBatteryOptimizationEnabled() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (powerManager == null) {
return true;
}
return !powerManager.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID);
} else {
return true;
}
}
}

View File

@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FF000000"
android:pathData="M15.67,4L14,4L14,2h-4v2L8.33,4C7.6,4 7,4.6 7,5.33v15.33C7,21.4 7.6,22 8.33,22h7.33c0.74,0 1.34,-0.6 1.34,-1.33L17,5.33C17,4.6 16.4,4 15.67,4zM13,18h-2v-2h2v2zM13,14h-2L11,9h2v5z" />
</vector>

View File

@ -839,4 +839,9 @@
<string name="enter_filename">Please enter a filename</string>
<string name="create_file_from_template">Creating file from template…</string>
<string name="error_retrieving_templates">Error retrieving templates</string>
<string name="battery_optimization_title">Battery optimization</string>
<string name="battery_optimization_message">Your device may have battery optimization enabled. AutoUpload works only properly if you exclude this app from it.</string>
<string name="battery_optimization_disable">disable</string>
<string name="battery_optimization_close">Close</string>
<string name="battery_optimization_no_setting">Unable to start battery settings directly. Please adjust manually in settings.</string>
</resources>