рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╕реНрдЯрдо рд▓реЙрдХрд░ рд▓рд┐рдЦрд╛ рд╣реИ





рд╣рдмреНрд░рд╛рдирд░реЛрд╡рд┐рдЪ рд╕реЗ рд╣реИрдмреНрд░реЙрд╕реНрдЯреНрд░реЛрдЭрд┐рд▓рдо рдХреЛ рдирдорд╕реНрдХрд╛рд░ред рдареАрдХ рдПрдХ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ рд╕реИрдорд╕рдВрдЧ рдЧреИрд▓реЗрдХреНрд╕реА Gio рдХреЗ рд▓рд┐рдП рддрдм рдХреЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реИрдорд╕рдВрдЧ рдЧреИрд▓реЗрдХреНрд╕реА s3 рдХреА рд╢реИрд▓реА рдореЗрдВ рдПрдХ рдХрд╕реНрдЯрдо рд▓реЙрдХрд░ (рд▓реЙрдХ рд╕реНрдХреНрд░реАрди) рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХреНрдпрд╛ рдХрд╛рд░рдг рд╣реИрдВ, рдореИрдВрдиреЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдХреЗрд╡рд▓ рдЗрддрдирд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ Google Play рдкрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдкрд▓реЛрдб рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЗрд╕ рдкрд░ рдкреИрд╕рд╛ рдмрдирд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рдерд╛ред рдпрд╣ рдкреЛрд╕реНрдЯ рдореЗрд░реЗ рдирд┐рд░реНрдгрдп рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред





рдореИрдВ рджреВрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛ред рдХрдИ рд▓реЛрдЧ рдЗрд╕рдХреЗ рдЦреБрд▓реЗрдкрди рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдореИрдВ рдХреНрдпрд╛ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ? рдЕрдиреНрдп рд▓реЛрдХрдкреНрд░рд┐рдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдПрдВрдбреНрд░реЙрдЗрдб рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдФрд░ рд╕рд╡рд╛рд▓ рдЙрдарддреЗ рд╣реИрдВред рд▓реЙрдХрд╕реНрдХреНрд░реАрди (рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдЗрд╕реЗ рдХреАрдЧрд╛рд░реНрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдмрд╕ рд╕рд╡рд╛рд▓ рдЙрдард╛рддрд╛ рд╣реИ: Google рдиреЗ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕реМрджрд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЪреВрдВрдХрд┐ рд▓реЙрдиреНрдЪрд░ рдХреЗ рд╕рд╛рде, рдЙрдиреНрд╣реЛрдВрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╕рднреА рд▓реЙрдХрд░ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдХ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрд╡рд╛рдж рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛? рдорд╕реНрддрд┐рд╖реНрдХ рдореЗрдВ рдХрд╣реАрдВ рдЧрд╣рд░реА, рд╢рд╛рдВрдд, рдЕрд╡рд┐рд╡реЗрдХреА рдЖрд╡рд╛рдЬ рдореЗрдВ, рдХреЛрдИ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ: рд╢рд╛рдпрдж Google (рдПрдВрдбреНрд░реЙрдЗрдб рдЗрдВрдХред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП) рдиреЗ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдЖрд╡рд╛рдЬрд╝ рд╢рд╛рдпрдж рд╕рд╣реА рд╣реИ, рдФрд░ рдХрдИ рд▓реЙрдХрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдФрд░ рдореИрдВрдиреЗ (рд╡рд┐рдирдп рдиреЗ рдЦреБрдж рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реМрдВрдкрд╛ рдирд╣реАрдВ рдЬрд╛рдиреЗ рджрд┐рдпрд╛) рдХреЛ рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдерд╛, рдФрд░ рдПрдХ рдирд╣реАрдВред



рд╕реНрд░реЛрдд рд╕реАрдЦрдирд╛



рдореИрдВрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдПрдХ рдлрд╛рдпрджреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ - рд╕реНрд░реЛрдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рд╕реЗред рдореИрдВ рдЙрди рд░реВрдврд╝рд┐рд╡рд╛рджрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВ рдЬреЛ 2.5 рд╕рд╛рд▓ рд╕реЗ рд╕реНрдЯреЙрдХ рдлрд░реНрдорд╡реЗрдпрд░ (2.3.6) рдкрд░ рдмреИрдареЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ред рд╕реНрдХреНрд░реАрди рд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╡рд░реНрдЧ android.policy.jar рдореЗрдВ рд╣реИрдВ, рдЬреЛ рд╕рд┐рд╕реНрдЯрдо / рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд╣реИред рдореВрд▓ рд▓рдХреНрд╖реНрдп рдПрдХ "рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ" рдЦреЛрдЬрдирд╛ рдерд╛, рдЕрд░реНрдерд╛рддреН рд▓реЙрдХрд░ рдХрд╣рд╛рдВ рдФрд░ рдХрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдЦреЛрдЬрд╛ рдЧрдпрд╛ ред



PhoneWindowManager.java рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕реНрдХреНрд░реАрдирдЯрд░реНрдирдСрдл (int рдХреНрдпреЛрдВ) рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдЗрд╕реА рдирд╛рдо рдХреЗ KeyguardViewMediator рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдХрд┐рд╕рдиреЗ рдХреЙрд▓ рдХрд┐рдпрд╛, рдХрд┐рд╕рдиреЗ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛, рдореБрдЭреЗ KeyguardViewManager рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рдзрд┐ рдорд┐рд▓реА, рдЬреЛ рд╕реАрдзреЗ рджреГрд╢реНрдп рд▓реЙрдХрд░ рдмрдирд╛рддреА рд╣реИред



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(); }
      
      





рдареАрдХ рд╣реИ, рд╕рднреА рд╕рд░рд▓ рд╕рд░рд▓ рд╣реИред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХреЛрдб рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА - рдХреЛрдИ рдЕрдиреБрдорддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдереЛрдбрд╝рд╛ Google, рдиреЗ рдирд┐рдореНрди рдЕрдиреБрдорддрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реАрдВ: SYSTEM_ALERT_WINDOW рдФрд░ INTERNAL_SYSTEM_WINDOWред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд╛рдпрджрд╛ рдирд╣реАрдВ рд╣реБрдЖред



рдореИрдВ PhoneWindowManager.java рд╡рд░реНрдЧ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реМрдЯрд╛:

 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; }
      
      





рдЖрд╡рд╢реНрдпрдХ TYPE_KEYGUARD рд╡рд┐рдВрдбреЛ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореЗрд░реА рдЬреЛрдбрд╝реА рдЧрдИ рдЕрдиреБрдорддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рджреВрд╕рд░рд╛ рдЪрд╛рд╣рд┐рдПред рд╢рд░реАрд░ рдХрд╛ рдкрд┐рдЫрд▓рд╛ рдмрд┐рдВрджреБ рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рд▓рдЧрд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рдерд╛ рдЬрд┐рддрдирд╛ рдореИрдВрдиреЗ рдХрд▓реНрдкрдирд╛ рдХреА рдереАред рдЗрд╕ рдЕрдиреБрдорддрд┐ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ред рдпрд╣рд╛рдВ AndroidManifest.xml рдлреНрд░реЗрдорд╡рд░реНрдХ-res.apk рдкреИрдХреЗрдЬ рдХрд╛ рдПрдХ рдЕрдВрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред



 <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(); }
      
      





рдореИрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ: рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реИ, рдЪреВрдВрдХрд┐ API11 рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред



рдкрд╣рд▓реЗ рджреЛрд╖ рдХрд╛ рд╕рдорд╛рдзрд╛рди ( рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдлрд┐рд░ рд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ) рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред WindowManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рд╕реНрдерд┐рддрд┐ рдкрдЯреНрдЯреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рджреГрд╢реНрдп рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА TouchEvents рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рд╕реЗрд╡рд╛ рд╣реИ рдЬреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ:



 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; } }





рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдИ рджреВрд╕рд░рд╛ рджреЛрд╖ рдирд╣реАрдВ рдерд╛, рдЬрд┐рдВрдЬрд░рдмреНрд░реЗрдб рдкрд░ рдЗрд╕ рдХреЛрдб рдиреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред W3bsit3-dns.com рдкрд░, рдЬрд╣рд╛рдВ рдореИрдВрдиреЗ рдЕрдкрдиреА рд░рдЪрдирд╛ рдХреЛ рд░реЛрд╖рдкреВрд░реНрд╡рдХ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдиреЗ рд╢рд┐рдХрд╛рдпрдд рдХреА рдХрд┐ рдХрдИ рдлреЛрди рдкрд░ рдореЗрд░реЗ рд▓реЙрдХрд░ рдХреЛ рдПрдХ рдирд┐рдпрдорд┐рдд рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рддрд░рд╣ рдХрдо рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрдирдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ред рдПрдХ рдорд╛рдирдХ рд▓рд╛рдВрдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдбрдореА рд╕реНрдерд╛рдкрд┐рдд рд╣реИред рдЬрдм рдореИрдВ рд╣реЛрдо рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реВрдВ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрд░реЗ рдбрдореА рд▓рд╛рдВрдЪрд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрд╕реНрдЯрдо рд▓реЙрдХрд░ рд╕рдХреНрд░рд┐рдп рд╣реИ, рддреЛ рд▓рд╛рдВрдЪрд░ рддреБрд░рдВрдд onCreate () рд╡рд┐рдзрд┐ рдореЗрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рд╣реЛрдо рдмрдЯрди рдХреЛ рдиреЗрддреНрд░рд╣реАрди рджрдмрд╛рдиреЗ рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдХрд╕реНрдЯрдо рд▓реЙрдХрд░ рд╕рдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИ, рддреЛ рдореЗрд░рд╛ рд▓реЙрдиреНрдЪрд░ рддреБрд░рдВрдд рдПрдХ рдФрд░ рд╕рд╣реА рд▓реЙрдиреНрдЪрд░ рдХрд╣рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред



рдпрд╣рд╛рдБ рдбрдореА рдХреЛрдб рд╣реИ:

 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(); } }
      
      





рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рдерд╛:





рдЬрдм рддрдХ рдореИрдВрдиреЗ "рд╕рд╣реА" рд▓реЙрдХрд╕реНрдХреНрд░реАрди рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реИрдорд╕рдВрдЧ рдЧреИрд▓реЗрдХреНрд╕реА рдПрд╕ 4 рдХреА рд╢реИрд▓реА рдореЗрдВ рдпреЗ рдмрд╛рдЗрдХ рд▓рдВрдмреА рдФрд░ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЪрд▓ рдкрдбрд╝реАред



рд╕рдВрд╕реНрдХрд░рдг рджреЛ



рдХрд╕реНрдЯрдо рд▓реЙрдХрд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрдм рд╣реЛрддреА рд╣реИ? рдЬрд╛рд╣рд┐рд░ рд╣реИ рд╕реНрдХреНрд░реАрди рдмрдВрдж рдХрд░рддреЗ рд╕рдордпред рдЪрд▓рд┐рдП рдПрдХ рд╕реЗрд╡рд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд╕реАрд╡рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рдХрдЯ рд╕реЗ рдпрд╣ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред



рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:



1. рдЬрд┐рд╕ рд╕рдордп рдбрд┐рд╡рд╛рдЗрд╕ рдмреВрдЯ рд╣реЛ, рдЙрд╕ рд╕рдордп рд╕реЗрд╡рд╛ рд╢реБрд░реВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред IntentFilter "android.intent.action.BOOT_COMPLETED" рдХреЗ рд╕рд╛рде BroadcastReseiver рдмрдирд╛рдПрдБред рдПрдХ BUT рд╣реИ: рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реЗрд╡рд╛ рдХреЛ рдорд╛рдирдХ рд╕реНрдХреНрд░реАрди рд▓реЙрдХ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдВрдбреНрд░реЙрдЗрдб рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдкрд┐рди рдЗрдирдкреБрдЯ рд╡рд┐рдВрдбреЛ рд╕реНрдЯреЙрдХ рд▓реЙрдХ рд╕реНрдХреНрд░реАрди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрд┐рди рджрд░реНрдЬ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕реЗрд╡рд╛ рд╢реБрд░реВ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред



рдЕрдзрд┐рдХрддрдо рдЬреЛ рдореЗрд░реА рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛:

 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); } } } }
      
      





2. PhoneWindowManager рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдЬреЛ 3 рдорд╛рди рд▓реЗрддрд╛ рд╣реИ, рдХреЛ рд╕реНрдХреНрд░реАрдирдЯрд░реНрдирдСрдл (int рдХреНрдпреЛрдВ) рд╡рд┐рдзрд┐ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

- рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдХреНрд░реАрди рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕реНрдЯреЙрдХ рд▓реЙрдХрд░ рджреЗрд░реА рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ),

- рдирд┐рдХрдЯрддрд╛ рд╕реЗрдВрд╕рд░ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдкрд░ (рдЯреЗрд▓реАрдлрд╝реЛрди рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк рдХреЗ рджреМрд░рд╛рди) рд╕реНрдХреНрд░реАрди рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИ,

- рдмрдЯрди рджрдмрд╛рддреЗ рд╣реА рд╕реНрдХреНрд░реАрди рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕реА рдХреЛрдИ рд╡рд┐рд╡рд┐рдзрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реЗрд╡рд╛ рдлреЛрди рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддреА рд╣реИ, рдФрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рдпрд╛ рдХреЙрд▓ рдХреЗ рджреМрд░рд╛рди рд╕реНрдХреНрд░реАрди рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред



рдпрд╣рд╛рдБ рдореБрдЦреНрдп рд╕реЗрд╡рд╛ рдХреЛрдб рд╣реИ:

 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); } } }
      
      





рдЧрддрд┐рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░, рд▓реЗрдХрд┐рди WindowManager рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрднреА рднреА рдордЬрдмреВрдд рдерд╛ред SYSTEM_ALERT_WINDOW рдЕрдиреБрдорддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкрд╛рдБрдЪ рд╡рд┐рдВрдбреЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ, TYPE_SYSTEM_ALERT рдиреЗ рдореБрдЭреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЙрдирдХреЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рдереЗ: рд╕реНрдЯреЗрдЯрдмрд╛рд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдХрдо рд╕реЗ рдХрдо рдЬрд┐рдВрдЬрд░рдмреНрд░реЗрдб рдкрд░) рдФрд░ рд╣реЛрдо рдмрдЯрди рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬреЗрд▓реА рдмреАрди рдкрд░ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред



рд╕реЗрд╡рд╛ рдФрд░ KeyguardView рдХреЗ рдмреАрдЪ рдордзреНрдпрд╡рд░реНрддреА рд▓рд┐рдВрдХ KeyguardMediator рд╡рд░реНрдЧ рд╣реИ:

 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; } } }
      
      





рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╣рд╛рдиреА рдХрдо рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдмреЛрд▓рдирд╛, рд╣рд░ рд░реЛрдЬрд╝ред рдЖрдк рдореЗрд░реЗ рд▓реЙрдХрд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реЙрд░реНрдЯрдХрдЯ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдорд╛рдирдХ рдФрд░ рд╕рд░рд▓ рд╣реИ) рдФрд░ рд╡рд┐рдЧреЗрдЯреНрд╕ (рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рдВрджреБ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рдпреЛрдЧреНрдп рд╣реИ)ред



рдЕрдм рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЖрдзреБрдирд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ:









рдирд┐рд╖реНрдХрд░реНрд╖



рдЗрд╕ рдкрдж рдХреЗ рд╕рд╛рде рдореИрдВ рдЦреБрдж рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣ рд▓реЙрдХрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧрд╛рдЗрдб рдирд╣реАрдВ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдЬрд╛рд╡рд╛ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд░ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдкреБрд╕реНрддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИ, рд▓реЗрдХрд┐рди рдЬреЛ рджреЛ рд╕рд╛рд▓ рд╕реЗ рд▓реЗрдЦрди рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╡рд╣ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреМрдбрд╝ рд╕рдХрддрд╛ рд╣реИред



All Articles