ডিভাইস-স্টেট-ভিত্তিক স্বয়ংক্রিয়-ঘোরান সেটিং

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

অ্যান্ড্রয়েড ১৩ থেকে, ডিভাইসের বিভিন্ন অবস্থার (যেমন ভাঁজ করা, খোলা বা অর্ধ-ভাঁজ করা (টেবিলটপ মোড)) উপর ভিত্তি করে অটো-রোটেট সেটিংস কাস্টমাইজ করার সুবিধা রয়েছে।

ডিভাইসের অবস্থা-ভিত্তিক স্বয়ংক্রিয় ঘূর্ণন সেটিংস পৃষ্ঠা

চিত্র ১: ব্যবহারকারীর দৃষ্টিকোণ থেকে ডিভাইসের অবস্থার উপর ভিত্তি করে স্বয়ংক্রিয় ঘূর্ণন সেটিংস।

ডিভাইসের অবস্থা ভিত্তিক স্বয়ংক্রিয় ঘূর্ণন সেটিং সক্রিয় করুন

ডিভাইস-অবস্থা-ভিত্তিক স্বয়ংক্রিয় ঘূর্ণন সক্রিয় ও কনফিগার করতে, ফ্রেমওয়ার্কের config.xml ফাইলের জন্য নিম্নরূপে একটি ডিভাইস ওভারলে তৈরি করুন:

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

    <!-- 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 হলো অন্য একটি ডিভাইস পোসচারের (device posture) একটি রেফারেন্স এবং যখন কোনো পোসচারের ভ্যালু 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(...) ][5] ব্যবহার করুন।
      • উইন্ডো ম্যানেজার থেকে DisplayRotation#freezeRotation() অথবা thawRotation() ব্যবহার করুন।
    • একটি নির্দিষ্ট ডিভাইস স্টেটের জন্য রোটেশন লক প্রেফারেন্স পরিবর্তন করতে ( DEVICE_STATE_ROTATION_LOCK পরিবর্তন করে):

      • RotationPolicy অথবা [ DeviceStateAutoRotateSettingManager ][6] থেকে 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 ][1]: DEVICE_STATE_ROTATION_LOCK সেটিংটি পরিচালনা করে। এটি সেটিংটি আপডেট করার, এর মান পুনরুদ্ধার করার এবং পরিবর্তনের জন্য লিসেনার নিবন্ধন করার পদ্ধতি সরবরাহ করে।

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

  • [ DeviceStateAutoRotateSettingController (সেটিংস অ্যাপ)][3]: ডিভাইসের অবস্থা-ভিত্তিক স্বয়ংক্রিয়-ঘূর্ণন সেটিংস পৃষ্ঠার UI নিয়ন্ত্রণ করুন।

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

বৈধতা

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

[1]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManagerImpl.java [2]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/wm/DeviceStateAutoRotateSettingController.java [3]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/src/com/android/settings/display/DeviceStateAutoRotateSettingController.java [4]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/provider/Settings.java [5]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java;bpv=0 [6]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManager.java [7]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/res/values/config.xml;l=674;drc=485b59a37c1cd0af72ca706e0ba1094f4e7fef0e;l=674