diff --git a/app/src/husky/res/values/strings.xml b/app/src/husky/res/values/strings.xml index 2ef938cc..6a5caeab 100644 --- a/app/src/husky/res/values/strings.xml +++ b/app/src/husky/res/values/strings.xml @@ -36,6 +36,9 @@ Notifications about new chat messages Other + Privacy + + Anonymize uploaded file names Live notifications May slightly increase power consumption Default formatting syntax(if supported by instance) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/chat/ChatActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/chat/ChatActivity.kt index fd2db9e0..58f8e435 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/chat/ChatActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/chat/ChatActivity.kt @@ -58,6 +58,7 @@ import com.keylesspalace.tusky.repository.Placeholder import com.keylesspalace.tusky.repository.TimelineRequestMode import com.keylesspalace.tusky.service.MessageToSend import com.keylesspalace.tusky.service.ServiceClient +import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.* import com.keylesspalace.tusky.view.EmojiKeyboard import com.mikepenz.iconics.IconicsDrawable @@ -207,6 +208,7 @@ class ChatActivity: BottomSheetActivity(), val preferences = PreferenceManager.getDefaultSharedPreferences(this) viewModel.tryFetchStickers = preferences.getBoolean("stickers", false) + viewModel.anonymizeNames = preferences.getBoolean(PrefKeys.ANONYMIZE_FILENAMES, false) setupHeader() setupChat() diff --git a/app/src/main/java/com/keylesspalace/tusky/components/common/CommonComposeViewModel.kt b/app/src/main/java/com/keylesspalace/tusky/components/common/CommonComposeViewModel.kt index 6c3e7501..d927dea7 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/common/CommonComposeViewModel.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/common/CommonComposeViewModel.kt @@ -52,6 +52,7 @@ open class CommonComposeViewModel( protected val stickers: MutableLiveData> = MutableLiveData(emptyArray()) val haveStickers: MutableLiveData = MutableLiveData(false) var tryFetchStickers = false + var anonymizeNames = true var hasNoAttachmentLimits = false val instanceParams: LiveData = instance.map { instance -> @@ -162,7 +163,7 @@ open class CommonComposeViewModel( && mediaItems[0].type == QueuedMedia.Type.IMAGE) { throw VideoOrImageException() } else { - addMediaToQueue(type, uri, size, filename ?: "unknown") + addMediaToQueue(type, uri, size, filename ?: "unknown", anonymizeNames) } } .subscribe({ queuedMedia -> @@ -174,9 +175,9 @@ open class CommonComposeViewModel( return liveData } - private fun addMediaToQueue(type: Int, uri: Uri, mediaSize: Long, filename: String): QueuedMedia { + private fun addMediaToQueue(type: Int, uri: Uri, mediaSize: Long, filename: String, anonymizeNames: Boolean): QueuedMedia { val mediaItem = QueuedMedia(System.currentTimeMillis(), uri, type, mediaSize, filename, - hasNoAttachmentLimits) + hasNoAttachmentLimits, anonymizeNames) val imageLimit = instanceMetadata.value?.videoLimit ?: STATUS_VIDEO_SIZE_LIMIT val videoLimit = instanceMetadata.value?.imageLimit ?: STATUS_IMAGE_SIZE_LIMIT @@ -210,7 +211,7 @@ open class CommonComposeViewModel( protected fun addUploadedMedia(id: String, type: Int, uri: Uri, description: String?) { val mediaItem = QueuedMedia(System.currentTimeMillis(), uri, type, 0, "unknown", - hasNoAttachmentLimits, -1, id, description) + hasNoAttachmentLimits, anonymizeNames, -1, id, description) media.value = media.value!! + mediaItem } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/common/MediaUploader.kt b/app/src/main/java/com/keylesspalace/tusky/components/common/MediaUploader.kt index 652adef1..648b10ec 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/common/MediaUploader.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/common/MediaUploader.kt @@ -46,10 +46,10 @@ sealed class UploadEvent { data class FinishedEvent(val attachment: Attachment) : UploadEvent() } -fun createNewImageFile(context: Context): File { +fun createNewImageFile(context: Context, name: String = "Photo"): File { // Create an image file name - val randomId = randomAlphanumericString(12) - val imageFileName = "Tusky_${randomId}_" + val randomId = randomAlphanumericString(4) + val imageFileName = "${name}_${randomId}" val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) return File.createTempFile( imageFileName, /* prefix */ @@ -164,7 +164,8 @@ class MediaUploaderImpl( private fun upload(media: QueuedMedia): Observable { return Observable.create { emitter -> var (mimeType, fileExtension) = getMimeTypeAndSuffixFromFilenameOrUri(media.uri, media.originalFileName) - val filename = String.format("%s_%s_%s%s", + val filename = if(!media.anonymizeFileName) media.originalFileName else + String.format("%s_%s_%s%s", context.getString(R.string.app_name), Date().time.toString(), randomAlphanumericString(10), @@ -199,7 +200,7 @@ class MediaUploaderImpl( } private fun downsize(media: QueuedMedia, imageLimit: Long): QueuedMedia { - val file = createNewImageFile(context) + val file = createNewImageFile(context, media.originalFileName) DownsizeImageTask.resize(arrayOf(media.uri), imageLimit, context.contentResolver, file) return media.copy(uri = file.toUri(), mediaSize = file.length()) } diff --git a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt index 6e869ee5..cc22ccd1 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/compose/ComposeActivity.kt @@ -80,6 +80,7 @@ import com.keylesspalace.tusky.entity.Attachment import com.keylesspalace.tusky.entity.Emoji import com.keylesspalace.tusky.entity.NewPoll import com.keylesspalace.tusky.entity.Status +import com.keylesspalace.tusky.settings.PrefKeys import com.keylesspalace.tusky.util.* import com.keylesspalace.tusky.view.EmojiKeyboard import com.mikepenz.iconics.IconicsDrawable @@ -148,6 +149,7 @@ class ComposeActivity : BaseActivity(), val activeAccount = accountManager.activeAccount ?: return viewModel.tryFetchStickers = preferences.getBoolean("stickers", false) + viewModel.anonymizeNames = preferences.getBoolean(PrefKeys.ANONYMIZE_FILENAMES, false) setupAvatar(preferences, activeAccount) val mediaAdapter = MediaPreviewAdapter( this, @@ -1269,6 +1271,7 @@ class ComposeActivity : BaseActivity(), val mediaSize: Long, val originalFileName: String, val noChanges: Boolean = false, + val anonymizeFileName: Boolean = false, val uploadPercent: Int = 0, val id: String? = null, val description: String? = null diff --git a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt index 5fa6bb39..c14e9d9e 100644 --- a/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/fragment/preference/PreferencesFragment.kt @@ -176,6 +176,15 @@ class PreferencesFragment : PreferenceFragmentCompat() { } } + preferenceCategory(R.string.pref_title_privacy) { + switchPreference { + setDefaultValue(false) + key = PrefKeys.ANONYMIZE_FILENAMES + setTitle(R.string.pref_title_anonymize_upload_filenames) + isSingleLineTitle = false + } + } + preferenceCategory(R.string.pref_title_browser_settings) { switchPreference { setDefaultValue(false) diff --git a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt index 3abc4a28..236962a8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt +++ b/app/src/main/java/com/keylesspalace/tusky/settings/SettingsConstants.kt @@ -32,6 +32,7 @@ object PrefKeys { const val ENABLE_SWIPE_FOR_TABS = "enableSwipeForTabs" const val BIG_EMOJIS = "bigEmojis" const val STICKERS = "stickers" + const val ANONYMIZE_FILENAMES = "anonymizeFilenames" const val CUSTOM_TABS = "customTabs" diff --git a/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt b/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt index 43f05e9c..3b1e0fd9 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/MediaUtils.kt @@ -36,7 +36,7 @@ import java.util.Locale * Helper methods for obtaining and resizing media files */ private const val TAG = "MediaUtils" -private const val MEDIA_TEMP_PREFIX = "Tusky_Share_Media" +private const val MEDIA_TEMP_PREFIX = "Share_Media" const val MEDIA_SIZE_UNKNOWN = -1L /**