package cri.sanity; import cri.sanity.util.Alert; import android.app.admin.DeviceAdminReceiver; import android.app.admin.DevicePolicyManager; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.preference.CheckBoxPreference; import android.preference.Preference; public final class Admin { private static ComponentName compName; //---- inner classes public static class Receiver extends DeviceAdminReceiver { @Override public CharSequence onDisableRequested(Context ctx, Intent i) { return A.rawstr(R.raw.admin_ask_disable); } } //---- static methods public static final ComponentName compName() { if(compName == null) compName = new ComponentName(A.app(), Receiver.class); return compName; } public static final boolean isActive() { return A.SDK>=8 && A.devpolMan().isAdminActive(compName()); } public static final void request(Context ctx) { if(A.SDK < 8) return; final Intent i = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN); i.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN , compName()); i.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, A.rawstr(R.raw.admin_explanation)); ctx.startActivity(i); } public static final void remove() { final ComponentName cn = compName(); synchronized(cn) { if(!isActive()) return; try { A.devpolMan().removeActiveAdmin(cn); } catch(Exception e) {} } } public static final void prefSetup(final Preference p) { if(A.SDK < 8) { p.setEnabled(false); p.setSummary(R.string.msg_require_froyo); } else { final PrefActivity act = (PrefActivity)Alert.activity; act.on(p, new PrefActivity.Change(){ public boolean on(){ if((Boolean)value) Admin.request(act); else Alert.msg( A.rawstr(R.raw.admin_ask_disable), new Alert.Click(){ public void on(){ remove(); prefCheck(p); }}, null, Alert.OKCANC ); return false; }}); } } public static final void prefCheck(Preference p) { ((CheckBoxPreference)p).setChecked(isActive()); } }