diff --git a/.gitignore b/.gitignore index 39b6783..43adb06 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ captures/ # IntelliJ *.iml +.idea/ .idea/workspace.xml .idea/tasks.xml .idea/gradle.xml @@ -63,3 +64,6 @@ fastlane/Preview.html fastlane/screenshots fastlane/test_output fastlane/readme.md + +.DS_Store +app/release diff --git a/app/build.gradle b/app/build.gradle index e138243..60bbfd7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,34 +1,35 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 27 + compileSdkVersion 28 defaultConfig { applicationId "nl.devluuk.sleepywifi" minSdkVersion 23 - targetSdkVersion 27 - versionCode 6 - versionName '1.5' + targetSdkVersion 28 + versionCode 7 + versionName '1.6' testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { + } } dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.android.support:appcompat-v7:27.0.2' + implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'com.android.support:support-v4:27.1.1' + implementation 'com.android.support:support-v4:28.0.0' implementation 'com.karumi:dexter:4.2.0' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - implementation 'com.android.support:preference-v7:27.1.1' - implementation 'com.android.support:design:27.1.1' + implementation 'com.android.support:preference-v7:28.0.0' + implementation 'com.android.support:design:28.0.0' } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index da37426..81a4ed3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,6 @@ - @@ -11,7 +10,6 @@ - - + diff --git a/app/src/main/java/nl/devluuk/sleepywifi/AboutActivity.java b/app/src/main/java/nl/devluuk/sleepywifi/AboutActivity.java index 421c10a..fce1a1e 100644 --- a/app/src/main/java/nl/devluuk/sleepywifi/AboutActivity.java +++ b/app/src/main/java/nl/devluuk/sleepywifi/AboutActivity.java @@ -2,20 +2,35 @@ import android.app.ActionBar; import android.app.Activity; +import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.support.v4.app.NavUtils; import android.view.MenuItem; +import android.view.View; +import android.widget.TextView; public class AboutActivity extends Activity { + String url = "https://github.com/DevLuuk"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_about); ActionBar actionBar = this.getActionBar(); - if (actionBar != null){ + if (actionBar != null) { actionBar.setDisplayHomeAsUpEnabled(true); } + + TextView authorText = findViewById(R.id.author_text); + authorText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + startActivity(i); + } + }); } /** @@ -37,7 +52,7 @@ protected void onCreate(Bundle savedInstanceState) { @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); - if (id == R.id.home){ + if (id == R.id.home) { NavUtils.navigateUpFromSameTask(this); } return super.onOptionsItemSelected(item); diff --git a/app/src/main/java/nl/devluuk/sleepywifi/BackgroundService.java b/app/src/main/java/nl/devluuk/sleepywifi/BackgroundService.java old mode 100644 new mode 100755 index f43afd7..2a5b283 --- a/app/src/main/java/nl/devluuk/sleepywifi/BackgroundService.java +++ b/app/src/main/java/nl/devluuk/sleepywifi/BackgroundService.java @@ -21,7 +21,6 @@ public class BackgroundService extends Service { - private static final String TAG = BackgroundService.class.getSimpleName(); protected ScreenReceiver screenReciever; @Override @@ -53,8 +52,6 @@ public void onCreate() { filter.addAction(Intent.ACTION_SCREEN_ON); registerReceiver(this.screenReciever, filter); new DismissNotification(this).execute(); - // remove start notification - //stopForeground(false); } private class DismissNotification extends AsyncTask { @@ -69,21 +66,12 @@ private class DismissNotification extends AsyncTask { protected Void doInBackground(Void... params) { try { TimeUnit.SECONDS.sleep(5); - //Thread.sleep(5000); stopForeground(true); } catch (InterruptedException e) { e.printStackTrace(); } return null; } - - protected void onProgressUpdate(Void... progress) { - - } - - protected void onPostExecute(Void result) { - - } } diff --git a/app/src/main/java/nl/devluuk/sleepywifi/MainActivity.java b/app/src/main/java/nl/devluuk/sleepywifi/MainActivity.java index 43d11e6..f9b44c0 100644 --- a/app/src/main/java/nl/devluuk/sleepywifi/MainActivity.java +++ b/app/src/main/java/nl/devluuk/sleepywifi/MainActivity.java @@ -2,14 +2,19 @@ import android.app.Activity; import android.app.ActivityManager; +import android.app.AlertDialog; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.os.Bundle; +import android.os.PowerManager; import android.preference.PreferenceManager; +import android.provider.Settings; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; @@ -17,6 +22,7 @@ import android.view.View; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; public class MainActivity extends Activity implements SharedPreferences.OnSharedPreferenceChangeListener { @@ -26,6 +32,7 @@ public class MainActivity extends Activity implements SharedPreferences.OnShared public Boolean status; public Drawable playIcon; public Drawable grayIcon; + private PowerManager powerManager; @Override protected void onCreate(Bundle savedInstanceState) { @@ -52,7 +59,7 @@ protected void onResume() { } @Override - protected void onPause(){ + protected void onPause() { super.onPause(); PreferenceManager.getDefaultSharedPreferences(this) .registerOnSharedPreferenceChangeListener(this); @@ -92,11 +99,9 @@ public boolean onOptionsItemSelected(MenuItem item) { public void playOrPauseService(ImageView image) { final TextView stateText = findViewById(R.id.OnOffText); final TextView stateDesc = findViewById(R.id.OnOffDescription); - // Check the current state inside the sharedprefs if (checkPrefStatus(getResources().getString(R.string.app_state))) { stopService(new Intent(this, BackgroundService.class)); - setPreference(false); grayIcon = getResources().getDrawable(R.drawable.ic_launcher_round_gray, null); @@ -107,7 +112,6 @@ public void playOrPauseService(ImageView image) { } else { startService(new Intent(this, BackgroundService.class)); - setPreference(true); playIcon = getResources().getDrawable(R.drawable.ic_launcher_round, null); @@ -118,17 +122,24 @@ public void playOrPauseService(ImageView image) { } } + private void checkIgnoringBattery() { + String packageName = this.getPackageName(); + if (!powerManager.isIgnoringBatteryOptimizations(packageName)) { + showAlertDialog(this); + } + } + public void checkPrefOnStart(ImageView image) { final TextView stateText = findViewById(R.id.OnOffText); final TextView stateDesc = findViewById(R.id.OnOffDescription); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); prefs.registerOnSharedPreferenceChangeListener(this); + powerManager = (PowerManager) this.getSystemService(Context.POWER_SERVICE); if (checkPrefStatus(getResources().getString(R.string.app_state))) { + checkIgnoringBattery(); startService(new Intent(this, BackgroundService.class)); - //setPreference(true); - //Toast.makeText(this, "Service started", Toast.LENGTH_SHORT).show(); playIcon = getResources().getDrawable(R.drawable.ic_launcher_round, null); image.setImageDrawable(playIcon); @@ -154,6 +165,34 @@ private boolean isMyServiceRunning(Class serviceClass) { return false; } + private void showAlertDialog(Context context) { + final Intent batteryIntent = new Intent(); + AlertDialog.Builder batteryDialog = new AlertDialog.Builder(context); + batteryDialog.setTitle(R.string.request_battery_opt); + batteryDialog.setMessage(R.string.warning_battery_opt); + batteryDialog.setCancelable(true); + + batteryDialog.setPositiveButton( + R.string.yes, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + batteryIntent.setAction(Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS); + startActivity(batteryIntent); + } + }); + + batteryDialog.setNegativeButton( + R.string.no, + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }); + + AlertDialog alert = batteryDialog.create(); + alert.show(); + } + public boolean getBackgroundStatus() { return status = isMyServiceRunning(BackgroundService.class); } @@ -206,11 +245,11 @@ private Drawable makeGrayIcon(Drawable icon, int colorID) { */ @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - if (key.equals(getString(R.string.bluetooth_state))){ + if (key.equals(getString(R.string.bluetooth_state))) { sharedPreferences.getBoolean(key, false); } if (key.equals("app_state")) { - sharedPreferences.getBoolean(key, true); - } + sharedPreferences.getBoolean(key, true); + } } } diff --git a/app/src/main/java/nl/devluuk/sleepywifi/ScreenReceiver.java b/app/src/main/java/nl/devluuk/sleepywifi/ScreenReceiver.java old mode 100644 new mode 100755 index 727dbb4..7b326b5 --- a/app/src/main/java/nl/devluuk/sleepywifi/ScreenReceiver.java +++ b/app/src/main/java/nl/devluuk/sleepywifi/ScreenReceiver.java @@ -1,16 +1,20 @@ package nl.devluuk.sleepywifi; import android.bluetooth.BluetoothAdapter; -import android.bluetooth.BluetoothManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.wifi.WifiManager; +import android.os.AsyncTask; +import android.os.PowerManager; import android.preference.PreferenceManager; import android.util.Log; +import java.lang.ref.WeakReference; +import java.util.concurrent.TimeUnit; + public class ScreenReceiver extends BroadcastReceiver { private WifiManager wifiManager; @@ -18,41 +22,40 @@ public class ScreenReceiver extends BroadcastReceiver { boolean wifiWasOn = false; boolean bluetoothWasOn = false; boolean bluetoothState; + int delayTime; + boolean appState; private static final String TAG = ScreenReceiver.class.getSimpleName(); @Override public void onReceive(final Context context, final Intent intent) { - wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); bluetoothState = prefs.getBoolean(context.getResources().getString(R.string.bluetooth_state), false); + appState = prefs.getBoolean(context.getResources().getString(R.string.app_state), true); + delayTime = prefs.getInt(context.getResources().getString(R.string.key_power_off_time), 1); PackageManager pm = context.getPackageManager(); final boolean deviceHasBluetooth = pm.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH); - //boolean wifiEnabled = wifiManager.isWifiEnabled(); - if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { - if (wifiManager.isWifiEnabled()) { - wifiManager.setWifiEnabled(false); - wifiWasOn = true; - - } else { - wifiWasOn = false; - } - if (bluetoothState) { - if (deviceHasBluetooth) { - if (bluetoothAdapter.isEnabled()) { - bluetoothAdapter.disable(); - Log.v(TAG, "Bluetooth is Sleeping"); - bluetoothWasOn = true; - } else { - bluetoothWasOn = false; + if (wifiManager.isWifiEnabled()) { + //new Sleep(this).execute(); + wifiManager.setWifiEnabled(false); + wifiWasOn = true; + } else { + wifiWasOn = false; + } + if (bluetoothState) { + if (deviceHasBluetooth) { + if (bluetoothAdapter.isEnabled()) { + bluetoothAdapter.disable(); + bluetoothWasOn = true; + } else { + bluetoothWasOn = false; + } } } - - } } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) { if (wifiWasOn) { wifiManager.setWifiEnabled(true); @@ -66,6 +69,27 @@ public void onReceive(final Context context, final Intent intent) { } } } + private class Sleep extends AsyncTask { + + private WeakReference activityReference; + + // only retain a weak reference to the activity + Sleep(ScreenReceiver context) { + activityReference = new WeakReference<>(context); + } + + protected Void doInBackground(Void... params) { + try { + Log.v(TAG, "Sleeping......."); + TimeUnit.SECONDS.sleep(delayTime); + wifiManager.setWifiEnabled(false); + Log.v(TAG, "Wifi is offfff"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return null; + } + } } diff --git a/app/src/main/java/nl/devluuk/sleepywifi/SettingsActivity.java b/app/src/main/java/nl/devluuk/sleepywifi/SettingsActivity.java old mode 100644 new mode 100755 index bd5f518..e16b2c6 --- a/app/src/main/java/nl/devluuk/sleepywifi/SettingsActivity.java +++ b/app/src/main/java/nl/devluuk/sleepywifi/SettingsActivity.java @@ -1,32 +1,13 @@ package nl.devluuk.sleepywifi; -import android.Manifest; import android.app.ActionBar; -import android.app.AlertDialog; -import android.content.DialogInterface; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; -import android.support.v14.preference.SwitchPreference; import android.support.v4.app.NavUtils; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; -import android.support.v7.preference.Preference; import android.view.MenuItem; -import android.widget.Toast; - -import com.karumi.dexter.Dexter; -import com.karumi.dexter.MultiplePermissionsReport; -import com.karumi.dexter.PermissionToken; -import com.karumi.dexter.listener.DexterError; -import com.karumi.dexter.listener.PermissionRequest; -import com.karumi.dexter.listener.PermissionRequestErrorListener; -import com.karumi.dexter.listener.multi.MultiplePermissionsListener; - -import java.util.List; public class SettingsActivity extends AppCompatActivity { - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -44,65 +25,5 @@ public boolean onOptionsItemSelected(MenuItem item) { NavUtils.navigateUpFromSameTask(this); } return super.onOptionsItemSelected(item); - - } - // TODO Fully implement onPreferenceListener -// public static void bluetoothListener(SwitchPreference bluetoothSwitch){ -// if (bluetoothSwitch != null) { -// bluetoothSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { -// @Override -// public boolean onPreferenceChange(Preference arg0, Object isBluetoothOnObject) { -// boolean isBluetoothOn = (Boolean) isBluetoothOnObject; -// if (isBluetoothOn) { -// requestBluetoothPermission(); -// } -// return true; -// } -// }); -// } -// } - - private void requestBluetoothPermission(){ - Dexter.withActivity(this).withPermissions( - Manifest.permission.BLUETOOTH, - Manifest.permission.BLUETOOTH_ADMIN - ).withListener(new MultiplePermissionsListener() { - @Override - public void onPermissionsChecked(MultiplePermissionsReport report) { - if (report.areAllPermissionsGranted()){ - Toast.makeText(getApplicationContext(), "All permissions are granted", Toast.LENGTH_SHORT).show(); - } - - if (report.isAnyPermissionPermanentlyDenied()){ - Toast.makeText(getApplicationContext(), "Not all permissions are granted", Toast.LENGTH_SHORT).show(); - showWarningDialog(); - } - } - - @Override - public void onPermissionRationaleShouldBeShown(List permissions, PermissionToken token) { - token.continuePermissionRequest(); - } - }).withErrorListener(new PermissionRequestErrorListener() { - @Override - public void onError(DexterError error) { - Toast.makeText(getApplicationContext(), "Error occurred ", Toast.LENGTH_LONG).show(); - } - }).onSameThread().check(); - } - - private void showWarningDialog(){ - AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this); - builder.setTitle("Need Permissions"); - builder.setMessage("This app need permissions to use this feature."); - builder.setPositiveButton("Oke", new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - dialog.cancel(); - } - }); - builder.show(); } - - } diff --git a/app/src/main/java/nl/devluuk/sleepywifi/SettingsFragment.java b/app/src/main/java/nl/devluuk/sleepywifi/SettingsFragment.java old mode 100644 new mode 100755 index b902401..18bb200 --- a/app/src/main/java/nl/devluuk/sleepywifi/SettingsFragment.java +++ b/app/src/main/java/nl/devluuk/sleepywifi/SettingsFragment.java @@ -1,13 +1,9 @@ package nl.devluuk.sleepywifi; import android.os.Bundle; -import android.preference.PreferenceFragment; -import android.support.v14.preference.SwitchPreference; -import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceFragmentCompat; import android.support.v7.preference.PreferenceScreen; -import nl.devluuk.sleepywifi.SettingsActivity; public class SettingsFragment extends PreferenceFragmentCompat { /** @@ -23,7 +19,5 @@ public class SettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { addPreferencesFromResource(R.xml.pref_visualizer); - - } } diff --git a/app/src/main/res/layout/activity_about.xml b/app/src/main/res/layout/activity_about.xml index 37ba0d3..f2ea543 100644 --- a/app/src/main/res/layout/activity_about.xml +++ b/app/src/main/res/layout/activity_about.xml @@ -37,6 +37,7 @@ android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="240dp" + android:fontFamily="sans-serif-medium" android:text="@string/about_author" android:textAppearance="@style/TextAppearance.AppCompat.Display1" android:textSize="30sp" /> @@ -48,7 +49,11 @@ android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="220dp" + android:autoLink="web" + android:linksClickable="true" android:text="@string/about_authorT" + android:textAllCaps="false" + android:textColor="@color/navigationBarColor" android:textSize="16sp" /> diff --git a/app/src/main/res/values-nl-rNL/strings.xml b/app/src/main/res/values-nl-rNL/strings.xml index 2ae902c..db787b9 100644 --- a/app/src/main/res/values-nl-rNL/strings.xml +++ b/app/src/main/res/values-nl-rNL/strings.xml @@ -21,4 +21,10 @@ Hou de Wifi aan tijdens slaapmodus Wifi staat Wanneer de telefoon in slaapmodus is + Nee + Ja + Deze app werkt niet goed todat je deze app toestemming geeft om batterij optimalizatie te negeren + Verzoek negeer batterij-optimalisatie voor deze app + Stel het uitgaan van de WiFi uit + Kies hoe lang het duurt voordat de wifi uit gaat \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bf8f3ac..0eb8063 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,9 +3,14 @@ Settings ON OFF + Yes + No The app service is: Wifi is turned when the phone is in sleepmode + Request Ignore battery optimization for this app + This app will not work correctly until you grant this app the \'Ignore battery optimization\' permission + app_state @@ -20,15 +25,13 @@ Author This Android app brings back the \'turn wifi off when the phone is in sleepmode\' option for Android 8.1 or newer. SleepyWifi is licensed under GPL-3.0 or later. - SleepyWifi is developed by Devluuk + SleepyWifi is developed by Devluuk Settings - General - bluetooth_state @@ -50,4 +53,21 @@ 0 -1 + + power_off + + Delay Wifi turning off + Choose how long the delay is for turning off the wifi + + 1 second + 5 seconds + 20 seconds + 60 seconds + + + 1 + 5 + 20 + 60 + \ No newline at end of file diff --git a/app/src/main/res/xml/pref_visualizer.xml b/app/src/main/res/xml/pref_visualizer.xml index e3e9eab..d212559 100644 --- a/app/src/main/res/xml/pref_visualizer.xml +++ b/app/src/main/res/xml/pref_visualizer.xml @@ -6,12 +6,11 @@ android:title="@string/pref_bluetooth_title" android:summary="@string/pref_description_enable_bluetooth"/> - - - - - - - - + + + + + + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 077cb2f..f53f49f 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.4' + classpath 'com.android.tools.build:gradle:3.5.0' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ac3dc98..e679cf4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,6 @@ -#Sun Aug 12 17:41:25 CEST 2018 +#Sat Sep 07 13:48:56 CEST 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip -distributionSha256Sum=7a2c66d1a78f811d5f37d14630ad21cec5e77a2a4dc61e787e2257a6341016ce +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip