1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.intentresolver.contentpreview 18 19 import android.content.Context 20 import android.util.PluralsMessageFormatter 21 import androidx.annotation.StringRes 22 import com.android.intentresolver.R 23 import dagger.Binds 24 import dagger.Module 25 import dagger.hilt.InstallIn 26 import dagger.hilt.android.qualifiers.ApplicationContext 27 import dagger.hilt.components.SingletonComponent 28 import javax.inject.Inject 29 30 private const val PLURALS_COUNT = "count" 31 32 /** 33 * HeadlineGenerator generates the text to show at the top of the sharesheet as a brief description 34 * of the content being shared. 35 */ 36 class HeadlineGeneratorImpl 37 @Inject 38 constructor( 39 @ApplicationContext private val context: Context, 40 ) : HeadlineGenerator { getTextHeadlinenull41 override fun getTextHeadline(text: CharSequence): String { 42 return context.getString( 43 getTemplateResource(text, R.string.sharing_link, R.string.sharing_text) 44 ) 45 } 46 getAlbumHeadlinenull47 override fun getAlbumHeadline(): String { 48 return context.getString(R.string.sharing_album) 49 } 50 getImagesWithTextHeadlinenull51 override fun getImagesWithTextHeadline(text: CharSequence, count: Int): String { 52 return getPluralString( 53 getTemplateResource( 54 text, 55 R.string.sharing_images_with_link, 56 R.string.sharing_images_with_text 57 ), 58 count 59 ) 60 } 61 getVideosWithTextHeadlinenull62 override fun getVideosWithTextHeadline(text: CharSequence, count: Int): String { 63 return getPluralString( 64 getTemplateResource( 65 text, 66 R.string.sharing_videos_with_link, 67 R.string.sharing_videos_with_text 68 ), 69 count 70 ) 71 } 72 getFilesWithTextHeadlinenull73 override fun getFilesWithTextHeadline(text: CharSequence, count: Int): String { 74 return getPluralString( 75 getTemplateResource( 76 text, 77 R.string.sharing_files_with_link, 78 R.string.sharing_files_with_text 79 ), 80 count 81 ) 82 } 83 getImagesHeadlinenull84 override fun getImagesHeadline(count: Int): String { 85 return getPluralString(R.string.sharing_images, count) 86 } 87 getVideosHeadlinenull88 override fun getVideosHeadline(count: Int): String { 89 return getPluralString(R.string.sharing_videos, count) 90 } 91 getFilesHeadlinenull92 override fun getFilesHeadline(count: Int): String { 93 return getPluralString(R.string.sharing_files, count) 94 } 95 getNotItemsSelectedHeadlinenull96 override fun getNotItemsSelectedHeadline(): String = 97 context.getString(R.string.select_items_to_share) 98 99 private fun getPluralString(@StringRes templateResource: Int, count: Int): String { 100 return PluralsMessageFormatter.format( 101 context.resources, 102 mapOf(PLURALS_COUNT to count), 103 templateResource 104 ) 105 } 106 107 @StringRes getTemplateResourcenull108 private fun getTemplateResource( 109 text: CharSequence, 110 @StringRes linkResource: Int, 111 @StringRes nonLinkResource: Int 112 ): Int { 113 return if (text.toString().isHttpUri()) linkResource else nonLinkResource 114 } 115 } 116 117 @Module 118 @InstallIn(SingletonComponent::class) 119 interface HeadlineGeneratorModule { bindnull120 @Binds fun bind(impl: HeadlineGeneratorImpl): HeadlineGenerator 121 } 122