জটিলতার তথ্য প্রকাশ করুন

জটিল ডেটা উত্সগুলি মুখের জটিলতাগুলি ঘড়ির জন্য তথ্য প্রকাশ করে, পাঠ্য, চিত্র এবং সংখ্যা সরবরাহ করে যা ঘড়ির মুখ রেন্ডার করতে পারে৷

একটি ডাটা সোর্স সার্ভিস SuspendingComplicationDataSourceService সার্ভিসকে প্রসারিত করে কার্যকর তথ্য সরাসরি ঘড়ির মুখে পৌঁছে দিতে।

শুরু হচ্ছে

আপনার অ্যাপ মডিউলে নিম্নলিখিত নির্ভরতা যোগ করুন:

dependencies {
  implementiation("androidx.wear.watchface:watchface-complications-data-source-ktx:1.2.1")
}

ডেটা উৎস পরিষেবা তৈরি করুন

যখন জটিল ডেটার প্রয়োজন হয়, তখন Wear OS সিস্টেম আপনার ডেটা উৎসে আপডেটের অনুরোধ পাঠায়। আপডেটের অনুরোধে সাড়া দিতে, আপনার ডেটা সোর্সকে অবশ্যই SuspendingComplicationDataSourceService সার্ভিস ক্লাসের onComplicationRequest() পদ্ধতি প্রয়োগ করতে হবে।

Wear OS সিস্টেম আপনার সোর্স থেকে ডেটার প্রয়োজন হলে onComplicationRequest() কল করে—উদাহরণস্বরূপ, যখন আপনার ডেটা সোর্স ব্যবহার করে কোনো জটিলতা সক্রিয় হয় বা যখন একটি নির্দিষ্ট পরিমাণ সময় চলে যায়।

দ্রষ্টব্য: যখন আপনার ডেটা উত্স ডেটা সরবরাহ করে, তখন ঘড়ির মুখটি কাঁচা মানগুলি গ্রহণ করে৷ ঘড়ির মুখ প্রদর্শনের জন্য ডেটা ফর্ম্যাট করার জন্য দায়ী।

নিম্নলিখিত কোড স্নিপেট একটি নমুনা বাস্তবায়ন দেখায়:

class MyComplicationDataSourceService : SuspendingComplicationDataSourceService() {
    override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationData? {
        // Retrieve the latest info for inclusion in the data.
        val text = getLatestData()
        return shortTextComplicationData(text)
    }

    override fun getPreviewData(type: ComplicationType): ComplicationData? {
        return shortTextComplicationData("Event 1")
    }

    private fun shortTextComplicationData(text: String) =
        ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text).build(),
            contentDescription = PlainComplicationText.Builder(text).build()
        )
            // Add further optional details here such as icon, tap action, and title.
            .build()

    // ...
}

ম্যানিফেস্ট ঘোষণা এবং অনুমতি

Android সিস্টেমের দ্বারা ডেটা উত্স হিসাবে গণ্য করার জন্য ডেটা উত্সগুলিকে অবশ্যই তাদের অ্যাপ ম্যানিফেস্টে নির্দিষ্ট ঘোষণা অন্তর্ভুক্ত করতে হবে৷ এই বিভাগটি ডেটা উত্সগুলির জন্য প্রয়োজনীয় সেটিংস ব্যাখ্যা করে৷

আপনার অ্যাপের ম্যানিফেস্টে, পরিষেবাটি ঘোষণা করুন এবং একটি আপডেট অনুরোধ অ্যাকশন ইন্টেন্ট ফিল্টার যোগ করুন। ম্যানিফেস্টকে অবশ্যই BIND_COMPLICATION_PROVIDER অনুমতি যোগ করে পরিষেবাটিকে সুরক্ষিত করতে হবে যাতে শুধুমাত্র Wear OS সিস্টেমই প্রদানকারী পরিষেবার সাথে আবদ্ধ হতে পারে।

এছাড়াও, service উপাদানে একটি android:icon বৈশিষ্ট্য অন্তর্ভুক্ত করুন যা একটি একক রঙের সাদা আইকন প্রদান করে। আমরা আইকনগুলির জন্য ভেক্টর অঙ্কনযোগ্য সুপারিশ করি। আইকনটি ডেটা উৎসের প্রতিনিধিত্ব করে এবং জটিলতা বাছাইকারীতে দেখানো হয়।

এখানে একটি উদাহরণ:

<service
    android:name=".snippets.complication.MyComplicationDataSourceService"
    android:exported="true"
    android:label="@string/my_complication_service_label"
    android:icon="@drawable/complication_icon"
    android:permission="com.google.android.wearable.permission.BIND_COMPLICATION_PROVIDER">
    <intent-filter>
        <action android:name="android.support.wearable.complications.ACTION_COMPLICATION_UPDATE_REQUEST" />
    </intent-filter>

    <!-- Supported types should be comma-separated, for example: "SHORT_TEXT,SMALL_IMAGE" -->
    <meta-data
        android:name="android.support.wearable.complications.SUPPORTED_TYPES"
        android:value="SHORT_TEXT" />
    <meta-data
        android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS"
        android:value="300" />

    <!-- Optionally, specify a configuration activity, where the user can configure your complication. -->
    <meta-data
        android:name="android.support.wearable.complications.PROVIDER_CONFIG_ACTION"
        android:value="MY_CONFIG_ACTION" />

</service>

মেটাডেটা উপাদান

আপনার ম্যানিফেস্ট ফাইলে, নিম্নলিখিত মেটাডেটা উপাদানগুলি লক্ষ্য করুন:

  • android:name="android.support.wearable.complications.SUPPORTED_TYPES" : ডেটা উত্স সমর্থন করে এমন জটিলতা ডেটার প্রকারগুলি নির্দিষ্ট করে৷
  • android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS" : ডেটার আপডেটের জন্য সিস্টেমের কত ঘন ঘন পরীক্ষা করা উচিত তা নির্দিষ্ট করে৷

যখন আপনার জটিলতা ডেটা ডেটা উত্স সক্রিয় থাকে, UPDATE_PERIOD_SECONDS নির্দিষ্ট করে যে আপনি কত ঘন ঘন সিস্টেম ডেটার আপডেটগুলি পরীক্ষা করতে চান৷ যদি জটিলতায় দেখানো তথ্যের নিয়মিত সময়সূচীতে আপডেট করার প্রয়োজন না হয়, যেমন আপনি যখন পুশ আপডেট ব্যবহার করছেন, তাহলে এই মানটি 0 এ সেট করুন।

আপনি যদি UPDATE_PERIOD_SECONDS 0 -এ সেট না করেন, তাহলে ডিভাইসের ব্যাটারি লাইফ সংরক্ষণ করতে আপনাকে অবশ্যই কমপক্ষে 300 (5 মিনিট) এর মান ব্যবহার করতে হবে, যা সিস্টেম প্রয়োগ করে সর্বনিম্ন আপডেট সময়কাল। এছাড়াও, মনে রাখবেন যে ডিভাইসটি যখন পরিবেষ্টিত মোডে থাকে বা পরিধান করা হয় না তখন আপডেটের অনুরোধ কম আসে।

একটি কনফিগারেশন কার্যকলাপ যোগ করুন

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

উদাহরণ ম্যানিফেস্টে PROVIDER_CONFIG_ACTION কী সহ একটি meta-data উপাদান রয়েছে৷ এই উপাদানটির মান হল সেই কর্ম যা কনফিগারেশন কার্যকলাপ চালু করতে ব্যবহৃত হয়।

কনফিগারেশন অ্যাক্টিভিটি তৈরি করুন এবং আপনার ম্যানিফেস্ট ফাইলে এটির জন্য অ্যাকশনের সাথে মেলে এমন একটি ইন্টেন্ট ফিল্টার যোগ করুন।

<intent-filter>
    <action android:name="MY_CONFIG_ACTION" />
    <category android:name="android.support.wearable.complications.category.PROVIDER_CONFIG" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

কার্যকলাপটি ক্রিয়াকলাপের onCreate() পদ্ধতির মধ্যে অভিপ্রায় থেকে কনফিগার করা জটিলতার স্লটটির বিশদ বিবরণ পেতে পারে:

// Keys defined on ComplicationDataSourceService
val id = intent.getIntExtra(EXTRA_CONFIG_COMPLICATION_ID, -1)
val type = intent.getIntExtra(EXTRA_CONFIG_COMPLICATION_TYPE, -1)
val source = intent.getStringExtra(EXTRA_CONFIG_DATA_SOURCE_COMPONENT)

কনফিগারেশন কার্যকলাপ প্রদানকারী হিসাবে একই প্যাকেজ থাকা আবশ্যক. ডেটা উত্স সেট করা উচিত কিনা তা সিস্টেমকে জানাতে কনফিগারেশন কার্যকলাপটি RESULT_OK বা RESULT_CANCELED ফেরত দিতে হবে:

setResult(RESULT_OK) // Or RESULT_CANCELED to cancel configuration
finish()

পুশ আপডেট ব্যবহার করুন

আপনার অ্যাপের ম্যানিফেস্টে একটি আপডেটের ব্যবধান নির্দিষ্ট করার বিকল্প হিসেবে, আপনি গতিশীলভাবে আপডেটগুলি শুরু করতে ComplicationDataSourceUpdateRequester এর একটি উদাহরণ ব্যবহার করতে পারেন। একটি আপডেটের অনুরোধ করতে, requestUpdate() কল করুন।

সতর্কতা: ডিভাইসের ব্যাটারি লাইফ সংরক্ষণ করতে, আপনার ComplicationDataSourceUpdateRequester এর উদাহরণ থেকে গড়ে প্রতি 5 মিনিটের বেশি বার requestUpdate() কল করবেন না।

সময়-নির্ভর মান প্রদান করুন

কিছু জটিলতা বর্তমান সময়ের সাথে সম্পর্কিত একটি মান প্রদর্শন করতে হবে। উদাহরণগুলির মধ্যে বর্তমান তারিখ, পরবর্তী মিটিং পর্যন্ত সময় বা অন্য সময় অঞ্চলের সময় অন্তর্ভুক্ত রয়েছে।

সেই মানগুলি আপ টু ডেট রাখতে প্রতি সেকেন্ড বা মিনিটে একটি জটিলতা আপডেট করবেন না। পরিবর্তে, সময়-নির্ভর পাঠ্য ব্যবহার করে বর্তমান তারিখ বা সময়ের সাথে সম্পর্কিত মানগুলি নির্দিষ্ট করুন। নিম্নলিখিত ক্লাসগুলি আপনাকে এই সময়-নির্ভর মানগুলি তৈরি করতে দেয়:

টাইমলাইন ডেটা

জটিল ডেটা উত্সগুলির জন্য যা পূর্ব-নির্ধারিত সময়ে মানগুলির একটি ক্রম প্রদান করে, SuspendingTimelineComplicationDataSourceService ব্যবহার করুন।

এর একটি উদাহরণ একটি ক্যালেন্ডার অ্যাপ থেকে একটি "পরবর্তী ইভেন্ট" ডেটা উত্স হতে পারে: সিস্টেমকে পরবর্তী ইভেন্টের জন্য নিয়মিতভাবে ডেটা উত্সটি পোল করার পরিবর্তে, ডেটা উত্স একবার ইভেন্টগুলির একটি সময়রেখা প্রদান করতে পারে এবং তারপর ক্যালেন্ডার পরিবর্তন হলে ডেটা উত্স আপডেটগুলি শুরু করতে পারে৷ এটি সিস্টেমে লোড কমিয়ে দেয় এবং জটিলতাকে সময়মত সঠিক ঘটনাটি দেখাতে দেয়:

class MyTimelineComplicationDataSourceService : SuspendingTimelineComplicationDataSourceService() {
    override suspend fun onComplicationRequest(request: ComplicationRequest): ComplicationDataTimeline? {
        if (request.complicationType != ComplicationType.SHORT_TEXT) {
            return ComplicationDataTimeline(
                defaultComplicationData = NoDataComplicationData(),
                timelineEntries = emptyList()
            )
        }
        // Retrieve list of events from your own datasource / database.
        val events = getCalendarEvents()
        return ComplicationDataTimeline(
            defaultComplicationData = shortTextComplicationData("No event"),
            timelineEntries = events.map {
                TimelineEntry(
                    validity = TimeInterval(it.start, it.end),
                    complicationData = shortTextComplicationData(it.name)
                )
            }
        )
    }

    override fun getPreviewData(type: ComplicationType): ComplicationData? {
        return shortTextComplicationData("Event 1")
    }

    private fun shortTextComplicationData(text: String) =
        ShortTextComplicationData.Builder(
            text = PlainComplicationText.Builder(text).build(),
            contentDescription = PlainComplicationText.Builder(text).build()
        )
            // Add further optional details here such as icon, tap action, title etc
            .build()

    // ...
}

SuspendingTimelineComplicationDataSourceService এর আচরণ নিম্নরূপ:

  • যখন বর্তমান সময় টাইমলাইনে একটি এন্ট্রির শুরু এবং শেষ সময়ের মধ্যে পড়ে, তখন ঘড়ির মুখ সেই মানটি ব্যবহার করে।
  • যখন বর্তমান সময় টাইমলাইনের কোনো এন্ট্রির মধ্যে পড়ে না, তখন ডিফল্ট মান ব্যবহার করা হয়। উদাহরণস্বরূপ, ক্যালেন্ডার অ্যাপে, এটি "কোন ইভেন্ট নয়" হতে পারে।
  • বর্তমান সময় একাধিক ইভেন্টের মধ্যে পড়লে, সংক্ষিপ্ত ইভেন্ট ব্যবহার করা হয়।

গতিশীল মান প্রদান

Wear OS 4 থেকে শুরু করে, কিছু জটিলতা এমন মানগুলি প্রদর্শন করতে পারে যা প্ল্যাটফর্মে সরাসরি উপলব্ধ মানগুলির উপর ভিত্তি করে আরও ঘন ঘন রিফ্রেশ করে। আপনার জটিলতায় এই ক্ষমতা প্রদান করতে, ComplicationData ক্ষেত্রগুলি ব্যবহার করুন যা গতিশীল মানগুলি গ্রহণ করে। প্ল্যাটফর্মটি এই মানগুলিকে প্রায়শই মূল্যায়ন করে এবং আপডেট করে, জটিলতা প্রদানকারীকে চালু করার প্রয়োজন ছাড়াই।

উদাহরণ ক্ষেত্রগুলির মধ্যে রয়েছে GoalProgressComplicationData এর গতিশীল মান ক্ষেত্র এবং DynamicComplicationText , যেটি যেকোন ComplicationText ক্ষেত্রে ব্যবহার করা যেতে পারে। এই গতিশীল মানগুলি androidx.wear.protolayout.expression লাইব্রেরির উপর ভিত্তি করে।

নির্দিষ্ট পরিস্থিতিতে, প্ল্যাটফর্ম গতিশীল মানগুলি মূল্যায়ন করতে পারে না:

  • গতিশীল মান কখনও কখনও উপলব্ধ হয় না: এটি ঘটে, উদাহরণস্বরূপ, যখন ডিভাইসটি কব্জি বন্ধ থাকে৷ এই পরিস্থিতিতে, প্ল্যাটফর্মটি একটি NoDataComplicationData এর স্থানধারক ক্ষেত্রের পরিবর্তে গতিশীল মান অবৈধকরণ ফলব্যাক ক্ষেত্রের মান ব্যবহার করে।
  • ডায়নামিক মান কখনই পাওয়া যায় না: এটি এমন একটি ডিভাইসে ঘটে যা Wear OS 4 এর পুরানো রিলিজে চলছে। এই পরিস্থিতিতে, প্ল্যাটফর্মটি একটি সহচর ফলব্যাক ক্ষেত্র ব্যবহার করে, যেমন getFallbackValue ()