সাজেশন রোটেট করা

Android 8.0-তে, ব্যবহারকারীরা 'দ্রুত সেটিংস' টাইল বা ডিসপ্লে সেটিংস ব্যবহার করে অটো-রোটেট এবং পোর্ট্রেট রোটেশন মোডের মধ্যে টগল করতে পারেন। Android 9-এ, আমরা পোর্ট্রেট রোটেশন মোড আপডেট করেছি যাতে ডিভাইস পজিশন পরিবর্তন হলেও বর্তমান স্ক্রিন রোটেশন পিন করে অনিচ্ছাকৃত রোটেশন বন্ধ করা যায়। নেভিগেশন বারে নতুন বোতাম প্রেস করে ব্যবহারকারী প্রয়োজনমতো ম্যানুয়ালি রোটেট করতে পারবেন। আমরা পোর্ট্রেট মোডের নাম পরিবর্তন করে রোটেশন লক করেছি এবং অটো-রোটেট বন্ধ থাকলে এটি চালু হয়। অটো-রোটেট মোডে কোনও পরিবর্তন করা হয়নি।

ডিভাইস রোটেশন লক মোডে থাকলে, ব্যবহারকারীরা তাদের স্ক্রিনকে সবচেয়ে উপরে থাকা, দৃশ্যমান অ্যাক্টিভিটির (বর্তমান সিস্টেম সংক্রান্ত সীমাবদ্ধতা) দ্বারা সমর্থিত যেকোনও রোটেশনে লক করতে পারবেন। সবচেয়ে উপরে থাকা অ্যাক্টিভিটি অটো-রোটেট মোডে একাধিক রোটেশনে রেন্ডার করা গেলে, রোটেশন লক করা মোডেও একই বিকল্প উপলভ্য থাকতে হবে, তবে অ্যাক্টিভিটির screenOrientation সেটিংয়ের উপর ভিত্তি করে কিছু ব্যতিক্রম থাকতে পারে।

ডিভাইস ঘোরানো হলে, নেভিগেশন বারে একটি বোতাম দেখানোর মাধ্যমে রোটেশন লক মোড কাজ করে পরিবর্তন হয়। এটি করতে, অটো-রোটেট বন্ধ থাকলেও ডিভাইসের ওরিয়েন্টেশন সেন্সরকে অ্যাক্টিভ থাকতে হবে। এই বোতামে ট্যাপ করলে ব্যবহারকারীর রোটেশন সংক্রান্ত পছন্দ (Settings.System.USER_ROTATION) সেট হয়ে যায়। WindowManager, সিস্টেমের রোটেশন পরিবর্তন করতে, টপ অ্যাক্টিভিটি ও সিস্টেম স্ট্যাটাস সংক্রান্ত অন্যান্য বিবরণের সাথে এই পছন্দ ব্যবহার করে। অন্য Activity-তে যাওয়ার সময় সিস্টেমকে কোন রোটেশনে রেন্ডার করা হবে তা ঠিক করার সময় WindowManager ব্যবহারকারীর রোটেশন প্রিফারেন্স ব্যবহার করা চালিয়ে যায়।

এই GIF-এ ল্যান্ডস্কেপ ওরিয়েন্টেশনে থাকা ফোন দেখানো হয়েছে, যার স্ক্রিন পোর্ট্রেট
       ওরিয়েন্টেশনে রয়েছে। ব্যবহারকারী ল্যান্ডস্কেপ মোডে স্ক্রিন ওরিয়েন্টেশন পরিবর্তন করতে চান কিনা তা জিজ্ঞাসা করার জন্য একটি আইকন দেখানো হয়।
ছবি ১. "হোম বোতামে উপরের দিকে সোয়াইপ করুন" জেসচার চালু করা থাকলে, রোটেট করার সাজেশন বোতাম

অ্যাক্টিভিটির মধ্যে পরিবর্তন করার সময় ব্যবহারকারীর রোটেশন সংক্রান্ত পছন্দ বজায় রাখতে হবে। তবে, যেহেতু বেশিরভাগ ফোন ব্যবহারকারী শুধুমাত্র অল্প, সাময়িক সময়ের জন্য ল্যান্ডস্কেপ মোডে থাকতে চান, তাই আমরা স্বাভাবিক ওরিয়েন্টেশন সংক্রান্ত পক্ষপাত যোগ করেছি। সিস্টেম রোটেশন ডিভাইসের স্বাভাবিক ওরিয়েন্টেশনে পরিবর্তিত হলে, ব্যবহারকারীর রোটেশন পছন্দ ডিভাইসের স্বাভাবিক ওরিয়েন্টেশনে রিসেট হয়ে যায়। বেশিরভাগ ফোনের ক্ষেত্রে, ডিভাইসের স্বাভাবিক ওরিয়েন্টেশন হল পোর্ট্রেট (০º)। ব্যবহারকারীর রোটেশন সংক্রান্ত পছন্দ রিসেট করার ঘটনাটি প্রায়ই ঘটে যখন শুধুমাত্র পোর্ট্রেট মোডে কাজ করে এমন অ্যাপ ব্যবহার করা হয়, ফোন লক করা হয় অথবা লঞ্চার ওয়ার্কস্পেসে ফিরে যাওয়া হয়।

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

সোর্স

Android 9-এ রোটেট করার সাজেশন সংক্রান্ত সহায়তা যোগ করা হয়েছে। বেশিরভাগ পরিবর্তন নিম্নলিখিত ফাইলের মধ্যে সীমাবদ্ধ।

  • services/.../server/policy/PhoneWindowManager.java:
    • WindowOrientationListener-এর আউটপুট ব্যবহারকারী হুক (MyOrientationListener, ডিভাইসটি ঘোরানো হয়েছে কিনা তা নির্ধারণ করতে সেন্সর মনিটর করার জন্য দায়ী)
    • অটো-রোটেট বন্ধ করা থাকলেও WindowOrientationListener চালু রাখে (needSensorRunningLp() দেখুন)
    • ব্যবহারকারীর দেওয়া রোটেট করার পছন্দ, সবচেয়ে উপরে থাকা অ্যাক্টিভিটি screenOrientation সেটিংস ও সিস্টেম স্ট্যাটাস (rotationForOrientationLw() দেখুন) অনুযায়ী সিস্টেমের রোটেশন গণনা করে
    • সবচেয়ে উপরের অ্যাক্টিভিটি প্রদত্ত রোটেশনে রোটেট করতে পারে কিনা তা নির্ধারণ করুন (দেখুন isRotationChoicePossible())
  • SystemUI/.../statusbar/phone/NavigationBarFragment:
    • PhoneWindowManager থেকে রোটেশন সাজেশন কলব্যাক করার সময় নেভিগেশন বার বোতাম দেখানো হবে কিনা তা নির্ধারণ করে (onRotationProposal() দেখুন)
    • কখন রোটেট নেভিগেশন বার বোতাম লুকানো হবে তা ম্যানেজ করে (দেখুন setRotateSuggestionButtonState(false))
    • বোতামের টাইম-আউট ম্যানেজ করে, এর মধ্যে বিশেষ কেসও পড়ে, যখন নেভবার লুকানো থাকে (সাধারণত ফুল স্ক্রিনে)
    • ডিভাইসের স্বাভাবিক অরিয়েন্টেশনে (mRotationWatcher) ফিরে এলে ব্যবহারকারীর পছন্দ রিসেট হয়ে যায়
    • ন্যাভবার বোতাম অ্যানিমেশনের জন্য উপযুক্ত স্টাইল বেছে নেয়, NavigationBarView-এ প্রয়োগ করা হয়েছে (onRotationProposal() দেখুন)
    • বিশেষ অ্যানিমেশন সহ ভূমিকা মোড লজিক যোগ করে (Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED-এর রেফারেন্স দেখুন )
    • disable2 রোটেশন ফ্ল্যাগ প্রয়োগ করে (disable() দেখুন)
  • SystemUI/.../statusbar/phone/NavigationBarView.java:
    • বাকি থাকা রোটেশনের সাথে ম্যাচ করার জন্য স্টাইল বোতামের আইকন অ্যানিমেশন (দেখুন updateRotateSuggestionButtonStyle())
    • বোতামের দৃশ্যমানতা সংক্রান্ত পরিবর্তন ম্যানেজ করে (দেখুন setRotateButtonVisibility()), এর মধ্যে রয়েছে নির্দিষ্ট অ্যাক্সেসিবিলিটি পরিষেবা চালু থাকলে রোটেট বোতাম লুকানোর লজিক (সবচেয়ে ডানদিকের নেভিগেশন বার বোতামের স্ট্যাক র‍্যাংকিংয়ের জন্য অ্যাকাউন্টিং)
  • SystemUI/res/layout/menu_ime.xml:
    • রোটেট বোতামের জন্য নতুন KeyButtonView অন্তর্ভুক্ত, মেনু ও IME/কীবোর্ড বেছে নেওয়ার বিকল্পের উপরে স্ট্যাক করা আছে, কিন্তু অ্যাক্সেসিবিলিটি বোতামের নিচে আছে
  • SystemUI/res/drawable/ic_sysbar_rotate_button.xml:
    • জটিল AnimatedVectorDrawable যা নেভিগেশন বার ঘোরানোর বোতাম অ্যানিমেট করতে ব্যবহার করা হয়
    • স্টাইলিং (SystemUI/res/values/styles.xml-এ) ব্যবহার করা হয় ঘূর্ণনের শুরুর ও শেষের কোণ সেট করতে যাতে একই ড্রয়েবলকে বিভিন্ন শুরুর ও শেষের ঘূর্ণন অ্যানিমেট করতে ব্যবহার করা যায়
    • TintedKeyButtonDrawable-এর মাধ্যমে আইকন টিন্টিং সেট করা হয়

প্রয়োগ

সফ্টওয়্যার নেভিগেশন কী (ফেরত, হোম ইত্যাদি) ব্যবহার করে এমন ডিভাইসের জন্য রোটেশন সাজেশন কাজ করানোর জন্য Android 9-এ সমস্ত প্রয়োজনীয় পরিবর্তন অন্তর্ভুক্ত রয়েছে।

যেসব ডিভাইস প্রস্তুতকারক হার্ডওয়্যার নেভিগেশন কী সহ ডিভাইস তৈরি করেন এবং এই ফিচার প্রয়োগ করতে চান, তাদের নিজস্ব সিস্টেম UI অ্যাফর্ডেন্স ডিজাইন ও প্রয়োগ করতে হবে অথবা ফিচারটি বন্ধ করে দিতে হবে। সাজেস্ট করা হয় যে, কোনও নতুন সারফেস বর্তমান সিস্টেমের রোটেশনের সাথে ৯০º বা ১৮০º কোণে ডিভাইসটি ধরে রাখলে সেটি যেন সহজে ব্যবহার করা যায় এবং দ্রুত অ্যাক্সেস করা যায়। এইসব কারণে, বিজ্ঞপ্তি ব্যবহার করার (যেমন IME/কীবোর্ড পিকারের জন্য করা হয়) সাজেশন দেওয়া হয় না।

এই ফিচার ব্যবহার করার জন্য হার্ডওয়্যার সংক্রান্ত প্রয়োজনীয়তা অটোমেটিক রোটেট ব্যবহার করার প্রয়োজনীয়তার মতোই।

ইমপ্লিমেন্টেশনের ধারাবাহিকতা বজায় রাখার জন্য এটি প্রয়োজনীয় যে অটো-রোটেট বন্ধ থাকাকালীন কোনও কারণে সিস্টেম ডিভাইসের স্বাভাবিক রোটেটেশনে পরিবর্তিত হলে ব্যবহারকারীর রোটেট করার পছন্দ (Settings.System.USER_ROTATION) ডিভাইসের স্বাভাবিক রোটেটেশনে রিসেট হয়ে যায়। প্রদত্ত ইমপ্লিমেন্টেশন এটি করে (দেখুন NavigationBarFragment.mRotationWatcher)।

ঘুরিয়ে-ফিরিয়ে দেখানোর সাজেশন সাময়িকভাবে বন্ধ করার জন্য StatusBarManager.disable2-এ একটি নতুন ফ্ল্যাগ আছে। StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS দেখুন। এই ফ্ল্যাগটি সমস্ত প্রয়োগে সম্মান করতে হবে কারণ এটি সেট-আপ উইজার্ড সহ গুরুত্বপূর্ণ সিস্টেম অ্যাপ দ্বারা ব্যবহৃত হয়। প্রদান করা ইমপ্লিমেন্টেশন এটি সাপোর্ট করে (দেখুন NavigationBarFragment.disable())।

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

কাস্টমাইজেশন

যেহেতু রোটেশন সাজেশন শুধুমাত্র রোটেশন লক করা মোডে (অটো-রোটেট বন্ধ) দেখা যায়, তাই ডিফল্ট হিসেবে অটো-রোটেট বন্ধ রাখার বিকল্প বেছে নিয়ে, নতুন ইনস্টলের জন্য ফিচারটি ডিফল্ট হিসেবে চালু থাকবে কিনা তা বেছে নেওয়া সম্ভব। ডিফল্ট পরিবর্তন করতে def_accelerometer_rotation-এ SettingsProvider/res/values/defaults.xml দেখুন।

'দ্রুত সেটিংস' বা 'ডিসপ্লে সেটিংস' থেকে রোটেট টাইল ব্যবহার করে ব্যবহারকারীরা সহজেই অটো-রোটেট চালু আছে কিনা তা পরিবর্তন করতে পারবেন (ডিফল্ট যাই হোক না কেন) ।

যাচাইকরণ

পরীক্ষা করার জন্য, গেটিং Settings.Secure ভ্যালু পরিবর্তন করে ফিচারটি বন্ধ ও চালু করা যেতে পারে। এটি সবচেয়ে সহজে করার উপায় হল, বিশেষ সুবিধা প্রাপ্ত adb ইনস্ট্যান্স থেকে নিম্নলিখিত কমান্ডটি চালানো:

adb shell settings put secure show_rotation_suggestions <x>

বন্ধ করার জন্য x-এর মান 0 এবং চালু করার জন্য 1 হিসেবে সেট করুন।

টেস্টিংয়ের জন্য, সংশ্লিষ্ট Settings.Secure ভ্যালু পরিবর্তন করে ইন্ট্রোডাকশন মোড রিসেট করা যেতে পারে। এটি সবচেয়ে সহজে করা যায়, যদি প্রিভিলেজড adb ইনস্ট্যান্স থেকে নিম্নলিখিত কমান্ড রান করা হয়:

adb shell settings put secure num_rotation_suggestions_accepted 0