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 ব্যবহার করার পরামর্শ দেওয়া হয়। লাইব্রেরি seamless transition — লেআউটের মধ্যে সুইচ করার সময় মসৃণ অ্যানিমেশন সমর্থন করে।
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 আপডেট উপেক্ষা করা, উল্লম্ব ভাঁজের সাথে বাউন্ডসের ভুল হ্যান্ডলিং এবং সমস্ত ভঙ্গিতে পরীক্ষার অভাব। পরামর্শ দেওয়া হচ্ছে প্রতিটি ভঙ্গি আলাদাভাবে পরীক্ষা করুন এবং তাদের মধ্যে পরিবর্তনের সময় আচরণ যাচাই করুন। ম্যানুয়াল আকার পরীক্ষার পরিবর্তে 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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন