package com.kuxhausen.huemore; import android.annotation.TargetApi; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.PowerManager; import android.preference.PreferenceManager; import android.provider.Settings; import android.support.v4.app.DialogFragment; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import com.kuxhausen.huemore.persistence.Definitions.InternalArguments; public class DisableDozeDialogFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setMessage(R.string.doze_message); builder.setPositiveButton(R.string.accept, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { startActivity(getDozeOptOutSystemIntent()); } }); return builder.create(); } /** * @return true if on M+ device and not currently exempted from Doze mode */ public static boolean needsDozeOptOut(Context context) { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); boolean ignoreDoze = prefs.getBoolean(context.getString(R.string.preference_ignore_doze), false); if (!ignoreDoze && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); return !pm.isIgnoringBatteryOptimizations(BuildConfig.APPLICATION_ID); } return false; } /** * @return whether this phone supports Doze. */ public static boolean systemSupportsDoze() { return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M; } public static void showDozeOptOutIfNeeded(AppCompatActivity activity) { if (needsDozeOptOut(activity)) { DisableDozeDialogFragment frag = new DisableDozeDialogFragment(); frag.show(activity.getSupportFragmentManager(), InternalArguments.FRAG_MANAGER_DIALOG_TAG); } } /** * Generates the intent that shows Android 6.0+ users into a settings page where they can exempt * this app from doze mode. */ @TargetApi(23) public static Intent getDozeOptOutSystemIntent() { String action = Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS; Uri.Builder builder = new Uri.Builder(); builder.scheme("package"); builder.opaquePart(BuildConfig.APPLICATION_ID); return new Intent(action, builder.build()); } }