public synchronized void show() { if (DEBUG) Log.d(TAG, "show(); mKeyguardView==" + mKeyguardView); if (mKeyguardHost == null) { if (DEBUG) Log.d(TAG, "keyguard host is null, creating it..."); mKeyguardHost = new KeyguardViewHost(mContext, mCallback); final int stretch = ViewGroup.LayoutParams.MATCH_PARENT; int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN | WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER | WindowManager.LayoutParams.FLAG_KEEP_SURFACE_WHILE_ANIMATING /*| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR*/ ; if (!mNeedsInput) { flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; } WindowManager.LayoutParams lp = new WindowManager.LayoutParams( stretch, stretch, WindowManager.LayoutParams.TYPE_KEYGUARD, flags, PixelFormat.TRANSLUCENT); lp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN; lp.windowAnimations = com.android.internal.R.style.Animation_LockScreen; lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; lp.setTitle("Keyguard"); mWindowLayoutParams = lp; mViewManager.addView(mKeyguardHost, lp); } if (mKeyguardView == null) { if (DEBUG) Log.d(TAG, "keyguard view is null, creating it..."); mKeyguardView = mKeyguardViewProperties.createKeyguardView(mContext, mUpdateMonitor, this); mKeyguardView.setId(R.id.lock_screen); mKeyguardView.setCallback(mCallback); final ViewGroup.LayoutParams lp = new FrameLayout.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mKeyguardHost.addView(mKeyguardView, lp); if (mScreenOn) { mKeyguardView.onScreenTurnedOn(); } } mKeyguardHost.setVisibility(View.VISIBLE); mKeyguardView.requestFocus(); }
public int checkAddPermission(WindowManager.LayoutParams attrs) { int type = attrs.type; if (type < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW || type > WindowManager.LayoutParams.LAST_SYSTEM_WINDOW) { return WindowManagerImpl.ADD_OKAY; } String permission = null; switch (type) { case TYPE_TOAST: // XXX right now the app process has complete control over // this... should introduce a token to let the system // monitor/control what they are doing. break; case TYPE_INPUT_METHOD: case TYPE_WALLPAPER: // The window manager will check these. break; case TYPE_PHONE: case TYPE_PRIORITY_PHONE: case TYPE_SYSTEM_ALERT: case TYPE_SYSTEM_ERROR: case TYPE_SYSTEM_OVERLAY: permission = android.Manifest.permission.SYSTEM_ALERT_WINDOW; break; default: permission = android.Manifest.permission.INTERNAL_SYSTEM_WINDOW; } if (permission != null) { if (mContext.checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { return WindowManagerImpl.ADD_PERMISSION_DENIED; } } return WindowManagerImpl.ADD_OKAY; }
<permission android:label="@string/permlab_internalSystemWindow" android:name="android.permission.INTERNAL_SYSTEM_WINDOW" android:protectionLevel="signature" android:description="@string/permdesc_internalSystemWindow" />
@Override public void onAttachedToWindow(){ getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD); super.onAttachedToWindow(); }
public class StatusbarService extends Service { View v; @Override public void onStart(Intent intent, int id) { super.onStart(intent, id); Bundle e = intent.getExtras(); if(e != null){ int statusBarHeight = (Integer) e.get("SBH"); WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT, statusBarHeight, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); lp.gravity = Gravity.TOP; WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); v = new View(getBaseContext()); wm.addView(v, lp); } } @Override public void onDestroy() { super.onDestroy(); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.removeView(v); } @Override public IBinder onBind(Intent arg0) { return null; } }
statusBarHeight, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); public class StatusbarService extends Service { View v; @Override public void onStart(Intent intent, int id) { super.onStart(intent, id); Bundle e = intent.getExtras(); if(e != null){ int statusBarHeight = (Integer) e.get("SBH"); WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT, statusBarHeight, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN, PixelFormat.TRANSLUCENT); lp.gravity = Gravity.TOP; WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); v = new View(getBaseContext()); wm.addView(v, lp); } } @Override public void onDestroy() { super.onDestroy(); WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); wm.removeView(v); } @Override public IBinder onBind(Intent arg0) { return null; } }
public class HomeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(MainService.unlocked != false){ try{ SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); String pn = pref.getString("settings_launcher_pn", ""); String an = pref.getString("settings_launcher_an", ""); Intent launch = new Intent(Intent.ACTION_MAIN); launch.addCategory(Intent.CATEGORY_HOME); launch.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); launch.setClassName(pn, an); startActivity(launch); } catch(Exception e){ Intent i = null; PackageManager pm = getPackageManager(); for(ResolveInfo ri:pm.queryIntentActivities(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME), PackageManager.MATCH_DEFAULT_ONLY)){ if(!getPackageName().equals(ri.activityInfo.packageName)){ i = new Intent().addCategory(Intent.CATEGORY_HOME).setAction(Intent.ACTION_MAIN).addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS).setClassName(ri.activityInfo.packageName, ri.activityInfo.name); } } if(i != null) startActivity(i); } } finish(); } }
public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); if(PreferenceManager.getDefaultSharedPreferences(context).getBoolean("unlock_screen_enable", false)){ if(tm.getSimState() != TelephonyManager.SIM_STATE_PIN_REQUIRED && tm.getSimState() != TelephonyManager.SIM_STATE_PUK_REQUIRED){ context.startService(new Intent(context, KeyguardService.class)); } else { AlarmManager alarms = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); Intent intentToFire = new Intent(context, BootReceiver.class); PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intentToFire, 0); alarms.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000, alarmIntent); } } } }
public class KeyguardService extends Service { KeyguardMediator keyguardMediator; KeyguardManager.KeyguardLock keyguardLock; boolean telephone = false; //false - no call, true - in call boolean wasLocked = false; @Override public void onCreate() { super.onCreate(); TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); telephonyManager.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE); keyguardLock = ((KeyguardManager)getSystemService(KEYGUARD_SERVICE)).newKeyguardLock("Custom keyguard by Arriva"); keyguardLock.disableKeyguard(); IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); registerReceiver(receiver, filter); keyguardMediator = new KeyguardMediator(this); } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); keyguardLock.reenableKeyguard(); keyguardLock = null; keyguardMediator.destroy(); } void changeTelephoneState(int state){ if(state == TelephonyManager.CALL_STATE_IDLE){ telephone = false; if(wasLocked){ wasLocked = false; keyguardMediator.visibility(true); } } else { telephone = true; if(keyguardMediator.isShowing){ wasLocked = true; keyguardMediator.visibility(false); } } } private BroadcastReceiver receiver = new BroadcastReceiver(){ @Override public void onReceive(Context context, Intent intent) { String settingsLock = PreferenceManager.getDefaultSharedPreferences(context).getString("screen_lock", "2"); if(!settingsLock.equals("1")){ keyguardMediator.show(); } } }; class MyPhoneStateListener extends PhoneStateListener { @Override public void onCallStateChanged(int state, String incomingNumber){ super.onCallStateChanged(state, incomingNumber); changeTelephoneState(state); } } }
public class KeyguardMediator { WindowManager windowManager; KeyguardHost keyguardHost; KeyguardView keyguardView; Context context; boolean isShowing; String[] prefShortcutsArray; String prefScreenLock; String prefUnlockEffect; String prefPatternPassword; boolean prefMultipleWidgets; boolean prefShortcuts; boolean prefHelpText; boolean prefPatternVisible; boolean prefWallpaper; boolean drawWallpaperView; boolean drawWallpaperViewSqueeze; public KeyguardMediator(Context con){ context = con; windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); // } void onResume(){ if(keyguardView != null){ keyguardView.onResume(); } } void onPause(){ if(keyguardView != null){ keyguardView.onPause(); } } void show(){ if(isShowing){ visibility(true); return; } keyguardView = new KeyguardView(context, this); isShowing = true; int flags = WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN; if(!drawWallpaperView) { flags |= WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; } int format = PixelFormat.OPAQUE; if(!drawWallpaperView) { format = PixelFormat.TRANSLUCENT; } WindowManager.LayoutParams lp = new WindowManager.LayoutParams(WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, flags, format); if(drawWallpaperView){ lp.windowAnimations = android.R.style.Animation_Toast; // } lp.screenOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR; lp.setTitle("Custom keyguard"); keyguardHost = new KeyguardHost(context); keyguardHost.addView(keyguardView); windowManager.addView(keyguardHost, lp); } void hide(){ if(!isShowing){ return; } isShowing = false; keyguardHost.setVisibility(View.GONE); // View , windowManager.removeView(keyguardHost); keyguardHost = null; keyguardView = null; } void visibility(boolean visible){ // View keyguardHost.setVisibility(visible ? View.VISIBLE : View.GONE); if(keyguardView != null){ if(visible){ keyguardView.onResume(); } else { keyguardView.onPause(); } } } void startWidgetPicker(){ // activity } void finishWidgetPicker(){ // layout' } void destroy(){ if(keyguardHost != null){ windowManager.removeView(keyguardHost); keyguardHost = null; keyguardView = null; } } }
Source: https://habr.com/ru/post/220689/
All Articles