diff options
author | Kazuki Yamaguchi <k@rhe.jp> | 2017-10-27 19:12:16 +0900 |
---|---|---|
committer | Kazuki Yamaguchi <k@rhe.jp> | 2017-10-27 19:12:16 +0900 |
commit | d784297e8e245a9451b53191b7ff53243ee43f57 (patch) | |
tree | 33df57d6d4f4c2593ba66ae7b371da042c05e7d3 /app/src | |
parent | 513553c3f9b2fce7c830f499d2477d2847375f9f (diff) | |
download | SmileEssence-d784297e8e245a9451b53191b7ff53243ee43f57.tar.gz |
cl
Diffstat (limited to 'app/src')
7 files changed, 59 insertions, 112 deletions
diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt index 7b8ff567..5e6c6602 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt @@ -79,7 +79,8 @@ class ManageProfilesActivity : AppCompatActivity() { goToWorld(Application.currentWorld!!) } } else { - Toast.makeText(this, R.string.notice_error_storage_permission, Toast.LENGTH_LONG).show() + Toast.makeText(this, "Write access to external storage is required.", + Toast.LENGTH_LONG).show() finish() } } @@ -153,7 +154,8 @@ class ManageProfilesActivity : AppCompatActivity() { profiles.removeAt(position) notifyItemRemoved(position) notifyItemRangeChanged(position, profiles.size) - Snackbar.make(fab, "Removed profile ${world.user.screenName}", Snackbar.LENGTH_LONG).show() + Snackbar.make(fab, "Removed profile ${world.user.screenName}", + Snackbar.LENGTH_LONG).show() // TODO: Account.unregister(account.id) // TODO: Stop the world } @@ -174,7 +176,8 @@ class ManageProfilesActivity : AppCompatActivity() { .setIcon(icon) .setIntent(shortcutIntent) .build() - ShortcutManagerCompat.requestPinShortcut(Application.instance, shortcutInfo, null) + ShortcutManagerCompat.requestPinShortcut(Application.instance, shortcutInfo, + null) } } } diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/User.kt b/app/src/main/java/net/lacolaco/smileessence/entity/User.kt index bbd52322..bb06d510 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/User.kt +++ b/app/src/main/java/net/lacolaco/smileessence/entity/User.kt @@ -65,8 +65,10 @@ class User private constructor(override val id: Long, screenName: String, rawPro val decoratedDescription: String get() { var html = description - html = html.replace("https?://[\\w/:%#$&?()~.=+-]+".toRegex(), "<a href=\"$0\">$0</a>") - html = html.replace("@([a-zA-Z0-9_]+)".toRegex(), "<a href=\"https://twitter.com/$1\">$0</a>") + html = html.replace("https?://[\\w/:%#$&?()~.=+-]+".toRegex(), + "<a href=\"$0\">$0</a>") + html = html.replace("@([a-zA-Z0-9_]+)".toRegex(), + "<a href=\"https://twitter.com/$1\">$0</a>") html = html.replace("\r\n".toRegex(), "<br />") return html } diff --git a/app/src/main/java/net/lacolaco/smileessence/twitter/Searches.kt b/app/src/main/java/net/lacolaco/smileessence/twitter/Searches.kt index 071c3874..a046e47f 100644 --- a/app/src/main/java/net/lacolaco/smileessence/twitter/Searches.kt +++ b/app/src/main/java/net/lacolaco/smileessence/twitter/Searches.kt @@ -7,7 +7,9 @@ import net.lacolaco.smileessence.util.bg import twitter4j.Query fun World.createSavedSearchAsync(query: String) = bg { - SavedSearch.fromTwitter(TwitterTaskException.wrap { twitter.savedSearches().createSavedSearch(query) }) + SavedSearch.fromTwitter(TwitterTaskException.wrap { + twitter.savedSearches().createSavedSearch(query) + }) } fun World.destroySavedSearchAsync(id: Long) = bg { @@ -15,10 +17,21 @@ fun World.destroySavedSearchAsync(id: Long) = bg { } fun World.getSavedSearchesAsync() = bg { - TwitterTaskException.wrap { twitter.savedSearches().savedSearches }.map { SavedSearch.fromTwitter(it) } + TwitterTaskException.wrap { + twitter.savedSearches().savedSearches + }.map { + SavedSearch.fromTwitter(it) + } } -// XXX -fun World.doSearch(query: Query) = bg { +fun World.doSearch(queryString: String, sinceId: Long? = null, maxId: Long? = null) = bg { + val query = Query() + query.query = queryString + query.resultType = Query.RECENT + query.count = 200 + if (sinceId != null) + query.sinceId = sinceId + if (maxId != null) + query.maxId = maxId Tweet.fromTwitter(TwitterTaskException.wrap { twitter.search(query).tweets }, id) } diff --git a/app/src/main/java/net/lacolaco/smileessence/twitter/Tweets.kt b/app/src/main/java/net/lacolaco/smileessence/twitter/Tweets.kt index 0b8b57dc..c37b1b25 100644 --- a/app/src/main/java/net/lacolaco/smileessence/twitter/Tweets.kt +++ b/app/src/main/java/net/lacolaco/smileessence/twitter/Tweets.kt @@ -1,19 +1,12 @@ package net.lacolaco.smileessence.twitter -import android.graphics.Bitmap -import android.graphics.BitmapFactory -import android.os.Environment -import android.text.TextUtils import kotlinx.coroutines.experimental.CommonPool import kotlinx.coroutines.experimental.async -import net.lacolaco.smileessence.Logger import net.lacolaco.smileessence.World import net.lacolaco.smileessence.entity.Tweet import net.lacolaco.smileessence.util.bg import twitter4j.StatusUpdate import java.io.File -import java.io.FileOutputStream -import java.io.IOException fun World.getTweetAsync(id: Long, fetchAlways: Boolean = true) = async(CommonPool) { if (!fetchAlways) { @@ -31,57 +24,11 @@ fun World.deleteTweetAsync(id: Long) = async(CommonPool) { }, id) } -// XXX -fun World.createTweetAsync(update: StatusUpdate, mediaPath: String, resizeFlag: Boolean) = bg { - val MEDIA_SIZE_LIMIT = 5 * 1024 * 1024 - - var tempFilePath: String? = null - try { - if (!TextUtils.isEmpty(mediaPath)) { - val mediaFile by lazy compressing@ { - val file = File(mediaPath) - if (file.length() >= MEDIA_SIZE_LIMIT && resizeFlag) { - val opt = BitmapFactory.Options() - opt.inJustDecodeBounds = true - BitmapFactory.decodeFile(mediaPath, opt) - tempFilePath = Environment.getExternalStorageDirectory().toString() + "/temp.jpg" - val compressedFile = File(tempFilePath) - var fos: FileOutputStream? = null - try { - fos = FileOutputStream(compressedFile) - val ratio = file.length().toFloat() / MEDIA_SIZE_LIMIT.toFloat() - val resizeOpt = BitmapFactory.Options() - resizeOpt.inPurgeable = true - resizeOpt.inSampleSize = Math.ceil(ratio.toDouble()).toInt() - val bitmap = BitmapFactory.decodeFile(mediaPath, resizeOpt) - bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos) - bitmap.recycle() - return@compressing compressedFile - } catch (e: Exception) { - e.printStackTrace() - Logger.error(e) - } finally { - try { - if (fos != null) fos.close() - } catch (e: IOException) { - e.printStackTrace() - Logger.error(e) - } - - } - } - return@compressing file - } - if (mediaFile.exists()) { - update.setMedia(mediaFile) - } - } - Tweet.fromTwitter(TwitterTaskException.wrap { - twitter.tweets().updateStatus(update) - }, id) - } finally { - if (tempFilePath != null) { - File(tempFilePath).delete() - } - } +fun World.createTweetAsync(text: String, inReplyTo: Long?, mediaPath: String?) = bg { + val su = StatusUpdate(text) + if (inReplyTo != null) + su.inReplyToStatusId = inReplyTo + if (mediaPath != null) + su.setMedia(File(mediaPath)) + Tweet.fromTwitter(TwitterTaskException.wrap { twitter.tweets().updateStatus(su) }, id) } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt index 56531aa7..3fbaf027 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/ComposePageFragment.kt @@ -10,7 +10,6 @@ import android.provider.MediaStore import android.support.v4.content.ContextCompat import android.text.Editable import android.text.Spannable -import android.text.TextUtils import android.text.TextWatcher import android.text.method.ArrowKeyMovementMethod import android.view.* @@ -29,7 +28,6 @@ import net.lacolaco.smileessence.twitter.createTweetAsync import net.lacolaco.smileessence.util.SystemServiceHelper import net.lacolaco.smileessence.util.launchUi import net.lacolaco.smileessence.view.Partials -import twitter4j.StatusUpdate import java.io.File class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatcher { @@ -97,13 +95,12 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche layout_post_reply_status.visibility = View.GONE button_post_reply_delete.visibility = View.GONE } - if (TextUtils.isEmpty(postState.mediaFilePath)) { + if (postState.mediaFilePath == null) post_media_parent.visibility = View.GONE - } else { + else { post_media_parent.visibility = View.VISIBLE - + Glide.with(image_post_media).load(File(postState.mediaFilePath!!)).into(image_post_media) } - Glide.with(image_post_media).load(File(postState.mediaFilePath)).into(image_post_media) } override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} @@ -118,7 +115,7 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche private fun updateTextCount(s: CharSequence) { val validator = Validator() var length = validator.getTweetLength(s.toString()) - if (!TextUtils.isEmpty(postState.mediaFilePath)) + if (postState.mediaFilePath != null) length += validator.shortUrlLength post_text_count.text = length.toString() @@ -148,7 +145,8 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche SystemServiceHelper.showIM(activity, post_edit_text) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.page_fragment_compose, container, false) } @@ -171,11 +169,8 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche SystemServiceHelper.hideIM(activity, post_edit_text) launchUi { try { - val su = StatusUpdate(postState.text) - if (postState.inReplyTo != null) { - su.inReplyToStatusId = postState.inReplyTo!!.id - } - world.createTweetAsync(su, postState.mediaFilePath, false).await() + world.createTweetAsync(postState.text, postState.inReplyTo!!.id, + postState.mediaFilePath).await() world.notify(R.string.notice_tweet_succeeded) postState.clear() onPostStateChange() @@ -203,14 +198,14 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche image_post_media.setOnClickListener { val intent = Intent(Intent.ACTION_VIEW) intent.addCategory(Intent.CATEGORY_DEFAULT) - intent.setDataAndType(Uri.fromFile(File(postState.mediaFilePath)), "image/*") + intent.setDataAndType(Uri.fromFile(File(postState.mediaFilePath!!)), "image/*") startActivity(intent) } button_post_media_delete.setOnClickListener { SystemServiceHelper.hideIM(activity, post_edit_text) post_media_parent.visibility = View.GONE image_post_media.setImageBitmap(null) - postState.mediaFilePath = "" + postState.mediaFilePath = null onPostStateChange() } onPostStateChange() @@ -234,7 +229,7 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche private class PostState( var text: String = "", private var inReplyToId: Long = -1, - var mediaFilePath: String = "", + var mediaFilePath: String? = null, var selectionStart: Int = 0, var selectionEnd: Int = 0 ) : Parcelable { @@ -247,7 +242,7 @@ class ComposePageFragment : PageFragment<PageInfo.ComposePageInfo>(), TextWatche fun clear() { text = "" inReplyTo = null - mediaFilePath = "" + mediaFilePath = null selectionStart = 0 selectionEnd = 0 } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt index 14b89d8c..ad194225 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/page/SearchPageFragment.kt @@ -23,7 +23,6 @@ import net.lacolaco.smileessence.util.launchUi import net.lacolaco.smileessence.view.Partials import net.lacolaco.smileessence.view.PopupMenu import net.lacolaco.smileessence.view.confirm -import twitter4j.Query import java.util.* class SearchPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.SearchPageInfo>() { @@ -32,7 +31,8 @@ class SearchPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.Searc startSearch(pageInfo.query) } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, savedInstanceState: Bundle?): View { + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup, + savedInstanceState: Bundle?): View { return inflater.inflate(R.layout.page_fragment_search, container, false) } @@ -104,27 +104,18 @@ class SearchPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.Searc } override fun onSwipeDown(view: SwipyRefreshLayout) { - val query = Query() - query.query = pageInfo.query - query.count = 200 - query.resultType = Query.RECENT - if (adapter.sortedList.size > 0) { - query.sinceId = adapter.sortedList[0].id - } - runRefreshTask(query) { + val sinceId = if (adapter.sortedList.size > 0) adapter.sortedList[0].id else null + runRefreshTask(pageInfo.query, sinceId = sinceId) { view.isRefreshing = false } } override fun onSwipeUp(view: SwipyRefreshLayout) { - val query = Query() - query.query = pageInfo.query - query.count = 200 - query.resultType = Query.RECENT - if (adapter.sortedList.size > 0) { - query.maxId = adapter.sortedList[adapter.sortedList.size - 1].id - 1 - } - runRefreshTask(query) { + val maxId = if (adapter.sortedList.size > 0) + adapter.sortedList[adapter.sortedList.size - 1].id - 1 + else + null + runRefreshTask(pageInfo.query, maxId = maxId) { view.isRefreshing = false } } @@ -159,17 +150,14 @@ class SearchPageFragment : RefreshableTimelinePageFragment<Tweet, PageInfo.Searc setSwipeRefreshEnabled(queryString.isNotBlank()) adapter.sortedList.clear() if (queryString.isNotBlank()) { - val query = Query() - query.query = queryString - query.count = 200 - query.resultType = Query.RECENT - runRefreshTask(query) { } + runRefreshTask(queryString) { } } } - private fun runRefreshTask(query: Query, onFinish: () -> Unit) = launchUi { + private fun runRefreshTask(query: String, sinceId: Long? = null, maxId: Long? = null, + onFinish: () -> Unit) = launchUi { try { - val tweets = world.doSearch(query).await() + val tweets = world.doSearch(query, sinceId = sinceId, maxId = maxId).await() adapter.sortedList.addAll(tweets) onFinish() } catch (e: TwitterTaskException) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8c4a618b..ba42b19e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -69,6 +69,5 @@ <string name="command_status_add_to_reply">Add to reply</string> <string name="notice_error_get_user_timeline">Failed to get user timeline</string> <string name="notice_error_get_list">Failed to get list timeline</string> - <string name="notice_error_storage_permission">Write access to external storage is required.</string> <string name="title_activity_page_manage">PageManageActivity</string> </resources> |