From 185b378cd15472609af2578e17f707fdb471e986 Mon Sep 17 00:00:00 2001 From: Kazuki Yamaguchi Date: Sat, 14 Oct 2017 23:18:53 +0900 Subject: compat work --- app/build.gradle | 16 ++-- app/src/main/AndroidManifest.xml | 1 - .../main/java/net/lacolaco/smileessence/World.kt | 22 ++--- .../activity/EditExtractionActivity.kt | 13 ++- .../smileessence/activity/LicenseActivity.kt | 14 +--- .../lacolaco/smileessence/activity/MainActivity.kt | 53 ++++-------- .../activity/ManageAccountsActivity.kt | 16 ++-- .../smileessence/activity/OAuthActivity.kt | 11 +-- .../smileessence/activity/SettingActivity.kt | 9 +- .../java/net/lacolaco/smileessence/data/Account.kt | 3 + .../net/lacolaco/smileessence/data/DbHelper.kt | 3 +- .../lacolaco/smileessence/data/ExtractionWord.kt | 2 +- .../java/net/lacolaco/smileessence/entity/Tweet.kt | 9 +- .../preference/UserPreferenceHelper.kt | 4 - .../smileessence/view/ColoredRelativeLayout.kt | 5 +- .../net/lacolaco/smileessence/view/Confirmation.kt | 8 +- .../net/lacolaco/smileessence/view/PopupMenu.kt | 2 +- .../lacolaco/smileessence/view/SettingFragment.kt | 2 +- .../lacolaco/smileessence/view/ThreeStateButton.kt | 4 +- .../smileessence/view/ToggleableImageButton.kt | 4 +- .../smileessence/view/adapter/PageListAdapter.kt | 97 ++++++++++++++++++---- .../smileessence/view/dialog/DisposeDialog.kt | 10 --- .../view/dialog/StackableDialogFragment.kt | 5 +- .../res/drawable/button_selector_transparent.xml | 14 ---- app/src/main/res/layout/dialog_menu_list.xml | 9 -- app/src/main/res/layout/dialog_user_detail.xml | 10 +-- app/src/main/res/layout/fragment_post.xml | 4 +- app/src/main/res/layout/layout_edit_list.xml | 16 +++- app/src/main/res/layout/layout_license.xml | 14 +++- app/src/main/res/layout/layout_main.xml | 7 ++ app/src/main/res/layout/layout_manage_accounts.xml | 18 ++++ app/src/main/res/layout/layout_setting.xml | 14 +++- app/src/main/res/menu/edit_list.xml | 5 +- app/src/main/res/menu/main.xml | 9 +- app/src/main/res/values/keys.xml | 1 - app/src/main/res/values/strings.xml | 3 - app/src/main/res/values/styles.xml | 21 +++-- build.gradle | 2 +- 38 files changed, 253 insertions(+), 207 deletions(-) delete mode 100644 app/src/main/java/net/lacolaco/smileessence/view/dialog/DisposeDialog.kt delete mode 100644 app/src/main/res/drawable/button_selector_transparent.xml delete mode 100644 app/src/main/res/layout/dialog_menu_list.xml create mode 100644 app/src/main/res/layout/layout_manage_accounts.xml diff --git a/app/build.gradle b/app/build.gradle index 41d95778..d492e245 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ android { buildToolsVersion "26.0.2" defaultConfig { applicationId "jp.rhe.smileessence3" - minSdkVersion 23 + minSdkVersion 19 targetSdkVersion 26 versionName "git -C ${rootDir} describe --tags --long --dirty --always".execute().text.trim() @@ -39,18 +39,13 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:0.19.1' implementation 'com.android.support:support-core-ui:26.1.0' - implementation 'com.android.support:support-v13:26.1.0' + implementation 'com.android.support:appcompat-v7:26.1.0' implementation 'com.android.support:palette-v7:26.1.0' + implementation 'com.android.support:design:26.1.0' // Volley implementation 'com.android.volley:volley:1.0.0@aar' - // Crouton - implementation('de.keyboardsurfer.android.widget:crouton:1.8.5@aar') { - // exclusion is not necessary, but generally a good idea. - exclude group: 'com.google.android', module: 'support-v4' - } - // SwipyRefreshLayout implementation 'com.github.omadahealth:swipy:1.2.3@aar' @@ -62,10 +57,9 @@ dependencies { implementation 'org.twitter4j:twitter4j-media-support:4.0.6' implementation 'org.twitter4j:twitter4j-stream:4.0.6' - // LeakCanary - debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4' - releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5.4' + releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' } kotlin { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 62acb2db..5c4c86a3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -97,7 +97,6 @@ android:configChanges="keyboardHidden|orientation" android:excludeFromRecents="false" android:label="@string/activity_authenticate" - android:launchMode="singleTask" android:parentActivityName=".activity.ManageAccountsActivity" /> diff --git a/app/src/main/java/net/lacolaco/smileessence/World.kt b/app/src/main/java/net/lacolaco/smileessence/World.kt index 7b980cd6..4c38c653 100644 --- a/app/src/main/java/net/lacolaco/smileessence/World.kt +++ b/app/src/main/java/net/lacolaco/smileessence/World.kt @@ -2,9 +2,8 @@ package net.lacolaco.smileessence import android.content.Intent import android.support.annotation.StringRes -import de.keyboardsurfer.android.widget.crouton.Configuration -import de.keyboardsurfer.android.widget.crouton.Crouton -import de.keyboardsurfer.android.widget.crouton.Style +import android.support.design.widget.Snackbar +import kotlinx.android.synthetic.main.layout_main.* import net.lacolaco.smileessence.activity.MainActivity import net.lacolaco.smileessence.compat.Twitter4J import net.lacolaco.smileessence.data.Account @@ -225,16 +224,9 @@ class World(val account: Account) { } else { UIHandler().post { if (isMainActivityActive) { - Logger.debug(String.format("notify(crouton): %s", text)) - val conf = Configuration.Builder() - conf.setDuration(NOTIFICATION_DURATION) - val bstyle = Style.Builder() - bstyle.setConfiguration(conf.build()) - bstyle.setBackgroundColorValue(if (type == NotificationType.ALERT) - Style.holoRedLight - else - Style.holoBlueLight) - Crouton.makeText(activity, text, bstyle.build()).show() + // TODO: Make errors distinguishable + Logger.debug("notify(snackbar): $text") + Snackbar.make(activity.viewPager, text, Snackbar.LENGTH_SHORT).show() } else { Logger.debug(String.format("notify(toast): %s", text)) Application.toast(text) @@ -247,8 +239,4 @@ class World(val account: Account) { INFO, ALERT } - - companion object { - private val NOTIFICATION_DURATION = 1000 - } } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.kt index 317d782b..506178ad 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/EditExtractionActivity.kt @@ -1,9 +1,8 @@ package net.lacolaco.smileessence.activity -import android.app.Activity -import android.app.AlertDialog import android.os.Bundle -import android.support.v4.app.NavUtils +import android.support.v7.app.AlertDialog +import android.support.v7.app.AppCompatActivity import android.text.TextUtils import android.view.* import android.widget.AbsListView @@ -13,10 +12,9 @@ import kotlinx.android.synthetic.main.list_item_simple_text.view.* import kotlinx.android.synthetic.main.part_edittext.view.* import net.lacolaco.smileessence.R import net.lacolaco.smileessence.data.ExtractionWord -import net.lacolaco.smileessence.logging.Logger import net.lacolaco.smileessence.view.adapter.UnorderedCustomListAdapter -class EditExtractionActivity : Activity() { +class EditExtractionActivity : AppCompatActivity() { private val adapter by lazy { object : UnorderedCustomListAdapter() { override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { @@ -28,9 +26,10 @@ class EditExtractionActivity : Activity() { } override fun onCreate(savedInstanceState: Bundle?) { - Logger.debug("onCreate") super.onCreate(savedInstanceState) setContentView(R.layout.layout_edit_list) + setSupportActionBar(toolbar) + supportActionBar!!.setDisplayHomeAsUpEnabled(true) adapter.addAll(ExtractionWord.cached()) adapter.update() @@ -97,7 +96,7 @@ class EditExtractionActivity : Activity() { dialog.show() } android.R.id.home -> { - NavUtils.navigateUpFromSameTask(this) + finish() return true } } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/LicenseActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/LicenseActivity.kt index 1c71ef17..b166d1af 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/LicenseActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/LicenseActivity.kt @@ -1,33 +1,27 @@ package net.lacolaco.smileessence.activity -import android.app.Activity import android.os.Bundle -import android.support.v4.app.NavUtils +import android.support.v7.app.AppCompatActivity import android.view.MenuItem import android.widget.TextView import kotlinx.android.synthetic.main.layout_license.* import net.lacolaco.smileessence.R import java.util.* -class LicenseActivity : Activity() { - - // --------------------- GETTER / SETTER METHODS --------------------- - +class LicenseActivity : AppCompatActivity() { private val fileNames: List get() { val apacheFiles = ArrayList() apacheFiles.add(getString(R.string.library_name_twitter4j)) - apacheFiles.add(getString(R.string.library_name_crouton)) apacheFiles.add(getString(R.string.library_name_volley)) apacheFiles.add(getString(R.string.library_name_twitter_text)) return apacheFiles } - // ------------------------ OVERRIDE METHODS ------------------------ - public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.layout_license) + setSupportActionBar(toolbar) setFiles() } @@ -35,7 +29,7 @@ class LicenseActivity : Activity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { - NavUtils.navigateUpFromSameTask(this) + finish() return true } } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt index 983da6cf..f75f88a4 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt @@ -1,22 +1,20 @@ package net.lacolaco.smileessence.activity -import android.app.Activity import android.app.ActivityManager import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.drawable.BitmapDrawable -import android.graphics.drawable.ColorDrawable import android.net.Uri import android.os.Bundle import android.provider.MediaStore import android.support.v4.view.ViewPager +import android.support.v7.app.AppCompatActivity import android.support.v7.graphics.Palette import android.text.TextUtils import android.view.Menu import android.view.MenuItem import android.view.WindowManager -import de.keyboardsurfer.android.widget.crouton.Crouton import kotlinx.android.synthetic.main.layout_main.* import net.lacolaco.smileessence.Application import net.lacolaco.smileessence.R @@ -38,7 +36,7 @@ import java.io.InputStream import java.net.URL import java.util.regex.Pattern -class MainActivity : Activity(), ViewPager.OnPageChangeListener { +class MainActivity : AppCompatActivity(), ViewPager.OnPageChangeListener { val world: World by lazy { val uri = intent.data ?: throw IllegalStateException("[BUG] data not set") val userIdValue = uri.getQueryParameter("user_id") ?: throw IllegalStateException("[BUG] user_id not set") @@ -94,8 +92,10 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { private fun setTitle() { title = String.format("%s / %s", world.account.user.screenName, pagerAdapter.getName(viewPager.currentItem)) val label = getString(R.string.app_name) + " - @" + world.account.user.screenName - setTaskDescription(ActivityManager.TaskDescription(label, null, world.account.themeColor)) - window.statusBarColor = world.account.themeColor + if (android.os.Build.VERSION.SDK_INT >= 21) { + setTaskDescription(ActivityManager.TaskDescription(label, null, world.account.themeColor)) + window.statusBarColor = world.account.themeColor + } launchBg { world.account.syncProfileAndSaveIfNecessary() } if (!world.account.user.profileImageUrl.startsWith("http")) @@ -129,7 +129,7 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { val dPalette = bg { Palette.from(bitmap).generate() } val scaledBitmap = dScaledBitmap.await() - actionBar.setHomeAsUpIndicator(BitmapDrawable(resources, scaledBitmap)) + toolbar.navigationIcon = BitmapDrawable(resources, scaledBitmap) val palette = dPalette.await() val swatch = if (world.account.useDarkTheme) @@ -139,11 +139,14 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { if (swatch == null) { Logger.info("Unable to get a theme color of @${world.account.user.screenName}") } else { - actionBar.setBackgroundDrawable(ColorDrawable(swatch.rgb)) - window.statusBarColor = swatch.rgb - setTaskDescription(ActivityManager.TaskDescription(label, bitmap, swatch.rgb)) + //actionBar.setBackgroundDrawable(ColorDrawable(swatch.rgb)) + toolbar.setBackgroundColor(swatch.rgb) + if (android.os.Build.VERSION.SDK_INT >= 21) { + window.statusBarColor = swatch.rgb + setTaskDescription(ActivityManager.TaskDescription(label, bitmap, swatch.rgb)) + } world.account.themeColor = swatch.rgb - launchBg { world.account.save() } + //launchBg { world.account.save() } } } } @@ -229,7 +232,7 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { when (requestCode) { REQUEST_GET_PICTURE_FROM_GALLERY -> { - if (resultCode != Activity.RESULT_OK) { + if (resultCode != RESULT_OK) { Logger.error(requestCode) world.notifyError(R.string.notice_select_image_failed) finish() @@ -250,9 +253,10 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { val account = world.account setTheme(if (account.useDarkTheme) R.style.theme_dark else R.style.theme_light) setContentView(R.layout.layout_main) + setSupportActionBar(toolbar) viewPager.addOnPageChangeListener(this) - actionBar.setDisplayHomeAsUpEnabled(true) + //actionBar.setDisplayHomeAsUpEnabled(true) // TODO: tab order? val args = Bundle() @@ -303,29 +307,6 @@ class MainActivity : Activity(), ViewPager.OnPageChangeListener { window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) } - override fun onDestroy() { - Crouton.cancelAllCroutons() - // Workaround for LeakCanary - fixCroutonLeak() - Logger.debug("onDestroy") - super.onDestroy() - } - - private fun fixCroutonLeak() { - try { - val klass = Class.forName("de.keyboardsurfer.android.widget.crouton.DefaultAnimationsBuilder") - val slideInDownAnimation = klass.getDeclaredField("slideInDownAnimation") - slideInDownAnimation.isAccessible = true - slideInDownAnimation.set(null, null) - val slideOutUpAnimation = klass.getDeclaredField("slideOutUpAnimation") - slideOutUpAnimation.isAccessible = true - slideOutUpAnimation.set(null, null) - } catch (e: Exception) { - Logger.error("crouton fix error: " + e) - } - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.main, menu) return true diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt index d53e94a7..5bf1b5f3 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt @@ -1,19 +1,19 @@ package net.lacolaco.smileessence.activity -import android.app.Activity import android.content.ComponentName import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Bundle import android.os.Process +import android.support.v7.app.AppCompatActivity import android.view.Menu import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.AdapterView import android.widget.BaseAdapter -import kotlinx.android.synthetic.main.layout_edit_list.* +import kotlinx.android.synthetic.main.layout_manage_accounts.* import kotlinx.android.synthetic.main.list_item_account.view.* import net.lacolaco.smileessence.Application import net.lacolaco.smileessence.R @@ -26,7 +26,7 @@ import net.lacolaco.smileessence.util.launchUi import net.lacolaco.smileessence.view.confirm import java.util.* -class ManageAccountsActivity : Activity() { +class ManageAccountsActivity : AppCompatActivity() { private val adapter by lazy { EditAccountsAdapter() } private lateinit var receivedIntent: Intent @@ -48,7 +48,8 @@ class ManageAccountsActivity : Activity() { return } - setContentView(R.layout.layout_edit_list) + setContentView(R.layout.layout_manage_accounts) + setSupportActionBar(toolbar) listview_edit_list.adapter = adapter listview_edit_list.setOnItemClickListener { adapterView: AdapterView<*>, view1: View, i: Int, l: Long -> @@ -115,7 +116,8 @@ class ManageAccountsActivity : Activity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { - R.id.menu_edit_list_add -> startActivityForResult(Intent(this, OAuthActivity::class.java), REQUEST_OAUTH) + R.id.menu_edit_list_add -> + startActivityForResult(Intent(this, OAuthActivity::class.java), REQUEST_OAUTH) android.R.id.home -> safeFinish() else -> return super.onOptionsItemSelected(item) } @@ -131,7 +133,7 @@ class ManageAccountsActivity : Activity() { if (currentWorld != null) { goToWorld(currentWorld) } else { - setResult(Activity.RESULT_CANCELED) + setResult(RESULT_CANCELED) finish() } } @@ -142,7 +144,7 @@ class ManageAccountsActivity : Activity() { } private fun receiveOAuth(requestCode: Int, resultCode: Int, data: Intent?) { - if (resultCode == Activity.RESULT_OK) { + if (resultCode == RESULT_OK) { launchUi { data!! adapter.add(bg { diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.kt index 334c84cc..21fe612f 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/OAuthActivity.kt @@ -1,8 +1,8 @@ package net.lacolaco.smileessence.activity -import android.app.Activity import android.content.Intent import android.os.Bundle +import android.support.v7.app.AppCompatActivity import android.text.Editable import android.text.TextWatcher import kotlinx.android.synthetic.main.layout_oauth.* @@ -14,7 +14,7 @@ import net.lacolaco.smileessence.util.launchUi import twitter4j.TwitterFactory import twitter4j.auth.RequestToken -class OAuthActivity : Activity(), TextWatcher { +class OAuthActivity : AppCompatActivity(), TextWatcher { private var token: String? = null private var tokenSecret: String? = null @@ -38,10 +38,11 @@ class OAuthActivity : Activity(), TextWatcher { intent.putExtra(KEY_TOKEN_SECRET, accessToken.tokenSecret) intent.putExtra(KEY_USER_ID, accessToken.userId) intent.putExtra(KEY_SCREEN_NAME, accessToken.screenName) - setResult(Activity.RESULT_OK, intent) + setResult(RESULT_OK, intent) } catch (e: Exception) { + e.printStackTrace() Application.toast(R.string.notice_error_authenticate) - setResult(Activity.RESULT_CANCELED) + setResult(RESULT_CANCELED) } finish() } @@ -63,7 +64,7 @@ class OAuthActivity : Activity(), TextWatcher { } catch (e: Exception) { Logger.error(e) Application.toast(R.string.notice_error_authenticate_request) - setResult(Activity.RESULT_CANCELED) + setResult(RESULT_CANCELED) finish() } } diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/SettingActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/SettingActivity.kt index d7f1101f..47f44dd0 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/SettingActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/SettingActivity.kt @@ -1,21 +1,22 @@ package net.lacolaco.smileessence.activity -import android.app.Activity import android.os.Bundle -import android.support.v4.app.NavUtils +import android.support.v7.app.AppCompatActivity import android.view.MenuItem +import kotlinx.android.synthetic.main.layout_setting.* import net.lacolaco.smileessence.R -class SettingActivity : Activity() { +class SettingActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.layout_setting) + setSupportActionBar(toolbar) } override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { - NavUtils.navigateUpFromSameTask(this) + finish() return true } } diff --git a/app/src/main/java/net/lacolaco/smileessence/data/Account.kt b/app/src/main/java/net/lacolaco/smileessence/data/Account.kt index b5327d5a..d9efd4b9 100644 --- a/app/src/main/java/net/lacolaco/smileessence/data/Account.kt +++ b/app/src/main/java/net/lacolaco/smileessence/data/Account.kt @@ -2,6 +2,7 @@ package net.lacolaco.smileessence.data import android.content.ContentValues import net.lacolaco.smileessence.entity.User +import net.lacolaco.smileessence.logging.Logger import twitter4j.Twitter import twitter4j.TwitterFactory import twitter4j.TwitterStream @@ -86,6 +87,7 @@ class Account private constructor( } } } + Logger.error(cache.size) } fun register(token: String, tokenSecret: String, userId: Long, screenName: String): Account { @@ -108,6 +110,7 @@ class Account private constructor( values.put("theme", account.themeIndex) values.put("theme_color", account.themeColor) db.insertOrThrow("accounts", null, values) + Logger.error(cache.size) } cache[userId] = account diff --git a/app/src/main/java/net/lacolaco/smileessence/data/DbHelper.kt b/app/src/main/java/net/lacolaco/smileessence/data/DbHelper.kt index 7fe81e66..772ff959 100644 --- a/app/src/main/java/net/lacolaco/smileessence/data/DbHelper.kt +++ b/app/src/main/java/net/lacolaco/smileessence/data/DbHelper.kt @@ -7,7 +7,7 @@ import android.database.sqlite.SQLiteOpenHelper class DbHelper private constructor(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) { override fun onCreate(db: SQLiteDatabase) { - // Schema v0 + // Schema v1 db.execSQL(""" CREATE TABLE accounts ( id INTEGER PRIMARY KEY, @@ -18,6 +18,7 @@ class DbHelper private constructor(context: Context) : theme INTEGER NOT NULL ) """) + onUpgrade(db, 1, DATABASE_VERSION) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { diff --git a/app/src/main/java/net/lacolaco/smileessence/data/ExtractionWord.kt b/app/src/main/java/net/lacolaco/smileessence/data/ExtractionWord.kt index 7c1e1384..7f541c4b 100644 --- a/app/src/main/java/net/lacolaco/smileessence/data/ExtractionWord.kt +++ b/app/src/main/java/net/lacolaco/smileessence/data/ExtractionWord.kt @@ -11,7 +11,7 @@ class ExtractionWord private constructor(val patternString: String) { fun remove() { DbHelper.instance.writableDatabase.use { db -> if (db.delete("extraction_words", "pattern_string = ?", arrayOf(patternString)) == 0) - throw IllegalStateException("Could not remove patternString=${patternString} from extraction_words") + throw IllegalStateException("Could not remove patternString=$patternString from extraction_words") } cache!!.remove(this) } diff --git a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt index fbb45641..17ee6799 100644 --- a/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt +++ b/app/src/main/java/net/lacolaco/smileessence/entity/Tweet.kt @@ -17,10 +17,11 @@ class Tweet private constructor(st: twitter4j.Status, myUserId: Long) : EntitySu val isRetweet = retweetedTweet != null val originalTweet = retweetedTweet ?: this val text: String = retweetedTweet?.text ?: extractText(st, false) - val inReplyToStatusId: Long? = - if (isRetweet) retweetedTweet!!.inReplyToStatusId - else if (st.inReplyToStatusId != -1L) st.inReplyToStatusId - else null + val inReplyToStatusId: Long? = when { + isRetweet -> retweetedTweet!!.inReplyToStatusId + st.inReplyToStatusId != -1L -> st.inReplyToStatusId + else -> null + } var favoriteCount: Int = st.favoriteCount get() = retweetedTweet?.favoriteCount ?: field private set diff --git a/app/src/main/java/net/lacolaco/smileessence/preference/UserPreferenceHelper.kt b/app/src/main/java/net/lacolaco/smileessence/preference/UserPreferenceHelper.kt index 4f175026..23bae89e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/preference/UserPreferenceHelper.kt +++ b/app/src/main/java/net/lacolaco/smileessence/preference/UserPreferenceHelper.kt @@ -9,10 +9,6 @@ class UserPreferenceHelper private constructor() { private val preferences: SharedPreferences get() = PreferenceManager.getDefaultSharedPreferences(Application.instance) - // --------------------- HELPER METHODS --------------------- - val themeIndex: Int - get() = get(R.string.key_setting_theme, 0) - val textSize: Int get() = get(R.string.key_setting_text_size, 10) diff --git a/app/src/main/java/net/lacolaco/smileessence/view/ColoredRelativeLayout.kt b/app/src/main/java/net/lacolaco/smileessence/view/ColoredRelativeLayout.kt index 5d15c2bc..3e37411d 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/ColoredRelativeLayout.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/ColoredRelativeLayout.kt @@ -7,8 +7,9 @@ import android.util.AttributeSet import android.widget.RelativeLayout import net.lacolaco.smileessence.R - -class ColoredRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0, defStyleRes: Int = 0) : RelativeLayout(context, attrs, defStyleAttr, defStyleRes) { +// XXX: 4th argument defStyleRes: Int = 0 isn't available in API 19 +class ColoredRelativeLayout @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : + RelativeLayout(context, attrs, defStyleAttr) { private val paint = Paint() private val highlightColors = IntArray(4) private var showAccent = false diff --git a/app/src/main/java/net/lacolaco/smileessence/view/Confirmation.kt b/app/src/main/java/net/lacolaco/smileessence/view/Confirmation.kt index 6d25db2e..40e0e3fa 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/Confirmation.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/Confirmation.kt @@ -1,11 +1,11 @@ package net.lacolaco.smileessence.view -import android.app.Activity -import android.app.AlertDialog import android.app.Fragment +import android.support.v7.app.AlertDialog +import android.support.v7.app.AppCompatActivity import net.lacolaco.smileessence.R -fun Activity.confirm(resId: Int, vararg rest: Any, onOk: () -> Unit) { +fun AppCompatActivity.confirm(resId: Int, vararg rest: Any, onOk: () -> Unit) { val dialog = AlertDialog.Builder(this) .setTitle(getString(resId, *rest)) .setPositiveButton(R.string.alert_dialog_ok) { _, _ -> onOk() } @@ -15,4 +15,4 @@ fun Activity.confirm(resId: Int, vararg rest: Any, onOk: () -> Unit) { } fun Fragment.confirm(resId: Int, vararg rest: Any, onOk: () -> Unit) = - activity.confirm(resId, rest = *rest, onOk = onOk) + (activity as AppCompatActivity).confirm(resId, rest = *rest, onOk = onOk) diff --git a/app/src/main/java/net/lacolaco/smileessence/view/PopupMenu.kt b/app/src/main/java/net/lacolaco/smileessence/view/PopupMenu.kt index 794f77fd..bb765792 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/PopupMenu.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/PopupMenu.kt @@ -5,7 +5,7 @@ import android.view.MenuItem import android.view.View class PopupMenu(context: Context, anchor: View) { - private val popupMenu = android.widget.PopupMenu(context, anchor) + private val popupMenu = android.support.v7.widget.PopupMenu(context, anchor) private val menuItems = LinkedHashMap Unit>() init { diff --git a/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.kt index 019e02b5..c2aa6ec0 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/SettingFragment.kt @@ -1,6 +1,5 @@ package net.lacolaco.smileessence.view -import android.app.AlertDialog import android.content.Intent import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener @@ -9,6 +8,7 @@ import android.preference.EditTextPreference import android.preference.ListPreference import android.preference.Preference import android.preference.PreferenceFragment +import android.support.v7.app.AlertDialog import android.text.TextUtils import kotlinx.android.synthetic.main.dialog_app_info.view.* import net.lacolaco.smileessence.Application diff --git a/app/src/main/java/net/lacolaco/smileessence/view/ThreeStateButton.kt b/app/src/main/java/net/lacolaco/smileessence/view/ThreeStateButton.kt index 0f496385..8e516c36 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/ThreeStateButton.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/ThreeStateButton.kt @@ -2,11 +2,11 @@ package net.lacolaco.smileessence.view import android.content.Context import android.graphics.drawable.Drawable +import android.support.v7.widget.AppCompatButton import android.util.AttributeSet -import android.widget.Button import net.lacolaco.smileessence.R -class ThreeStateButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.buttonStyle, defStyleRes: Int = 0) : Button(context, attrs, defStyleAttr, defStyleRes) { +class ThreeStateButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.buttonStyle) : AppCompatButton(context, attrs, defStyleAttr) { var state = STATE_OFF set(s) { field = s diff --git a/app/src/main/java/net/lacolaco/smileessence/view/ToggleableImageButton.kt b/app/src/main/java/net/lacolaco/smileessence/view/ToggleableImageButton.kt index f83bcf56..cb1fd60e 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/ToggleableImageButton.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/ToggleableImageButton.kt @@ -2,11 +2,13 @@ package net.lacolaco.smileessence.view import android.content.Context import android.graphics.drawable.Drawable +import android.support.v7.widget.AppCompatButton +import android.support.v7.widget.AppCompatImageButton import android.util.AttributeSet import android.widget.ImageButton import net.lacolaco.smileessence.R -class ToggleableImageButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.imageButtonStyle, defStyleRes: Int = 0) : ImageButton(context, attrs, defStyleAttr, defStyleRes) { +class ToggleableImageButton @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.imageButtonStyle) : AppCompatImageButton(context, attrs, defStyleAttr) { private val onSrc: Drawable private val offSrc: Drawable diff --git a/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt b/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt index 2e739faa..452eb3f6 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/adapter/PageListAdapter.kt @@ -1,18 +1,27 @@ package net.lacolaco.smileessence.view.adapter +import android.app.Fragment +import android.app.FragmentManager +import android.app.FragmentTransaction import android.os.Bundle -import android.support.v13.app.FragmentPagerAdapter +import android.support.v4.view.PagerAdapter +import android.view.View +import android.view.ViewGroup +import net.lacolaco.smileessence.BuildConfig import net.lacolaco.smileessence.activity.MainActivity import net.lacolaco.smileessence.logging.Logger import net.lacolaco.smileessence.view.page.PageFragment import java.lang.ref.WeakReference import java.util.* -class PageListAdapter(_activity: MainActivity) : FragmentPagerAdapter(_activity.fragmentManager) { +class PageListAdapter(_activity: MainActivity) : PagerAdapter() { + private val mFragmentManager: FragmentManager = _activity.fragmentManager + private var mCurTransaction: FragmentTransaction? = null + private var mCurrentPrimaryItem: Fragment? = null private val pages = ArrayList() private val fragmentCache = HashMap>() - @Synchronized override fun getItem(position: Int): PageFragment { + @Synchronized fun getItem(position: Int): PageFragment { val pf: PageFragment val info = pages[position] try { @@ -38,24 +47,11 @@ class PageListAdapter(_activity: MainActivity) : FragmentPagerAdapter(_activity. return pages.size } - fun addPage(klass: Class, name: String, args: Bundle) { - this.addPage(klass, name, args, true) - } - fun addPage(klass: Class, name: String, args: Bundle, notifyChanged: Boolean) { pages.add(PageInfo(klass, name, args)) if (notifyChanged) notifyDataSetChanged() } - @Synchronized - fun removePage(position: Int): Boolean { - //if (removePageWithoutNotify(position)) { - // refreshListNavigation(); - // return true; - //} - return pages.removeAt(position) != null // TODO - } - fun getName(pos: Int): String { return pages[pos].name } @@ -71,4 +67,73 @@ class PageListAdapter(_activity: MainActivity) : FragmentPagerAdapter(_activity. } private class PageInfo internal constructor(val fragmentClass: Class, val name: String, val args: Bundle) + + override fun startUpdate(container: ViewGroup) { + assert(container.id != View.NO_ID) + } + + override fun instantiateItem(container: ViewGroup, position: Int): Any { + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction() + } + + val itemId = position.toLong() + + // Do we already have this fragment? + val name = "android:switcher:${container.id}:$itemId" + var fragment: Fragment? = mFragmentManager.findFragmentByTag(name) + if (fragment != null) { + if (BuildConfig.DEBUG) + Logger.verbose("Attaching item #$itemId: f=$fragment") + mCurTransaction!!.attach(fragment) + } else { + fragment = getItem(position) + if (BuildConfig.DEBUG) + Logger.verbose("Adding item #$itemId: f=$fragment") + mCurTransaction!!.add(container.id, fragment, "android:switcher:${container.id}:$itemId") + } + if (fragment !== mCurrentPrimaryItem) { + fragment.setMenuVisibility(false) + fragment.userVisibleHint = false + } + + return fragment + } + + override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { + if (mCurTransaction == null) { + mCurTransaction = mFragmentManager.beginTransaction() + } + if (BuildConfig.DEBUG) + Logger.verbose("Detaching item #" + position + ": f=" + `object` + + " v=" + (`object` as Fragment).view) + mCurTransaction!!.detach(`object` as Fragment) + } + + override fun setPrimaryItem(container: ViewGroup, position: Int, `object`: Any) { + val fragment = `object` as Fragment? + if (fragment !== mCurrentPrimaryItem) { + if (mCurrentPrimaryItem != null) { + mCurrentPrimaryItem!!.setMenuVisibility(false) + mCurrentPrimaryItem!!.userVisibleHint = false + } + if (fragment != null) { + fragment.setMenuVisibility(true) + fragment.userVisibleHint = true + } + mCurrentPrimaryItem = fragment + } + } + + override fun finishUpdate(container: ViewGroup) { + if (mCurTransaction != null) { + mCurTransaction!!.commitAllowingStateLoss() + mCurTransaction = null + mFragmentManager.executePendingTransactions() + } + } + + override fun isViewFromObject(view: View, `object`: Any): Boolean { + return (`object` as Fragment).view === view + } } diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/DisposeDialog.kt b/app/src/main/java/net/lacolaco/smileessence/view/dialog/DisposeDialog.kt deleted file mode 100644 index f827536c..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/DisposeDialog.kt +++ /dev/null @@ -1,10 +0,0 @@ -package net.lacolaco.smileessence.view.dialog - -import android.app.Dialog -import android.content.Context - -class DisposeDialog(context: Context) : Dialog(context) { - override fun show() { - dismiss() - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StackableDialogFragment.kt b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StackableDialogFragment.kt index 244d1e5b..28fc27be 100644 --- a/app/src/main/java/net/lacolaco/smileessence/view/dialog/StackableDialogFragment.kt +++ b/app/src/main/java/net/lacolaco/smileessence/view/dialog/StackableDialogFragment.kt @@ -3,6 +3,7 @@ package net.lacolaco.smileessence.view.dialog import android.app.Dialog import android.app.DialogFragment import android.os.Bundle +import android.support.v7.app.AppCompatDialog import android.view.Window import net.lacolaco.smileessence.World import net.lacolaco.smileessence.activity.MainActivity @@ -14,8 +15,8 @@ import net.lacolaco.smileessence.view.DialogHelper * Shows a dialog with no title by default. */ open class StackableDialogFragment : DialogFragment() { - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog? { - return Dialog(activity).apply { requestWindowFeature(Window.FEATURE_NO_TITLE) } + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + return AppCompatDialog(activity).apply { requestWindowFeature(Window.FEATURE_NO_TITLE) } } override fun dismiss() { diff --git a/app/src/main/res/drawable/button_selector_transparent.xml b/app/src/main/res/drawable/button_selector_transparent.xml deleted file mode 100644 index 98181935..00000000 --- a/app/src/main/res/drawable/button_selector_transparent.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_menu_list.xml b/app/src/main/res/layout/dialog_menu_list.xml deleted file mode 100644 index 324e18e0..00000000 --- a/app/src/main/res/layout/dialog_menu_list.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - diff --git a/app/src/main/res/layout/dialog_user_detail.xml b/app/src/main/res/layout/dialog_user_detail.xml index 6a300d60..49126825 100644 --- a/app/src/main/res/layout/dialog_user_detail.xml +++ b/app/src/main/res/layout/dialog_user_detail.xml @@ -79,7 +79,7 @@ android:layout_height="wrap_content" android:clickable="true" android:text="screen_name" - android:textColor="?android:attr/colorAccent" + android:textColor="?colorAccent" android:textSize="16sp" /> diff --git a/app/src/main/res/layout/fragment_post.xml b/app/src/main/res/layout/fragment_post.xml index 611a4026..a87b5365 100644 --- a/app/src/main/res/layout/fragment_post.xml +++ b/app/src/main/res/layout/fragment_post.xml @@ -11,7 +11,7 @@ android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:elevation="2dp" - android:background="?android:colorBackgroundFloating"> + android:background="?colorBackgroundFloating"> diff --git a/app/src/main/res/layout/layout_edit_list.xml b/app/src/main/res/layout/layout_edit_list.xml index c326e412..e8aca0f7 100644 --- a/app/src/main/res/layout/layout_edit_list.xml +++ b/app/src/main/res/layout/layout_edit_list.xml @@ -1,10 +1,18 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> + + - + android:fastScrollEnabled="true" /> + diff --git a/app/src/main/res/layout/layout_license.xml b/app/src/main/res/layout/layout_license.xml index 7cd11d55..52c0fefb 100644 --- a/app/src/main/res/layout/layout_license.xml +++ b/app/src/main/res/layout/layout_license.xml @@ -1,6 +1,14 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> + + - + diff --git a/app/src/main/res/layout/layout_main.xml b/app/src/main/res/layout/layout_main.xml index 12904065..dbe1fc77 100644 --- a/app/src/main/res/layout/layout_main.xml +++ b/app/src/main/res/layout/layout_main.xml @@ -4,6 +4,13 @@ android:layout_height="match_parent" android:orientation="vertical"> + + + + + + + diff --git a/app/src/main/res/layout/layout_setting.xml b/app/src/main/res/layout/layout_setting.xml index b0885afe..51ef6f20 100644 --- a/app/src/main/res/layout/layout_setting.xml +++ b/app/src/main/res/layout/layout_setting.xml @@ -1,10 +1,18 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> + + - + diff --git a/app/src/main/res/menu/edit_list.xml b/app/src/main/res/menu/edit_list.xml index 42109149..8a41e7cb 100644 --- a/app/src/main/res/menu/edit_list.xml +++ b/app/src/main/res/menu/edit_list.xml @@ -1,7 +1,8 @@ - + diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml index 9b0210fc..eea3bbb5 100644 --- a/app/src/main/res/menu/main.xml +++ b/app/src/main/res/menu/main.xml @@ -1,16 +1,17 @@ - + diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 19965c3e..e17ba426 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -1,6 +1,5 @@ textSize - confirm theme appInfo licenseNotice diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31f9adec..f1c33e49 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,7 +6,6 @@ Thanks to miz_hi, yaplus, firstspring1845, ahiru3net, unyuho123, karno, ret156, vividtomato_, hoyo203, brsywe, NTTrf, mikamikafever twitter4j - Crouton Volley twitter-text App Setting @@ -61,12 +60,10 @@ Loading Info Timeline - About Add OK to close? Execute, OK? Are you sure you want to remove this account @%s? - Select a list\ Delete this query, OK? Succeeded to favorite Failed to favorite diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d30b8244..62286a83 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,11 +1,12 @@ - - - diff --git a/build.gradle b/build.gradle index b234098e..3f35586f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0-beta7' + classpath 'com.android.tools.build:gradle:3.0.0-rc1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } -- cgit v1.2.3