ডিসপ্লে-নির্দিষ্ট এইসব জায়গায় করা আপডেট নিচে দেওয়া হল:
ডিফল্ট নয় এমন ডিসপ্লেতে রান করা অ্যাপের জন্য Android 10-এ সফ্টওয়্যার কীবোর্ড কাজ করে।
ডিফল্ট নয় এমন ডিসপ্লেতে অ্যাপ চলছে
কোন ডিসপ্লেতে ইনপুট মেথড এডিটরের (IME) সফ্টওয়্যার কীবোর্ড দেখানো হবে, সেই ব্যাপারে বিভিন্ন মোড আছে। সফ্টওয়্যার কীবোর্ড এখানে দেখানো হয়:
- একই ডিসপ্লে যেখানে ফোকাস করা অ্যাপ দেখা যায়।
- ফোকাস করা অ্যাপটি নন-ডিফল্ট ডিসপ্লেতে চলাকালীন ডিফল্ট ডিসপ্লে।
- কোনও ডিসপ্লে নেই।
যে ডিসপ্লেতে ফোকাস করা অ্যাপ দেখা যায় সেটির সেটিংসের উপর ভিত্তি করে কোন মোড ব্যবহার করতে হবে তা সিস্টেম নির্ধারণ করে। আরও জানতে, দেখুন:
WindowManager#setDisplayImePolicy()WindowManager#getDisplayImePolicy()

ছবি ১. টার্গেট অ্যাপ সহ সেকেন্ডারি ডিসপ্লেতে যেমন দেখা যায়, তেমন IME সফ্টওয়্যার কীবোর্ড
সিস্টেম একটি IME ব্যবহার করে, কিন্তু ব্যবহারকারীর ফোকাস অনুসরণ করতে ডিসপ্লেগুলির মধ্যে পরিবর্তন করতে পারে। Android 10 অটোমেটিক আশা করে যে সব ফার্স্ট-পার্টি ও থার্ড-পার্টি IME তৈরি করার সময় নতুন ডিসপ্লে সাইজ অনুযায়ী লেআউট রিভাইজ ও সাইজ পরিবর্তন করবে।
ডিসপ্লে A-তে অ্যাক্টিভ কানেকশন থাকলে এবং ইনপুট ফিল্ড ডিসপ্লে B-তে ইনপুট ফোকাসের অনুরোধ করলে, নিম্নলিখিত ফ্লো ঘটে:
- ডিসপ্লে 'খ'-এর ইনপুট ফিল্ড থেকে একটি নতুন ইনপুট কানেকশন আসে।
InputMethodManagerServiceচেক করে দেখে যে কানেকশনটি অনুমোদন করা উচিত কিনা।- IME-এর জন্য একটি ডিসপ্লে বেছে নেওয়া হয়। ডিসপ্লে 'খ' IME দেখাতে পারলে এবং সেটি দেখানোর অনুমতি থাকলে, 'খ' ব্যবহার করা হয়। অন্যথায়, প্রাথমিক ডিভাইসের ডিসপ্লে বেছে নেওয়া হয়।
- বেছে নেওয়া ডিসপ্লেটি ডিসপ্লে 'ক' থেকে না হলে, কানেকশন আবার
স্থাপন করা হয়।
InputMethodServiceনষ্ট করে আবার তৈরি করা হয়েছে।
নিরাপত্তা সংক্রান্ত বিধিনিষেধ
সিস্টেমের মালিকানাধীন নয় এমন ভার্চুয়াল ডিসপ্লেতে সিস্টেম IME দেখাবে না। এটি একটি নিরাপত্তা সংক্রান্ত উদ্বেগের কারণে হয়, কারণ কোনও ক্ষতিকারক অ্যাপ সিস্টেম ডেকোরেশন সাপোর্ট চালু করে ভার্চুয়াল ডিসপ্লে তৈরি করতে পারে এবং সারফেস থেকে ব্যবহারকারীর সংবেদনশীল তথ্য পড়তে পারে, যেমন টাইপিং প্রেডিকশন এবং কাস্টম ব্যাকগ্রাউন্ড।
প্রয়োগ
Android 9 (এবং তার আগের ভার্সনে), IME শুধুমাত্র ডিফল্ট স্ক্রিনে উপলভ্য ছিল, যেমন অন-স্ক্রিন ইনপুট পদ্ধতিতে বর্ণনা করা হয়েছে। Android 10 (এবং তার পরবর্তী ভার্সনে), একজন ব্যবহারকারী ফোকাস পরিবর্তন করে বিভিন্ন ডিসপ্লেতে বিভিন্ন ইনপুট টেক্সট ফিল্ডের মধ্যে পরিবর্তন করতে পারেন, এবং IME উইন্ডো সেকেন্ডারি ডিসপ্লেতে চলে যায়।
IME স্টেট ম্যানেজ করার জন্য WindowManager-এ প্রয়োগ করা পদ্ধতি ইনপুট পদ্ধতি
উইন্ডো (IME উইন্ডো যেখানে সফট কীবোর্ড আঁকা হয়) এবং ইনপুট পদ্ধতি
টার্গেট (যে উইন্ডোতে IME ইনপুট যায়) ট্র্যাক করে।
InputMethodManagerService (IMMS)-এর জন্য, অন্য কোনও বিল্ট-ইন মেকানিজম
InputMethodService (IMS)-এ ডিসপ্লে পরিবর্তন প্রচার করতে পারে না এবং
অন্য ডিসপ্লেতে ফোকাস সরানোর সময় রানটাইমে কীবোর্ড লেআউট আবার কনফিগার করতে পারে না।
ডিসপ্লের মধ্যে IME উইন্ডো পাল্টানোর জন্য, Android 10 নিম্নলিখিতগুলি প্রয়োগ করে:
- IME এবং ইনপুট টার্গেট উইন্ডো এখন
DisplayContent#mInputMethodWindowএবংDisplayContent#mInputMethodTargetঅনুযায়ী প্রতিটি ডিসপ্লেতে ট্র্যাক করা হয়, যাতে WindowManager (WM) প্রতিটি ডিসপ্লে থেকে আলাদাভাবে IME ফোকাস স্টেট ম্যানেজ করতে পারে। - IMMS-এর ক্ষেত্রে, এক্সটার্নাল ডিসপ্লে থেকে অ্যাপ ক্লায়েন্টের ফোকাস সংক্রান্ত অনুরোধ
ViewRootImpl#handleWindowFocusChanged -> InputMethodManager#onPostWindowFocus -> IMMS#startInputOrWindowGainedFocus-এর মাধ্যমে পাওয়া গেলে, এটি প্রথমে বর্তমান ইনপুট পদ্ধতি পরিষেবা আনবাইন্ড করে এবং তারপরেonServiceConnected()-এ এক্সটার্নাল ডিসপ্লের জন্য নতুন IME উইন্ডো টোকেন আবার অ্যাটাচ করতে পরিষেবাটি আবার বাইন্ড করে। - IMS-এর দিকে,
IMS#attachTokenপাওয়ার পরে, নিম্নলিখিত ফ্লো ঘটে:InputMethodService#attachToken()-এ সার্ভিস কনটেক্সটের ডিসপ্লে আপডেট করার জন্যContextImpl#updateDisplay-কে কল করা হয়। বর্তমান প্রসঙ্গ চেক করে কীবোর্ডের লেআউট রিভাইজ করতে এবং টার্গেট ডিসপ্লেতে মানিয়ে নিতেViewGroup#addView()এই কল করা হয়।DisplayContent#setInputMethodWindowLocked()কল করার পরে, ইমপ্লিমেন্টেশন, রিসোর্স ওভাররাইড করতে এবং মেট্রিক দেখাতে IME প্রসেসেWindowProcessControllerব্যবহার করে প্রসেস-লেভেল ডিসপ্লে কনফিগারেশন পরিবর্তন পাঠায়।onConfigurationChanged()এবং ইনপুট ভিউ আবার চালু করার জন্যViewGroup#addView()কল করার পরেInputMethodServiceক্লায়েন্ট সঠিক ডিসপ্লে মেট্রিক্স সহ সঠিক কনফিগারেশন পায়।