ভাঁজযোগ্য ডিভাইসগুলি অনন্য দেখার অভিজ্ঞতা প্রদান করে। রিয়ার ডিসপ্লে মোড এবং ডুয়াল-স্ক্রিন মোড আপনাকে ভাঁজযোগ্য ডিভাইসগুলির জন্য বিশেষ ডিসপ্লে বৈশিষ্ট্য তৈরি করতে সক্ষম করে, যেমন রিয়ার-ক্যামেরা সেলফি প্রিভিউ এবং অভ্যন্তরীণ এবং বাইরের স্ক্রিনে একই সাথে কিন্তু ভিন্ন ডিসপ্লে।
রিয়ার ডিসপ্লে মোড
সাধারণত যখন একটি ভাঁজযোগ্য ডিভাইস খোলা হয়, তখন কেবল ভিতরের স্ক্রিনটি সক্রিয় থাকে। রিয়ার ডিসপ্লে মোড আপনাকে একটি ভাঁজযোগ্য ডিভাইসের বাইরের স্ক্রিনে কোনও কার্যকলাপ স্থানান্তর করতে দেয়, যা সাধারণত ডিভাইসটি খোলার সময় ব্যবহারকারীর দিক থেকে দূরে থাকে। ভিতরের ডিসপ্লেটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়।
একটি অভিনব অ্যাপ্লিকেশন হল ক্যামেরার প্রিভিউ বাইরের স্ক্রিনে প্রদর্শন করা, যাতে ব্যবহারকারীরা পিছনের ক্যামেরা দিয়ে সেলফি তুলতে পারেন, যা সাধারণত সামনের ক্যামেরার তুলনায় অনেক ভালো ছবি তোলার পারফরম্যান্স প্রদান করে।
রিয়ার ডিসপ্লে মোড সক্রিয় করতে, ব্যবহারকারীরা একটি ডায়ালগে সাড়া দিয়ে অ্যাপটিকে স্ক্রিন পরিবর্তন করার অনুমতি দেয়, উদাহরণস্বরূপ:

সিস্টেমটি ডায়ালগ তৈরি করে, তাই আপনার পক্ষ থেকে কোনও ডেভেলপমেন্টের প্রয়োজন হয় না। ডিভাইসের অবস্থার উপর নির্ভর করে বিভিন্ন ডায়ালগ দেখা যায়; উদাহরণস্বরূপ, ডিভাইসটি বন্ধ থাকলে সিস্টেম ব্যবহারকারীদের ডিভাইসটি খোলার নির্দেশ দেয়। আপনি ডায়ালগটি কাস্টমাইজ করতে পারবেন না এবং এটি বিভিন্ন OEM-এর ডিভাইসে পরিবর্তিত হতে পারে।
আপনি Pixel Fold ক্যামেরা অ্যাপের মাধ্যমে রিয়ার ডিসপ্লে মোড ব্যবহার করে দেখতে পারেন। কোডল্যাবে একটি নমুনা বাস্তবায়ন দেখুন । Jetpack WindowManager ব্যবহার করে ফোল্ডেবল ডিভাইসে আপনার ক্যামেরা অ্যাপটি অপ্টিমাইজ করুন ।
ডুয়াল-স্ক্রিন মোড
ডুয়াল-স্ক্রিন মোড আপনাকে একই সাথে ফোল্ডেবলের উভয় ডিসপ্লেতে কন্টেন্ট দেখাতে দেয়। ডুয়াল-স্ক্রিন মোড অ্যান্ড্রয়েড ১৪ (এপিআই লেভেল ৩৪) বা তার বেশি চলমান পিক্সেল ফোল্ডে উপলব্ধ।
একটি উদাহরণ ব্যবহারের ক্ষেত্রে হল ডুয়াল-স্ক্রিন ইন্টারপ্রেটার।

প্রোগ্রাম্যাটিকভাবে মোডগুলি সক্ষম করুন
আপনি লাইব্রেরি সংস্করণ 1.2.0-beta03 থেকে শুরু করে Jetpack WindowManager API গুলির মাধ্যমে রিয়ার ডিসপ্লে মোড এবং ডুয়াল-স্ক্রিন মোড অ্যাক্সেস করতে পারবেন।
আপনার অ্যাপের মডিউল build.gradle ফাইলে WindowManager নির্ভরতা যোগ করুন:
খাঁজকাটা
dependencies {
// TODO: Define window_version in your project's build configuration.
implementation "androidx.window:window:$window_version"
}
কোটলিন
dependencies {
// Define window_version in your project's build configuration.
implementation("androidx.window:window:$window_version")
}
এন্ট্রি পয়েন্ট হল WindowAreaController , যা ডিভাইসের ডিসপ্লের মধ্যে বা ডিসপ্লে এরিয়ার মধ্যে উইন্ডো সরানোর সাথে সম্পর্কিত তথ্য এবং আচরণ প্রদান করে। WindowAreaController আপনাকে উপলব্ধ WindowAreaInfo অবজেক্টের তালিকা অনুসন্ধান করতে দেয়।
WindowAreaInfo ব্যবহার করে WindowAreaSession অ্যাক্সেস করুন, এটি একটি ইন্টারফেস যা একটি সক্রিয় উইন্ডো এরিয়া বৈশিষ্ট্য উপস্থাপন করে। একটি নির্দিষ্ট WindowAreaCapability এর প্রাপ্যতা নির্ধারণ করতে WindowAreaSession ব্যবহার করুন।
প্রতিটি ক্ষমতা একটি নির্দিষ্ট WindowAreaCapability.Operation এর সাথে সম্পর্কিত। 1.2.0-beta03 সংস্করণে, Jetpack WindowManager দুই ধরণের ক্রিয়াকলাপ সমর্থন করে:
-
WindowAreaCapability.Operation.OPERATION_PRESENT_ON_AREA, যা ডুয়াল-স্ক্রিন মোড শুরু করতে ব্যবহৃত হয় -
WindowAreaCapability.Operation.OPERATION_TRANSFER_ACTIVITY_TO_AREA, যা রিয়ার ডিসপ্লে মোড চালু করতে ব্যবহৃত হয়
আপনার অ্যাপের প্রধান কার্যকলাপে রিয়ার ডিসপ্লে মোড এবং ডুয়াল-স্ক্রিন মোডের জন্য ভেরিয়েবল কীভাবে ঘোষণা করবেন তার একটি উদাহরণ এখানে দেওয়া হল:
কোটলিন
private lateinit var windowAreaController: WindowAreaController
private lateinit var displayExecutor: Executor
private var windowAreaSession: WindowAreaSession? = null
private var windowAreaInfo: WindowAreaInfo? = null
private var capabilityStatus: WindowAreaCapability.Status =
WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED
private val dualScreenOperation = WindowAreaCapability.Operation.OPERATION_PRESENT_ON_AREA
private val rearDisplayOperation = WindowAreaCapability.Operation.OPERATION_TRANSFER_ACTIVITY_TO_AREA
জাভা
private WindowAreaControllerCallbackAdapter windowAreaController = null;
private Executor displayExecutor = null;
private WindowAreaSessionPresenter windowAreaSession = null;
private WindowAreaInfo windowAreaInfo = null;
private WindowAreaCapability.Status capabilityStatus =
WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED;
private WindowAreaCapability.Operation dualScreenOperation =
WindowAreaCapability.Operation.OPERATION_PRESENT_ON_AREA;
private WindowAreaCapability.Operation rearDisplayOperation =
WindowAreaCapability.Operation.OPERATION_TRANSFER_ACTIVITY_TO_AREA;
আপনার কার্যকলাপের onCreate() পদ্ধতিতে ভেরিয়েবলগুলি কীভাবে ইনিশিয়ালাইজ করবেন তা এখানে দেওয়া হল:
কোটলিন
displayExecutor = ContextCompat.getMainExecutor(this)
windowAreaController = WindowAreaController.getOrCreate()
lifecycleScope.launch(Dispatchers.Main) {
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
windowAreaController.windowAreaInfos
.map { info -> info.firstOrNull { it.type == WindowAreaInfo.Type.TYPE_REAR_FACING } }
.onEach { info -> windowAreaInfo = info }
.map { it?.getCapability(operation)?.status ?: WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED }
.distinctUntilChanged()
.collect {
capabilityStatus = it
}
}
}
জাভা
displayExecutor = ContextCompat.getMainExecutor(this);
windowAreaController = new WindowAreaControllerCallbackAdapter(WindowAreaController.getOrCreate());
windowAreaController.addWindowAreaInfoListListener(displayExecutor, this);
windowAreaController.addWindowAreaInfoListListener(displayExecutor,
windowAreaInfos -> {
for(WindowAreaInfo newInfo : windowAreaInfos){
if(newInfo.getType().equals(WindowAreaInfo.Type.TYPE_REAR_FACING)){
windowAreaInfo = newInfo;
capabilityStatus = newInfo.getCapability(presentOperation).getStatus();
break;
}
}
});
কোনও কাজ শুরু করার আগে, নির্দিষ্ট ক্ষমতার প্রাপ্যতা পরীক্ষা করে নিন:
কোটলিন
when (capabilityStatus) {
WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED -> {
// The selected display mode is not supported on this device.
}
WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNAVAILABLE -> {
// The selected display mode is not available.
}
WindowAreaCapability.Status.WINDOW_AREA_STATUS_AVAILABLE -> {
// The selected display mode is available and can be enabled.
}
WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE -> {
// The selected display mode is already active.
}
else -> {
// The selected display mode status is unknown.
}
}
জাভা
if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNSUPPORTED)) {
// The selected display mode is not supported on this device.
}
else if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_UNAVAILABLE)) {
// The selected display mode is not available.
}
else if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_AVAILABLE)) {
// The selected display mode is available and can be enabled.
}
else if (capabilityStatus.equals(WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE)) {
// The selected display mode is already active.
}
else {
// The selected display mode status is unknown.
}
ডুয়াল-স্ক্রিন মোড
যদি ক্ষমতা ইতিমধ্যেই সক্রিয় থাকে, অথবা অন্যথায় presentContentOnWindowArea() ফাংশন কল করে, তাহলে নিম্নলিখিত উদাহরণটি সেশনটি বন্ধ করে দেয়:
কোটলিন
fun toggleDualScreenMode() {
if (windowAreaSession != null) {
windowAreaSession?.close()
}
else {
windowAreaInfo?.token?.let { token ->
windowAreaController.presentContentOnWindowArea(
token = token,
activity = this,
executor = displayExecutor,
windowAreaPresentationSessionCallback = this
)
}
}
}
জাভা
private void toggleDualScreenMode() {
if(windowAreaSession != null) {
windowAreaSession.close();
}
else {
Binder token = windowAreaInfo.getToken();
windowAreaController.presentContentOnWindowArea( token, this, displayExecutor, this);
}
}
WindowAreaPresentationSessionCallback আর্গুমেন্ট হিসেবে অ্যাপের প্রধান কার্যকলাপটির ব্যবহার লক্ষ্য করুন।
API একটি শ্রোতা পদ্ধতি ব্যবহার করে: যখন আপনি একটি ফোল্ডেবলের অন্য ডিসপ্লেতে কন্টেন্ট উপস্থাপন করার অনুরোধ করেন, তখন আপনি একটি সেশন শুরু করেন যা শ্রোতার onSessionStarted() পদ্ধতির মাধ্যমে ফেরত পাঠানো হয়। যখন আপনি সেশনটি বন্ধ করেন, তখন আপনি onSessionEnded() পদ্ধতিতে একটি নিশ্চিতকরণ পাবেন।
শ্রোতা তৈরি করতে, WindowAreaPresentationSessionCallback ইন্টারফেসটি বাস্তবায়ন করুন:
কোটলিন
class MainActivity : AppCompatActivity(), windowAreaPresentationSessionCallback
জাভা
public class MainActivity extends AppCompatActivity implements WindowAreaPresentationSessionCallback
শ্রোতাকে onSessionStarted() , onSessionEnded(), এবং onContainerVisibilityChanged() পদ্ধতিগুলি প্রয়োগ করতে হবে। কলব্যাক পদ্ধতিগুলি আপনাকে সেশনের অবস্থা সম্পর্কে অবহিত করে এবং সেই অনুযায়ী অ্যাপটি আপডেট করতে সক্ষম করে।
onSessionStarted() কলব্যাকটি একটি WindowAreaSessionPresenter কে আর্গুমেন্ট হিসেবে গ্রহণ করে। আর্গুমেন্ট হল সেই কন্টেইনার যা আপনাকে একটি উইন্ডো এরিয়া অ্যাক্সেস করতে এবং কন্টেন্ট দেখাতে দেয়। ব্যবহারকারী যখন প্রাথমিক অ্যাপ্লিকেশন উইন্ডো ছেড়ে চলে যায় তখন সিস্টেমটি স্বয়ংক্রিয়ভাবে উপস্থাপনাটি বাতিল করতে পারে, অথবা WindowAreaSessionPresenter#close() কল করে উপস্থাপনাটি বন্ধ করতে পারে।
অন্যান্য কলব্যাকের জন্য, সরলতার জন্য, ফাংশন বডিতে কোনও ত্রুটি আছে কিনা তা পরীক্ষা করুন এবং অবস্থা লগ করুন:
কোটলিন
override fun onSessionStarted(session: WindowAreaSessionPresenter) {
windowAreaSession = session
val view = TextView(session.context)
view.text = "Hello world!"
session.setContentView(view)
}
override fun onSessionEnded(t: Throwable?) {
if(t != null) {
Log.e(logTag, "Something was broken: ${t.message}")
}
}
override fun onContainerVisibilityChanged(isVisible: Boolean) {
Log.d(logTag, "onContainerVisibilityChanged. isVisible = $isVisible")
}
জাভা
@Override
public void onSessionStarted(@NonNull WindowAreaSessionPresenter session) {
windowAreaSession = session;
TextView view = new TextView(session.getContext());
view.setText("Hello world, from the other screen!");
session.setContentView(view);
}
@Override public void onSessionEnded(@Nullable Throwable t) {
if(t != null) {
Log.e(logTag, "Something was broken: ${t.message}");
}
}
@Override public void onContainerVisibilityChanged(boolean isVisible) {
Log.d(logTag, "onContainerVisibilityChanged. isVisible = " + isVisible);
}
ইকোসিস্টেম জুড়ে ধারাবাহিকতা বজায় রাখার জন্য, ব্যবহারকারীদের ডুয়াল স্ক্রিন মোড কীভাবে সক্ষম বা নিষ্ক্রিয় করতে হয় তা নির্দেশ করার জন্য ডুয়াল স্ক্রিন অফিসিয়াল আইকন ব্যবহার করুন।
একটি কার্যকরী নমুনার জন্য, DualScreenActivity.kt দেখুন।
রিয়ার ডিসপ্লে মোড
ডুয়াল-স্ক্রিন মোড উদাহরণের মতো, নিম্নলিখিত উদাহরণে একটি toggleRearDisplayMode() ফাংশন সেশনটি বন্ধ করে দেয় যদি ক্ষমতা ইতিমধ্যেই সক্রিয় থাকে, অথবা অন্যথায় transferActivityToWindowArea() ফাংশনটিকে কল করে:
কোটলিন
fun toggleRearDisplayMode() {
if(capabilityStatus == WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE) {
if(windowAreaSession == null) {
windowAreaSession = windowAreaInfo?.getActiveSession(
operation
)
}
windowAreaSession?.close()
} else {
windowAreaInfo?.token?.let { token ->
windowAreaController.transferActivityToWindowArea(
token = token,
activity = this,
executor = displayExecutor,
windowAreaSessionCallback = this
)
}
}
}
জাভা
void toggleRearDisplayMode() {
if(capabilityStatus == WindowAreaCapability.Status.WINDOW_AREA_STATUS_ACTIVE) {
if(windowAreaSession == null) {
windowAreaSession = windowAreaInfo.getActiveSession(
operation
)
}
windowAreaSession.close();
}
else {
Binder token = windowAreaInfo.getToken();
windowAreaController.transferActivityToWindowArea(token, this, displayExecutor, this);
}
}
এই ক্ষেত্রে, প্রদর্শিত কার্যকলাপটি WindowAreaSessionCallback হিসাবে ব্যবহৃত হয়, যা বাস্তবায়ন করা সহজ কারণ কলব্যাকটি এমন কোনও উপস্থাপক গ্রহণ করে না যা উইন্ডো অঞ্চলে সামগ্রী প্রদর্শনের অনুমতি দেয় বরং পুরো কার্যকলাপটিকে অন্য অঞ্চলে স্থানান্তর করে:
কোটলিন
override fun onSessionStarted() {
Log.d(logTag, "onSessionStarted")
}
override fun onSessionEnded(t: Throwable?) {
if(t != null) {
Log.e(logTag, "Something was broken: ${t.message}")
}
}
জাভা
@Override public void onSessionStarted(){
Log.d(logTag, "onSessionStarted");
}
@Override public void onSessionEnded(@Nullable Throwable t) {
if(t != null) {
Log.e(logTag, "Something was broken: ${t.message}");
}
}
ইকোসিস্টেম জুড়ে ধারাবাহিকতা বজায় রাখার জন্য, রিয়ার ক্যামেরার অফিসিয়াল আইকন ব্যবহার করে ব্যবহারকারীদের রিয়ার ডিসপ্লে মোড কীভাবে সক্ষম বা নিষ্ক্রিয় করবেন তা নির্দেশ করুন।
অতিরিক্ত সম্পদ
- জেটপ্যাক উইন্ডো ম্যানেজার কোডল্যাব দিয়ে ফোল্ডেবল ডিভাইসে আপনার ক্যামেরা অ্যাপটি অপ্টিমাইজ করুন
-
androidx.window.areaপ্যাকেজের সারাংশ - জেটপ্যাক উইন্ডো ম্যানেজার নমুনা কোড: