ডিভাইস-স্টেট-ভিত্তিক অটো-রোটেট সেটিং

ফোল্ড করা যায় এমন ডিভাইসের ক্ষেত্রে, ডিভাইসের ফিজিক্যাল অবস্থার সাথে স্ক্রিন রোটেট করার আচরণ অ্যাডজাস্ট করে ব্যবহারকারীর অভিজ্ঞতা অপ্টিমাইজ করা যেতে পারে। যেমন, ডিভাইসটি ট্যাবলেটের মতো ভঙ্গিতে আনফোল্ড করা হলে স্ক্রিনটি অটোমেটিক ঘোরার জন্য সেট করতে পারেন, তবে ডিভাইসটি ফোল্ড করা হলে পোর্ট্রেটে লক করা থাকে।

Android 13 থেকে শুরু করে, Android-এ অটো-রোটেট সেটিংস কাস্টমাইজ করার ক্ষমতা আছে যা ডিভাইস স্টেট, যেমন ফোল্ড করা, আনফোল্ড করা বা হাফ-ফোল্ড করা (টেবলটপ মোড) ইত্যাদির উপর ভিত্তি করে করা হয়।

ডিভাইসের স্ট্যাটাস-ভিত্তিক অটো-রোটেট সেটিংস পৃষ্ঠা

ছবি ১. ব্যবহারকারীর দেখা ডিভাইস-স্টেট-ভিত্তিক অটো-রোটেট সেটিংস।

ডিভাইস স্টেট ভিত্তিক অটোমেটিক রোটেট সেটিং চালু করা

ডিভাইস-স্টেট-ভিত্তিক অটো-রোটেশন চালু ও কনফিগার করতে, ফ্রেমওয়ার্কের config.xml ফাইলের জন্য ডিভাইস ওভারলে তৈরি করুন, এইভাবে:

  1. আপনার ডিভাইসের ওভারলে config.xml-এ config_perDeviceStateRotationLockDefaults ইন্টিজার অ্যারে পপুলেট করার মাধ্যমে বিভিন্ন ডিভাইস পসচারের জন্য ডিফল্ট অটো-রোটেট আচরণ কনফিগার করুন:

    <!-- In your device overlay, for example,
        device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml -->
    <resources>
        <!-- Map of device posture to rotation lock setting. Each entry must be
            in the format "key:value", or "key:value:fallback_key" for example:
            "0:1" or "2:0:1". The keys are one of
            Settings.Secure.DeviceStateRotationLockKey, and the values are one of
            Settings.Secure.DeviceStateRotationLockSetting. -->
        <integer-array name="config_perDeviceStateRotationLockDefaults">
            <item>0:1</item> <!-- CLOSED -> LOCKED -->
            <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to
                device posture OPENED -->
            <item>2:2</item> <!-- OPENED -> UNLOCKED -->
            <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to
                device posture CLOSED -->
        </integer-array>
    </resources>
    

    fallback-key হল অন্য ডিভাইস পোস্টারের রেফারেন্স এবং পোস্টারের মান Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED হলে আপনাকে অবশ্যই তা উল্লেখ করতে হবে। কোনও পোসচার এইভাবে কনফিগার করা হলে, এর অটো-রোটেট সংক্রান্ত পছন্দ পেতে বা সেট করতে যেকোনও অনুরোধ ফলব্যাক পোসচারে রিডাইরেক্ট করা হয়।

    যেমন, HALF_OPENED পসচার থেকে OPENED পসচারে ফিরে গেলে:

    • HALF_OPENED-এর জন্য অটো-রোটেট সেটিং পড়লে OPENED-এর জন্য বর্তমান সেটিং দেখায়।
    • ডিভাইস HALF_OPENED থাকাকালীন নতুন অটো-রোটেট সংক্রান্ত পছন্দ লেখা হলে, OPENED পজিশনের জন্য পছন্দ আপডেট হয়ে যায়।
  2. ব্যবহারকারীর সেট করা প্রতিটি ডিভাইস পোস্টারের জন্য বিবরণ কনফিগার করুন। আপনার ডিভাইসের সেটিংস অ্যাপ ওভারলেতে config_settableAutoRotationDeviceStatesDescriptions স্ট্রিং অ্যারে পপুলেট করুন:

    <!-- In your device's Settings app overlay -->
    <resources>
        <!-- The settings/preference description for each settable device
            posture defined in the array
            "config_perDeviceStateRotationLockDefaults".
            The item in position "i" describes the auto-rotation setting for the
            device posture also in position "i" in the array
            "config_perDeviceStateRotationLockDefaults". -->
        <string-array name="config_settableAutoRotationDeviceStatesDescriptions">
            <item>Auto-rotate when folded</item>
            <item>@null</item> <!-- No description for state in position 1 (it
            is not settable by the user) -->
            <item>Auto-rotate when unfolded</item>
        </string-array>
    </resources>
    
  3. অসামঞ্জস্যপূর্ণ আচরণ প্রতিরোধ করতে, সেটিংস প্রদানকারীদের সরাসরি লেখার পরিবর্তে, প্রোগ্রাম্যাটিকভাবে এই সেটিংস পরিবর্তন করতে সঠিক API ব্যবহার করুন:

    • বর্তমান রোটেশন লক স্টেট পরিবর্তন করতে (পরিবর্তন করে ACCELEROMETER_ROTATION):

      • SystemUI বা লঞ্চার থেকে, RotationPolicy#setRotationLock(...) ব্যবহার করুন।
      • Window Manager থেকে, DisplayRotation#freezeRotation() বা thawRotation() ব্যবহার করুন।
    • নির্দিষ্ট ডিভাইস স্টেটের জন্য রোটেশন লক সংক্রান্ত পছন্দ পরিবর্তন করতে (DEVICE_STATE_ROTATION_LOCK পরিবর্তন করে):

      • RotationPolicy বা DeviceStateAutoRotateSettingManager-এর মধ্যে যে কোনও একটি থেকে requestDeviceStateAutoRotateSettingChange(...) ব্যবহার করুন।

প্রয়োগ করা সংক্রান্ত বিবরণ

ফোল্ড করা যায় এমন ডিভাইসের অটো-রোটেট আচরণ নিয়ন্ত্রণকারী সেটিংস ও মূল কী ক্লাস নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।

সেটিংস

অটো-রোটেশন ম্যানেজ করতে সিস্টেম নিম্নলিখিত দুটি সেটিংস ব্যবহার করে:

  • Settings.System.ACCELEROMETER_ROTATION: এটি হল প্রাথমিক অটো-রোটেট সেটিং। কোনও ফোল্ডেবল ডিভাইসের ক্ষেত্রে, ডিভাইসের বর্তমান ডিভাইস পোস্টারের জন্য অটোমেটিক-ঘোরানো চালু আছে কিনা তা এর ভ্যালু থেকে বোঝা যায়।

  • Settings.Secure.DEVICE_STATE_ROTATION_LOCK: এই সেটিং প্রতিটি ডিভাইস পসচারের (যেমন, ভাঁজ করা বা খোলা) জন্য ব্যবহারকারীর অটো-রোটেট সংক্রান্ত পছন্দ স্টোর করে। এর ফলে ডিভাইস পজিশন পরিবর্তন হলে সিস্টেম সঠিক পছন্দ প্রয়োগ করতে পারে।

    সেটিংটি কোলন-ডিলিমিটেড স্ট্রিং হিসেবে স্টোর করা হয়। প্রতিটি ভ্যালুর পেয়ার ডিভাইসের একটি পসচার ও তার সাথে সম্পর্কিত রোটেশন সেটিং দেখায়। ফর্ম্যাট হল:

    <device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...

    ঘূর্ণনের ভ্যালুগুলি হল:

    • 0: উপেক্ষা করা হয়েছে (ফলব্যাক পোস্টারের জন্য সেটিং ব্যবহার করা হয়েছে)
    • 1: লক করা আছে (অটো-রোটেট বন্ধ আছে)
    • 2: আনলক করা আছে (অটো-রোটেট চালু আছে)

    যেমন, "0:2:2:1" স্ট্রিংয়ের অর্থ হল:

    • ফোল্ড করা অবস্থার (ভঙ্গি 0) জন্য, অটো-রোটেট আনলক করা (2) আছে।
    • আনফোল্ড করা অবস্থায় (পোশ্চার 2), অটো-রোটেট লক করা থাকে (1)।

গুরুত্বপূর্ণ ক্লাস

ডিভাইস-স্টেট-ভিত্তিক অটো-রোটেট সেটিংস ম্যানেজ করার লজিক নিম্নলিখিত ক্লাস দ্বারা পরিচালিত হয়:

  • DeviceStateAutoRotateSettingManagerImpl: DEVICE_STATE_ROTATION_LOCK সেটিং ম্যানেজ করে। এটি সেটিং আপডেট, এর ভ্যালু ফিরিয়ে আনা এবং পরিবর্তনের জন্য লিসেনার রেজিস্টার করার পদ্ধতি প্রদান করে।

  • DeviceStateAutoRotateSettingController (উইন্ডো ম্যানেজার): ACCELEROMETER_ROTATION এবং DEVICE_STATE_ROTATION_LOCK সিঙ্ক করে। ডিভাইসের পোশ্চার পরিবর্তন হলে, নতুন স্টেটের জন্য ব্যবহারকারীর পছন্দের উপর ভিত্তি করে এটি ACCELEROMETER_ROTATION আপডেট করে। এটি নিশ্চিত করে যে ACCELEROMETER_ROTATION-এ করা যেকোনও পরিবর্তন বর্তমান ডিভাইস পোস্টারের জন্য DEVICE_STATE_ROTATION_LOCK-এ সেভ করা হয় এবং একইভাবে বর্তমান পোস্টারের জন্য DEVICE_STATE_ROTATION_LOCK-এ করা পরিবর্তন ACCELEROMETER_ROTATION-এ প্রতিফলিত হয়।

  • DeviceStateAutoRotateSettingController (সেটিংস অ্যাপ): ডিভাইস-স্টেট-ভিত্তিক অটো-রোটেট সেটিংস পৃষ্ঠায় UI কন্ট্রোল করে।

  • PostureDeviceStateConverter: সাধারণ ডিভাইস-স্টেট আইডেন্টিফায়ার এবং এই ফিচারে ব্যবহৃত ডিভাইস-পোশ্চার আইডেন্টিফায়ারের মধ্যে কনভার্ট করে।

যাচাইকরণ

এই ফিচারের আচরণ OEM-এর কনফিগারেশনের উপর অত্যন্ত নির্ভরশীল বলে, এর জন্য নির্দিষ্ট CTS পরীক্ষা নেই। আপনার কনফিগার করা বিভিন্ন ফিজিক্যাল স্টেটের মধ্যে ডিভাইস ট্রানজিট করার সময় অটো-রোটেট সেটিংস প্রত্যাশিতভাবে পরিবর্তিত হচ্ছে কিনা তা যাচাই করতে আপনাকে ম্যানুয়াল টেস্টিং করতে হবে।