package me.omico.currentactivity.ui.fragment;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.graphics.drawable.Icon;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.provider.Settings;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AlertDialog;
import java.util.Collections;
import me.omico.currentactivity.R;
import me.omico.currentactivity.service.FloatViewService;
import me.omico.currentactivity.ui.activity.AboutActivity;
import me.omico.currentactivity.ui.activity.MainActivity;
import me.omico.util.ActivityUtils;
import me.omico.util.ServiceUtils;
import me.omico.util.SharedPreferencesUtils;
import me.omico.util.root.SU;
import static me.omico.currentactivity.Constants.ABOUT;
import static me.omico.currentactivity.Constants.ACTION_QUICK_START;
import static me.omico.currentactivity.Constants.BOOT_COMPLETED;
import static me.omico.currentactivity.Constants.ENABLE_FLOAT_WINDOW;
import static me.omico.currentactivity.Constants.IS_FIRST_OPEN;
import static me.omico.currentactivity.Constants.IS_SHORTCUT_OPEN;
import static me.omico.currentactivity.Constants.OVERLAY_PERMISSION_CODE;
/**
* Created by Omico on 2017/2/13.
*/
public class MainFragment extends PreferenceFragment {
private Activity activity;
private SwitchPreference enableFloatWindowPreference;
private SwitchPreference bootCompletedPreference;
public MainFragment() {
}
@Override
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.main);
this.activity = MainFragment.this.getActivity();
enableFloatWindowPreference = (SwitchPreference) findPreference(ENABLE_FLOAT_WINDOW);
bootCompletedPreference = (SwitchPreference) findPreference(BOOT_COMPLETED);
initShortcut();
}
@Override
public void onStart() {
super.onStart();
initData();
initListener();
}
private void initShortcut() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) createShortcut();
if (activity.getIntent().getAction().equals(ACTION_QUICK_START) ||
activity.getIntent().getBooleanExtra(IS_SHORTCUT_OPEN, false))
ServiceUtils.startService(activity, FloatViewService.class);
}
private void initData() {
if (SharedPreferencesUtils.getDefaultSharedPreferences(activity, IS_FIRST_OPEN, true)) {
showNoticeDialog();
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) showPermissionDialog();
enableFloatWindowPreference.setChecked(ServiceUtils.isRunning(activity, FloatViewService.class.getName()));
}
private void initListener() {
enableFloatWindowPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if ((boolean) newValue) {
ServiceUtils.startService(activity, FloatViewService.class);
} else {
ServiceUtils.stopService(activity, FloatViewService.class);
}
return true;
}
});
bootCompletedPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
SharedPreferencesUtils.setDefaultSharedPreferences(activity, BOOT_COMPLETED, (boolean) newValue);
return true;
}
});
}
private void showNoticeDialog() {
addDialog(activity, "注意", "此软件需要 ROOT 权限,6.0以上的应用需要额外权限")
.setPositiveButton("接受,并授权", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
setPreferenceEnable(SU.isRoot());
SharedPreferencesUtils.setDefaultSharedPreferences(activity, IS_FIRST_OPEN, false);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) showPermissionDialog();
}
})
.setNegativeButton("放弃并退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
activity.finish();
}
}).create().show();
}
@TargetApi(Build.VERSION_CODES.M)
private void showPermissionDialog() {
if (!Settings.canDrawOverlays(activity)) {
setPreferenceEnable(false);
addDialog(activity, "注意", "需要额外授权“允许出现在其他应用上”的权限!")
.setPositiveButton("接受,并授权", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + activity.getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_CODE);
}
})
.setNegativeButton("放弃并退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
activity.finish();
}
}).create().show();
}
}
@TargetApi(Build.VERSION_CODES.M)
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == OVERLAY_PERMISSION_CODE) {
if (!Settings.canDrawOverlays(activity)) {
showSnackBarNoAction("权限授予失败,无法开启悬浮窗", Snackbar.LENGTH_SHORT);
setPreferenceEnable(false);
} else {
showSnackBarNoAction("权限授予成功!", Snackbar.LENGTH_SHORT);
setPreferenceEnable(true);
}
}
}
@TargetApi(Build.VERSION_CODES.N_MR1)
private void createShortcut() {
ShortcutManager shortcutManager = activity.getSystemService(ShortcutManager.class);
Intent intent = new Intent(activity, MainActivity.class);
intent.setAction(ACTION_QUICK_START);
intent.putExtra(IS_SHORTCUT_OPEN, true);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
ShortcutInfo shortcut = new ShortcutInfo.Builder(activity, "shortcut_open")
.setShortLabel(getString(R.string.quick_enable))
.setLongLabel(getString(R.string.enable_float_window))
.setIcon(Icon.createWithResource(activity, R.mipmap.ic_launcher))
.setIntent(intent)
.build();
shortcutManager.setDynamicShortcuts(Collections.singletonList(shortcut));
}
private void setPreferenceEnable(boolean enable) {
enableFloatWindowPreference.setEnabled(enable);
bootCompletedPreference.setEnabled(enable);
}
private AlertDialog.Builder addDialog(Context context, String title, String message) {
return new AlertDialog.Builder(context).setTitle(title).setMessage(message);
}
private void showSnackBarNoAction(String text, int time) {
Snackbar.make(activity.findViewById(R.id.main_coordinator_layout), text, time).show();
}
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
switch (preference.getKey()) {
case ABOUT:
ActivityUtils.startActivity(activity, AboutActivity.class);
break;
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
}