package com.ittianyu.mobileguard.fragment; import android.Manifest; import android.app.Activity; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.support.annotation.NonNull; import android.telephony.TelephonyManager; import android.widget.Toast; import com.fastaccess.permission.base.PermissionHelper; import com.fastaccess.permission.base.callback.OnPermissionCallback; import com.ittianyu.mobileguard.R; import com.ittianyu.mobileguard.constant.Constant; import com.ittianyu.mobileguard.receiver.DeviceAdminSampleReceiver; import com.ittianyu.mobileguard.service.PhoneSafeService; import com.ittianyu.mobileguard.utils.ConfigUtils; import java.util.Arrays; /** * Created by yu on. * Phone safe fragment. * Show the setting list. */ public class PhoneSafeFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener, OnPermissionCallback { // constant private static final String KEY_CHANGE_SAFE_PHONE = "pref_change_safe_phone"; private static final int REQUEST_CODE_DEVICE_ADMIN = 1; // data private boolean waitForResult = false; private PermissionHelper permissionHelper; private boolean readPhoneState; /** * add resource * @param savedInstanceState */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.pref_phone_safe); permissionHelper = PermissionHelper.getInstance(getActivity(), this); } /** * update KEY_CHANGE_SAFE_PHONE summary * register ChangeListener */ @Override public void onResume() { super.onResume(); // update summary Preference preference = findPreference(KEY_CHANGE_SAFE_PHONE); preference.setSummary(getString(R.string.current_safe_phone_number) + ConfigUtils.getString(getActivity(), Constant.KEY_SAFE_PHONE, "")); // register listener getPreferenceScreen().getSharedPreferences() .registerOnSharedPreferenceChangeListener(this); } /** * unregister ChangeListener */ @Override public void onPause() { super.onPause(); // unregister listener getPreferenceScreen().getSharedPreferences() .unregisterOnSharedPreferenceChangeListener(this); } /** * will be call when sp changed * @param sharedPreferences * @param key */ @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { boolean value = sharedPreferences.getBoolean(key, false); System.out.println("key:" + key + ", value:" + value); Context context = getActivity(); if (key.equals(Constant.KEY_CB_PHONE_SAFE)) { Intent intent = new Intent(context, PhoneSafeService.class); if (value) { // start phone safe service context.startService(intent); } else { // shutdown phone safe service context.stopService(intent); } } else if (key.equals(Constant.KEY_CB_BIND_SIM)) { if(waitForResult) return; if (value) { // disable until we're really active waitForResult = true; CheckBoxPreference cbp = (CheckBoxPreference) findPreference(Constant.KEY_CB_DEVICE_ADMIN); cbp.setChecked(false); // request permission readPhoneState = true; permissionHelper.request(Manifest.permission.READ_PHONE_STATE); } } else if (key.equals(Constant.KEY_CB_DEVICE_ADMIN)) { if(waitForResult) return; ComponentName deviceAdminSample = new ComponentName(context, DeviceAdminSampleReceiver.class); if (value) { System.out.println("KEY_CB_DEVICE_ADMIN enable"); // Launch the activity to have the user enable our admin. Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, deviceAdminSample); intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, context.getString(R.string.add_admin_extra_app_text)); startActivityForResult(intent, REQUEST_CODE_DEVICE_ADMIN); // disable until we're really active waitForResult = true; CheckBoxPreference cbp = (CheckBoxPreference) findPreference(Constant.KEY_CB_DEVICE_ADMIN); cbp.setChecked(false); } else { System.out.println("KEY_CB_DEVICE_ADMIN disable"); DevicePolicyManager mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); mDPM.removeActiveAdmin(deviceAdminSample); } } } private void getSimInfoAndSave(Context context) { // get sim info TelephonyManager manager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); String simSerialNumber = manager.getSimSerialNumber(); // save sim info ConfigUtils.putString(context, Constant.KEY_SIM_INFO, simSerialNumber); } /** * wait for activate device admin * @param requestCode * @param resultCode * @param data */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_DEVICE_ADMIN) { // if not activate the permission, set the check false if (Activity.RESULT_OK == resultCode) { CheckBoxPreference cbp = (CheckBoxPreference) findPreference(Constant.KEY_CB_DEVICE_ADMIN); cbp.setChecked(true); } waitForResult = false; } } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults); } // permission callback start @Override public void onPermissionGranted(@NonNull String[] permissionName) { System.out.println("onPermissionGranted:" + Arrays.toString(permissionName)); if(null == permissionName || Arrays.asList(permissionName).contains(Manifest.permission.READ_PHONE_STATE)) { if(readPhoneState) { readPhoneState = false; getSimInfoAndSave(getActivity()); CheckBoxPreference cbp = (CheckBoxPreference) findPreference(Constant.KEY_CB_BIND_SIM); cbp.setChecked(true); } } waitForResult = false; } @Override public void onPermissionDeclined(@NonNull String[] permissionName) { Toast.makeText(getActivity(), R.string.no_permission, Toast.LENGTH_SHORT).show(); waitForResult = false; } @Override public void onPermissionPreGranted(@NonNull String permissionsName) { System.out.println("onPermissionPreGranted:" + permissionsName); onPermissionGranted(new String[]{permissionsName}); } @Override public void onPermissionNeedExplanation(@NonNull String permissionName) { System.out.println("onPermissionNeedExplanation:" + permissionName); } @Override public void onPermissionReallyDeclined(@NonNull String permissionName) { System.out.println("onPermissionReallyDeclined:" + permissionName); waitForResult = false; } @Override public void onNoPermissionNeeded() { onPermissionGranted(null); } // permission callback end }