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

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

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

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

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

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

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

  1. আপনার ডিভাইসের ওভারলে config.xmlconfig_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(...) ব্যবহার করুন।
      • উইন্ডো ম্যানেজার থেকে, DisplayRotation#freezeRotation() অথবা thawRotation() ব্যবহার করুন।
    • একটি নির্দিষ্ট ডিভাইসের অবস্থার জন্য ঘূর্ণন লক পছন্দ পরিবর্তন করতে ( DEVICE_STATE_ROTATION_LOCK পরিবর্তন করে):

বাস্তবায়নের বিশদ বিবরণ

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

সেটিংস

স্বয়ংক্রিয়-ঘূর্ণন পরিচালনা করতে সিস্টেমটি নিম্নলিখিত দুটি সেটিংস ব্যবহার করে:

  • 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 পরীক্ষা নেই। আপনার কনফিগার করা বিভিন্ন ভৌত অবস্থার মধ্যে ডিভাইসটি রূপান্তরিত হলে স্বয়ংক্রিয়-ঘূর্ণন সেটিংস প্রত্যাশিতভাবে পরিবর্তিত হয় কিনা তা যাচাই করার জন্য আপনাকে ম্যানুয়াল পরীক্ষা করতে হবে।