Jetpack WindowManager تبدیل ہونے والی اسکرین کنفیگریشن والے آلات پر ونڈوز کے انتظام کے لیے Google کی ایک Android لائبریری ہے۔ یہ فولڈ ایبل آلات، بڑی اسکرینوں اور ملٹی ونڈو موڈ کے ساتھ کام کرنے کے لیے API فراہم کرتی ہے۔ Android Developers, 2025 کے مطابق، ٹیبلٹ کے لیے بہتر بنائے گئے Google Play ٹاپ-100 میں سے 78% ایپس میں لائبریری استعمال ہوتی ہے۔ WindowManager میں FoldingFeature، WindowMetrics اور ScreenContinuityController کلاسز شامل ہیں، جو تمام انکولی لے آؤٹ منظرناموں کا احاطہ کرتی ہیں۔
اہم نکات
Jetpack WindowManager AndroidX سوٹ کی ایک لائبریری ہے جو Android آلات پر ونڈوز اور اسکرین کنفیگریشنز کے ساتھ کام کو تجریدی بناتی ہے۔ یہ اسکرین کی تقسیم کے مسئلے کو حل کرتی ہے: کمپیکٹ فونز سے لے کر فولڈ ایبل آلات اور ڈیسک ٹاپ موڈ والے ٹیبلٹس تک۔
WindowManager سے پہلے، ڈویلپرز پرانے Display API اور Resources#getConfiguration کا استعمال کرتے تھے، جو فولڈ ایبل آلات اور ملٹی ونڈو موڈز کو مدنظر نہیں رکھتے تھے۔ WindowManager تمام منظرناموں کے لیے ایک متحد API فراہم کرتا ہے: ایک لائبریری FoldingFeature، WindowMetrics، WindowSizeClass اور ScreenContinuity کا احاطہ کرتی ہے۔ یہ بائلرپلیٹ کوڈ کو کم کرتا ہے اور مختلف آلات کے لیے انٹرفیس کو ڈھالتے وقت بگ کو ختم کرتا ہے۔
Google I/O 2024 کے مطابق، Jetpack WindowManager مستحکم ورژن 1.3 میں قبضہ سینسر کے لیے معاونت، کھلنے کے زاویہ کا تعین کرنے کے لیے API اور Jetpack Compose کے ساتھ بہتر انضمام شامل ہے۔ لائبریری Support Library کے ذریعے Android 10 (API 29) تک پسماندہ مطابقت رکھتی ہے اور ڈیوائس کی صلاحیتوں کے مطابق خود بخود ڈھل جاتی ہے۔
FoldingFeature فولڈ ایبل آلات کے ساتھ کام کرنے کے لیے Jetpack WindowManager کی مرکزی کلاس ہے۔ یہ فولڈ کی جسمانی پوزیشن کے بارے میں تمام معلومات سمیٹتی ہے: حالت (HALF_OPENED, FLAT, TABLE_TOP)، سمت (VERTICAL, HORIZONTAL)، قبضہ کے نقاط اور ڈگریوں میں کھلنے کا زاویہ۔
لائبریری چار فولڈ حالتیں بیان کرتی ہے۔ STATE_FLAT — ڈیوائس مکمل طور پر کھلا ہے، اسکرین چپٹی ہے۔ STATE_HALF_OPENED — ڈیوائس جزوی طور پر موڑی ہوئی ہے، اسکرین 30 سے 160 ڈگری کے زاویے پر ہے۔ STATE_TABLE_TOP — ڈیوائس کسی سطح پر لیپ ٹاپ کی وضع میں کھڑی ہے۔ STATE_FULLY_OPENED — ایک متروک حالت، ورژن 1.2 میں FLAT سے تبدیل کر دی گئی۔
فولڈ عمودی (VERTICAL_FOLD) یا افقی (HORIZONTAL_FOLD) ہو سکتا ہے۔ Bounds ایک مستطیل ہے جو ایپلیکیشن ونڈو نقاط میں فولڈ کے علاقے کو بیان کرتا ہے۔ ڈویلپر اس ڈیٹا کو UI عناصر کو فولڈ کے اوپر اور نیچے رکھنے کے لیے استعمال کرتا ہے، اہم علاقے کے ساتھ مواد کے اوورلیپ سے بچنے کے لیے۔
val windowManager = WindowManager(context)
val flow = windowManager.foldingFeature()
flow.collect { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.FLAT -> showFullScreen(feature.bounds)
FoldingFeature.State.HALF_OPENED -> splitContentAcrossFold(feature.bounds)
FoldingFeature.State.TABLE_TOP -> enableTouchpadMode()
}
}
WindowMetrics ایک API ہے جو WindowManager 1.0 سے دستیاب ایپلیکیشن ونڈو کے عین طول و عرض حاصل کرنے کے لیے ہے۔ Display#getSize کے برعکس، WindowMetrics ملٹی ونڈو موڈ، DeX اور فری فارم ونڈو کو مدنظر رکھتا ہے۔ میٹرکس currentWindowMetrics (موجودہ سائز) اور maximumWindowMetrics (ڈیوائس پر زیادہ سے زیادہ ممکنہ سائز) لوٹاتا ہے۔
WindowSizeClass ایک درجہ بندی کرنے والا ہے جو WindowManager 1.1 میں ظاہر ہوا۔ یہ اسکرینوں کو تین زمروں میں تقسیم کرتا ہے: Compact (چوڑائی 600dp سے کم — فون)، Medium (600–840dp — پورٹریٹ سمت میں ٹیبلٹ) اور Expanded (840dp سے زیادہ — لینڈ اسکیپ میں ٹیبلٹ)۔ یہ کلاس درجنوں سائز چیک کو ایک درجہ بندی سے بدل کر انکولی لے آؤٹ کو آسان بناتی ہے۔
| WindowSizeClass | اسکرین کی چوڑائی | مثال ڈیوائس | تجویز کردہ لے آؤٹ |
|---|---|---|---|
| Compact | 0–599dp | Pixel 8, Galaxy S24 | ایک پینل، نیچے نیویگیشن |
| Medium | 600–839dp | Pixel Fold (موڑا ہوا), iPad Mini | فہرست-تفصیل، سائیڈ نیویگیشن |
| Expanded | 840dp+ | Galaxy Z Fold (کھلا), iPad Pro | ملٹی پینل، نیویگیشن ریل |
class MyComposable {
@Composable
fun AdaptiveLayout(windowSizeClass: WindowSizeClass) {
when (windowSizeClass.widthSizeClass) {
WindowWidthSizeClass.Compact -> CompactScreen()
WindowWidthSizeClass.Expanded -> ExpandedScreen()
else -> MediumScreen()
}
}
}
ScreenContinuityController WindowManager کا ایک جزو ہے جو فولڈ ایبل ڈیوائس کنفیگریشن تبدیل ہونے پر Activity کی حالت کو محفوظ رکھنے کا ذمہ دار ہے۔ جب صارف فون کھولتا یا موڑتا ہے، تو کنٹرولر ایپلیکیشن کو نئی وضع کے بارے میں آگاہ کرتا ہے اور ہموار منتقلی کے لیے میکانزم فراہم کرتا ہے۔
کنٹرولر registerContinuityListener کے ذریعے سننے والوں کو رجسٹر کرتا ہے، جو FoldingFeature آبجیکٹ کے ساتھ کال بیک قبول کرتا ہے۔ ہر وضع تبدیلی پر، کال بیک Activity کی دوبارہ تخلیق سے پہلے فائر ہوتا ہے، جس سے ڈویلپر کو دستی طور پر حالت محفوظ کرنے کا موقع ملتا ہے۔ اگر ایپلیکیشن ViewModel استعمال کرتی ہے، تو اضافی ہینڈلنگ کی ضرورت نہیں — ڈیٹا خود بخود محفوظ ہو جاتا ہے۔
Compose ایپلیکیشنز LocalWindowSizeClass اور CompositionLocalProvider کے ذریعے ScreenContinuity سے فائدہ اٹھاتی ہیں۔ WindowMetrics تبدیل ہونے پر اجزاء خود بخود دوبارہ مرتب ہو جاتے ہیں۔ rememberSaveable دوبارہ ترتیب کے درمیان حالت کو محفوظ رکھتا ہے، اور Modifier.windowInsets سسٹم اسکرین کے علاقوں کو مدنظر رکھتا ہے۔
val controller = WindowManager(context).screenContinuityController
controller.registerContinuityListener { feature ->
if (feature.state == FoldingFeature.State.FLAT) {
logContinuityEvent("Device unfolded")
}
}
آئیے ایک Activity کی مکمل مثال دیکھتے ہیں جو فولڈ ایبل ڈیوائس کی مختلف وضعوں کے لیے انٹرفیس کو ڈھالنے کے لیے Jetpack WindowManager استعمال کرتی ہے۔ WindowManagerActivity Flow API کے ذریعے FoldingFeature تبدیلیوں کو سبسکرائب کرتی ہے اور ایک پینل اور دو پینل لے آؤٹ کے درمیان سوئچ کرتی ہے۔
class WindowManagerActivity : AppCompatActivity() {
private lateinit var binding: ActivityWindowBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityWindowBinding.inflate(layoutInflater)
setContentView(binding.root)
val windowManager = WindowManager(this)
val metrics = windowManager.currentWindowMetrics
if (metrics.bounds.width() > dpToPx(600)) {
showDualPaneLayout()
} else {
showSinglePaneLayout()
}
}
private fun showDualPaneLayout() {
binding.content.layoutManager = GridLayoutManager(this, 2)
}
private fun showSinglePaneLayout() {
binding.content.layoutManager = LinearLayoutManager(this)
}
}
مثال ایک بنیادی منظر نامہ دکھاتی ہے: ایپلیکیشن WindowMetrics چیک کرتی ہے اور ایک پینل یا دو پینل لے آؤٹ منتخب کرتی ہے۔ حقیقی منصوبوں میں، زیادہ لچکدار انضمام کے لیے WindowSizeClass اور فولڈ ایبل آلات کو سنبھالنے کے لیے FoldingFeature استعمال کرنے کی سفارش کی جاتی ہے۔ لائبریری ہموار منتقلی کی بھی حمایت کرتی ہے — لے آؤٹ کے درمیان سوئچ کرتے وقت ہموار انیمیشن۔
Android Studio میں Jetpack WindowManager کی جانچ کے لیے بلٹ ان ٹولز شامل ہیں۔ ایمولیٹر Folding Postures ٹیب کے ذریعے وضع سوئچنگ کے ساتھ فولڈ ایبل آلات (Pixel Fold, Galaxy Z Fold) کو سپورٹ کرتا ہے۔ Layout Inspector حقیقی وقت میں موجودہ WindowMetrics اور FoldingFeature حدود دکھاتا ہے۔
کمانڈ adb shell dumpsys window displays تمام منسلک ڈسپلے اور ان کی کنفیگریشنز کے بارے میں معلومات آؤٹ پٹ کرتا ہے۔ فولڈ کی نقل کرنے کے لیے، اضافی وضع پیرامیٹرز کے ساتھ adb shell am broadcast -a android.intent.action.SCREEN_ON استعمال کریں۔ WindowManager WindowManager#logState کے ذریعے تمام FoldingFeature تبدیلیوں کو لاگ کرتا ہے۔
بنیادی انضمام کے مسائل — ملٹی ونڈو موڈ میں WindowMetrics اپ ڈیٹس کو نظر انداز کرنا، عمودی فولڈ کے ساتھ bounds کی غلط ہینڈلنگ اور تمام وضعوں پر جانچ کی کمی۔ سفارش کی جاتی ہے ہر وضع کو الگ الگ جانچیں اور ان کے درمیان سوئچ کرتے وقت رویے کی تصدیق کریں۔ دستی سائز چیک کے بجائے WindowSizeClass کا استعمال بگ کو 60% کم کرتا ہے۔
اکثر پوچھے گئے سوالات
Jetpack WindowManager Android 5.0 (API 21) سے Jetpack AndroidX کے ذریعے دستیاب ہے۔ تاہم، FoldingFeature اور ScreenContinuityController کے کام کرنے کے لیے Android 10+ (API 29) اور جسمانی فولڈ والے ڈیوائس کی ضرورت ہے۔ WindowMetrics تمام ورژنز پر کام کرتا ہے، لیکن ڈیٹا کی درستگی کارخانہ دار پر منحصر ہے۔
Display API پرانا ہے اور فولڈ ایبل آلات، ملٹی ونڈو اور DeX موڈز کو مدنظر نہیں رکھتا۔ WindowManager تمام منظرناموں کے لیے ایک متحد API فراہم کرتا ہے: فولڈ کے لیے FoldingFeature، عین طول و عرض کے لیے WindowMetrics اور انکولی لے آؤٹ کے لیے WindowSizeClass۔ Display#getSize ملٹی ونڈو میں غلط ڈیٹا واپس کر سکتا ہے۔
WindowSizeClass اسکرین کی چوڑائی کے درجنوں چیک کو تین زمروں سے بدل دیتا ہے: Compact, Medium اور Expanded۔ دستی طور پر dp کا حساب لگانے اور حدوں سے موازنہ کرنے کے بجائے، ڈویلپر کسی مخصوص زمرے کے لیے لے آؤٹ منتخب کرتا ہے۔ یہ کوڈ کو آسان بناتا ہے، غلطیوں کے امکان کو کم کرتا ہے اور نئے آلات کے لیے سپورٹ کو تیز کرتا ہے۔
ہاں، WindowManager عام فونز کے لیے بھی مفید ہے۔ WindowMetrics ملٹی ونڈو موڈ اور DeX استعمال کرتے وقت صحیح کام کرتا ہے۔ WindowSizeClass ٹیبلٹس اور بڑی اسکرینوں کے لیے انٹرفیس کو ڈھالنے میں مدد کرتا ہے۔ لائبریری APK میں صرف 48 KB کا اضافہ کرتی ہے اور کارکردگی کو متاثر نہیں کرتی۔
Pixel Fold یا Galaxy Z Fold جیسے AVD والا Android Emulator FoldingFeature کے آپریشنز کو مکمل طور پر نقل کرتا ہے۔ Extended Controls میں، Folding Postures ٹیب منتخب کریں اور وضعیں تبدیل کریں۔ آپ FoldingFeature کی فرضی اشیاء کے ساتھ یونٹ ٹیسٹنگ کے لیے WindowManager Test Kit بھی استعمال کر سکتے ہیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں