From 91b7a80ae0265fbfb09cdfcb8f7d45a784daefb3 Mon Sep 17 00:00:00 2001 From: Kazuki Yamaguchi Date: Fri, 20 Oct 2017 18:18:59 +0900 Subject: SE4 --- app/src/main/AndroidManifest.xml | 4 +- .../main/java/net/lacolaco/smileessence/World.kt | 8 +- .../lacolaco/smileessence/activity/MainActivity.kt | 6 +- .../activity/ManageAccountsActivity.kt | 205 -------------------- .../activity/ManageProfilesActivity.kt | 215 +++++++++++++++++++++ .../net/lacolaco/smileessence/data/DbHelper.kt | 32 +-- .../lacolaco/smileessence/data/ExtractionWord.kt | 1 + .../main/res/layout/activity_manage_profiles.xml | 17 ++ app/src/main/res/layout/layout_manage_accounts.xml | 18 -- app/src/main/res/layout/list_item_account.xml | 31 --- app/src/main/res/layout/list_item_profile.xml | 31 +++ app/src/main/res/values/strings.xml | 3 +- 12 files changed, 281 insertions(+), 290 deletions(-) delete mode 100644 app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt create mode 100644 app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt create mode 100644 app/src/main/res/layout/activity_manage_profiles.xml delete mode 100644 app/src/main/res/layout/layout_manage_accounts.xml delete mode 100644 app/src/main/res/layout/list_item_account.xml create mode 100644 app/src/main/res/layout/list_item_profile.xml (limited to 'app') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index caca3a96..0bebec79 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ android:label="@string/app_name" android:theme="@style/theme_light"> + android:parentActivityName=".activity.ManageProfilesActivity" /> diff --git a/app/src/main/java/net/lacolaco/smileessence/World.kt b/app/src/main/java/net/lacolaco/smileessence/World.kt index ed2bddad..c5377232 100644 --- a/app/src/main/java/net/lacolaco/smileessence/World.kt +++ b/app/src/main/java/net/lacolaco/smileessence/World.kt @@ -27,7 +27,7 @@ import java.util.* import java.util.concurrent.ConcurrentHashMap /** - * World contains data that are specific to an account. + * World contains data that are specific to a profile. */ class World private constructor(private val persistentData: PersistentData) { val id = persistentData.id @@ -273,7 +273,7 @@ class World private constructor(private val persistentData: PersistentData) { private val cache = LinkedHashMap() operator fun get(i: Long) = - cache[i] ?: throw IllegalStateException("[BUG] Account with id == $i not found") + cache[i] ?: throw IllegalStateException("[BUG] World with id == $i not found") fun all() = ArrayList(cache.values) @@ -312,7 +312,7 @@ class World private constructor(private val persistentData: PersistentData) { values.put("page_infos", PageInfo.stringifyList(pageInfos)) values.put("theme", themeIndex) values.put("theme_color", themeColor) - if (DbHelper.db.replaceOrThrow("accounts", null, values) == -1L) + if (DbHelper.db.replaceOrThrow("profiles", null, values) == -1L) throw RuntimeException("SQLiteDatabase#replaceOrThrow failed") } @@ -331,7 +331,7 @@ class World private constructor(private val persistentData: PersistentData) { fun fetchAll(): List { val ret = arrayListOf() - DbHelper.db.query("accounts", null, null, null, null, null, null).use { cursor -> + DbHelper.db.query("profiles", null, null, null, null, null, null).use { cursor -> while (cursor != null && cursor.moveToNext()) { val pd = PersistentData( id = cursor.getLong( 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 631350eb..4edb2aca 100644 --- a/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt +++ b/app/src/main/java/net/lacolaco/smileessence/activity/MainActivity.kt @@ -270,8 +270,8 @@ class MainActivity : AppCompatActivity() { override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { - val intent = Intent(this, ManageAccountsActivity::class.java) - intent.putExtra(ManageAccountsActivity.INTENT_KEY_NOINIT, true) + val intent = Intent(this, ManageProfilesActivity::class.java) + intent.putExtra(ManageProfilesActivity.INTENT_KEY_NOINIT, true) startActivity(intent) } R.id.actionbar_setting -> startActivity(Intent(this, SettingActivity::class.java)) @@ -303,7 +303,7 @@ class MainActivity : AppCompatActivity() { // properly when resuming an already running Activity that has configured as // documentLaunchMode=intoExisting. So, as a workaround, store the actual Intent in // the World associated and check it in onResume() for now. See also - // ManageAccountsActivity::goToWorld(). + // ManageProfilesActivity::goToWorld(). val intent = world.mainActivityIntent if (intent != null) { world.mainActivityIntent = null diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt deleted file mode 100644 index 8acbe2c3..00000000 --- a/app/src/main/java/net/lacolaco/smileessence/activity/ManageAccountsActivity.kt +++ /dev/null @@ -1,205 +0,0 @@ -package net.lacolaco.smileessence.activity - -import android.Manifest -import android.content.Intent -import android.content.pm.PackageManager -import android.graphics.Bitmap -import android.graphics.Color -import android.net.Uri -import android.os.Bundle -import android.support.v13.app.ActivityCompat -import android.support.v4.content.ContextCompat -import android.support.v4.content.pm.ShortcutInfoCompat -import android.support.v4.content.pm.ShortcutManagerCompat -import android.support.v4.graphics.drawable.IconCompat -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.BaseAdapter -import android.widget.ImageView -import com.android.volley.toolbox.ImageRequest -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 -import net.lacolaco.smileessence.World -import net.lacolaco.smileessence.data.ImageCache -import net.lacolaco.smileessence.util.launchBg -import net.lacolaco.smileessence.util.launchUi -import net.lacolaco.smileessence.view.confirm -import java.util.* - -class ManageAccountsActivity : AppCompatActivity() { - private val adapter by lazy { EditAccountsAdapter() } - private lateinit var receivedIntent: Intent - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - receivedIntent = Intent(intent) - - // If the activity is started from launcher - if (!intent.getBooleanExtra(INTENT_KEY_NOINIT, false)) { - if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(this, - arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), - REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION) - else if (Application.currentWorld != null) { - // Skip this activity if app is already started - goToWorld(Application.currentWorld!!) - return - } - } - - setContentView(R.layout.layout_manage_accounts) - setSupportActionBar(toolbar) - - listview_edit_list.adapter = adapter - listview_edit_list.setOnItemClickListener { _, _, i, _ -> - val world = adapter.getItem(i) - goToWorld(World[world.id]) - } - } - - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - receivedIntent = Intent(intent) - } - - override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, - grantResults: IntArray) { - when (requestCode) { - REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION -> { - if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { - if (Application.currentWorld != null) { - goToWorld(Application.currentWorld!!) - } - } else { - Application.toast(R.string.notice_error_storage_permission) - finish() - } - } - } - } - - private fun goToWorld(world: World) { - finish() - world.mainActivityIntent = receivedIntent - val intent = Intent(this, MainActivity::class.java) - intent.data = Uri.parse("smileessence://mainactivity/?user_id=" + world.id) - startActivity(intent) - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - val add = menu.add(Menu.NONE, R.id.menu_edit_list_add, Menu.NONE, "") - add.setIcon(android.R.drawable.ic_menu_add) - add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - when (item.itemId) { - R.id.menu_edit_list_add -> - startActivityForResult(Intent(this, OAuthActivity::class.java), REQUEST_OAUTH) - else -> return super.onOptionsItemSelected(item) - } - return true - } - - override fun onBackPressed() { - safeFinish() - } - - private fun safeFinish() { - val currentWorld = Application.currentWorld - if (currentWorld != null) { - goToWorld(currentWorld) - } else { - setResult(RESULT_CANCELED) - finish() - } - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - assert(requestCode == REQUEST_OAUTH) - if (resultCode == RESULT_OK) { - launchBg { - data!! - adapter.add(World.register( - data.getStringExtra(OAuthActivity.KEY_TOKEN), - data.getStringExtra(OAuthActivity.KEY_TOKEN_SECRET), - data.getLongExtra(OAuthActivity.KEY_USER_ID, -1L), - data.getStringExtra(OAuthActivity.KEY_SCREEN_NAME))) - launchUi { adapter.notifyDataSetChanged() } - } - } - } - - private inner class EditAccountsAdapter : BaseAdapter() { - private val worlds: MutableList = ArrayList(World.all()) - - override fun getCount(): Int = worlds.size - - override fun getItem(position: Int) = worlds[position] - - override fun getItemId(position: Int): Long = worlds[position].id - - override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - val view = convertView ?: layoutInflater.inflate(R.layout.list_item_account, parent, - false) - val world = getItem(position) - - if (world.themeColor != -1) - view.account_accent_color_view.setBackgroundColor(world.themeColor) - else - view.account_accent_color_view.setBackgroundColor(Color.TRANSPARENT) - view.account_icon.setImageUrl(world.user.profileImageUrl, ImageCache.getImageLoader()) - view.account_text_view.text = "@${world.user.screenName}" - view.account_action_menu.clear() - view.account_action_menu.add("Remove") { - confirm(R.string.dialog_confirm_clear_account, world.user.screenName) { - worlds.removeAt(position) - notifyDataSetChanged() - // TODO: Account.unregister(account.id) - // TODO: Stop the world - } - } - view.account_action_menu.add("Add to homescreen") { - val data = Uri.parse("smileessence://mainactivity/?user_id=" + world.id) - val shortcutIntent = Intent(Intent.ACTION_VIEW, data) - - ImageCache.getRequestQueue().add(ImageRequest(world.user.profileImageUrl, { b -> - if (isDestroyed) - return@ImageRequest - val id = "mainactivity-${world.id}" - val shortcutInfo = ShortcutInfoCompat.Builder(this@ManageAccountsActivity, id) - .setShortLabel("@${world.user.screenName}") - .setIcon(IconCompat.createWithAdaptiveBitmap(b)) - .setIntent(shortcutIntent) - .build() - ShortcutManagerCompat.requestPinShortcut(this@ManageAccountsActivity, shortcutInfo, null) - }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_4444, { error -> - error.printStackTrace() - })) - } - return view - } - - fun add(world: World): Int = if (!worlds.contains(world)) { - worlds.add(world) - notifyDataSetChanged() - worlds.size - 1 - } else { - worlds.indexOf(world) - } - } - - companion object { - val INTENT_KEY_NOINIT = "noInit" - private val REQUEST_OAUTH = 10 - private val REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION = 11 - } -} diff --git a/app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt b/app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt new file mode 100644 index 00000000..3c4c50c9 --- /dev/null +++ b/app/src/main/java/net/lacolaco/smileessence/activity/ManageProfilesActivity.kt @@ -0,0 +1,215 @@ +package net.lacolaco.smileessence.activity + +import android.Manifest +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Bitmap +import android.graphics.Color +import android.net.Uri +import android.os.Bundle +import android.support.v13.app.ActivityCompat +import android.support.v4.content.ContextCompat +import android.support.v4.content.pm.ShortcutInfoCompat +import android.support.v4.content.pm.ShortcutManagerCompat +import android.support.v4.graphics.drawable.IconCompat +import android.support.v7.app.AppCompatActivity +import android.support.v7.widget.DividerItemDecoration +import android.support.v7.widget.LinearLayoutManager +import android.support.v7.widget.RecyclerView +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import com.android.volley.toolbox.ImageRequest +import kotlinx.android.synthetic.main.activity_manage_profiles.* +import kotlinx.android.synthetic.main.list_item_profile.view.* +import net.lacolaco.smileessence.Application +import net.lacolaco.smileessence.R +import net.lacolaco.smileessence.World +import net.lacolaco.smileessence.data.ImageCache +import net.lacolaco.smileessence.util.bg +import net.lacolaco.smileessence.util.launchUi +import net.lacolaco.smileessence.view.confirm + +class ManageProfilesActivity : AppCompatActivity() { + private lateinit var adapter: ProfilesAdapter + private lateinit var receivedIntent: Intent + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + receivedIntent = Intent(intent) + + // If the activity is started from launcher + if (!intent.getBooleanExtra(INTENT_KEY_NOINIT, false)) { + if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) + ActivityCompat.requestPermissions(this, + arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), + REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION) + else if (Application.currentWorld != null) { + // Skip this activity if app is already started + goToWorld(Application.currentWorld!!) + return + } + } + + setContentView(R.layout.activity_manage_profiles) + setSupportActionBar(toolbar) + + profiles.addItemDecoration(DividerItemDecoration(this, DividerItemDecoration.VERTICAL)) + profiles.layoutManager = LinearLayoutManager(this) + adapter = ProfilesAdapter(World.all()) + profiles.adapter = adapter + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + receivedIntent = Intent(intent) + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, + grantResults: IntArray) { + when (requestCode) { + REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION -> { + if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) { + if (Application.currentWorld != null) { + goToWorld(Application.currentWorld!!) + } + } else { + Application.toast(R.string.notice_error_storage_permission) + finish() + } + } + } + } + + private fun goToWorld(world: World) { + finish() + world.mainActivityIntent = receivedIntent + val intent = Intent(this, MainActivity::class.java) + intent.data = Uri.parse("smileessence://mainactivity/?user_id=" + world.id) + startActivity(intent) + } + + override fun onCreateOptionsMenu(menu: Menu): Boolean { + val add = menu.add(Menu.NONE, R.id.menu_edit_list_add, Menu.NONE, "") + add.setIcon(android.R.drawable.ic_menu_add) + add.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM) + return true + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_edit_list_add -> + startActivityForResult(Intent(this, OAuthActivity::class.java), REQUEST_OAUTH) + else -> return super.onOptionsItemSelected(item) + } + return true + } + + override fun onBackPressed() { + safeFinish() + } + + private fun safeFinish() { + val currentWorld = Application.currentWorld + if (currentWorld != null) { + goToWorld(currentWorld) + } else { + setResult(RESULT_CANCELED) + finish() + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + assert(requestCode == REQUEST_OAUTH) + if (resultCode == RESULT_OK) { + launchUi { + data!! + val world = bg { + World.register( + data.getStringExtra(OAuthActivity.KEY_TOKEN), + data.getStringExtra(OAuthActivity.KEY_TOKEN_SECRET), + data.getLongExtra(OAuthActivity.KEY_USER_ID, -1L), + data.getStringExtra(OAuthActivity.KEY_SCREEN_NAME)) + }.await() + adapter.add(world) + } + } + } + + private inner class ProfilesAdapter(initialList: Collection) : + RecyclerView.Adapter() { + private val profiles = ArrayList(initialList) + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(layoutInflater.inflate(R.layout.list_item_profile, parent, false)) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + val world = profiles[position] + val view = holder.itemView + + view.setOnClickListener { + goToWorld(world) + } + if (world.themeColor != -1) + view.profile_accent_color_view.setBackgroundColor(world.themeColor) + else + view.profile_accent_color_view.setBackgroundColor(Color.TRANSPARENT) + view.profile_user_icon.setImageUrl(world.user.profileImageUrl, ImageCache.getImageLoader()) + view.profile_name.text = "@${world.user.screenName}" + view.profile_action_menu.clear() + view.profile_action_menu.add("Remove") { + confirm(R.string.dialog_confirm_remove_profile, world.user.screenName) { + profiles.removeAt(position) + notifyDataSetChanged() + // TODO: Account.unregister(account.id) + // TODO: Stop the world + } + } + view.profile_action_menu.add("Add to homescreen") { + val data = Uri.parse("smileessence://mainactivity/?user_id=" + world.id) + val shortcutIntent = Intent(Intent.ACTION_VIEW, data) + + ImageCache.getRequestQueue().add(ImageRequest(world.user.profileImageUrl, { b -> + if (isDestroyed) + return@ImageRequest + val id = "mainactivity-${world.id}" + val shortcutInfo = ShortcutInfoCompat.Builder(this@ManageProfilesActivity, id) + .setShortLabel("@${world.user.screenName}") + .setIcon(IconCompat.createWithAdaptiveBitmap(b)) + .setIntent(shortcutIntent) + .build() + ShortcutManagerCompat.requestPinShortcut(this@ManageProfilesActivity, shortcutInfo, null) + }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_4444, { error -> + error.printStackTrace() + })) + } + } + + override fun getItemCount(): Int { + return profiles.size + } + + fun add(item: World) { + if (profiles.indexOf(item) != -1) + notifyItemChanged(profiles.indexOf(item)) + else { + val pos = profiles.size + profiles.add(item) + notifyItemInserted(pos) + } + } + + private inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) + } + + companion object { + val INTENT_KEY_NOINIT = "noInit" + private val REQUEST_OAUTH = 10 + private val REQUEST_WRITE_EXTERNAL_STORAGE_PERMISSION = 11 + } +} 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 eb1b3a73..38d76bd6 100644 --- a/app/src/main/java/net/lacolaco/smileessence/data/DbHelper.kt +++ b/app/src/main/java/net/lacolaco/smileessence/data/DbHelper.kt @@ -9,46 +9,28 @@ class DbHelper private constructor(context: Context) : override fun onCreate(db: SQLiteDatabase) { // Schema v1 db.execSQL(""" - CREATE TABLE accounts ( + CREATE TABLE profiles ( id INTEGER PRIMARY KEY, oauth_token TEXT NOT NULL, oauth_token_secret TEXT NOT NULL, screen_name TEXT NOT NULL, profile_image_url TEXT NOT NULL, - theme INTEGER NOT NULL + theme INTEGER NOT NULL, + theme_color INTEGER NOT NULL, + page_infos TEXT NOT NULL ) """) onUpgrade(db, 1, DATABASE_VERSION) } override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) { - if (oldVersion < 3) { - // Add accounts.themeColor - db.execSQL(""" - ALTER TABLE accounts ADD COLUMN theme_color INTEGER NOT NULL DEFAULT 0 - """) - } - - if (oldVersion < 4) { - // Add extraction_words - db.execSQL(""" - CREATE TABLE extraction_words ( - pattern_string TEXT PRIMARY KEY - ) - """) - } - - if (oldVersion < 5) { - // Add accounts.page_infos - db.execSQL(""" - ALTER TABLE accounts ADD COLUMN page_infos TEXT NOT NULL DEFAULT "[]" - """) + if (oldVersion < 1) { } } companion object { private val DATABASE_NAME = "main.db" - private val DATABASE_VERSION = 5 + private val DATABASE_VERSION = 1 // Lifetime is same as Application private lateinit var instance: DbHelper @@ -58,6 +40,6 @@ class DbHelper private constructor(context: Context) : } val db - get() = instance.writableDatabase + get() = instance.writableDatabase!! } } 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 93d13dd6..5f533112 100644 --- a/app/src/main/java/net/lacolaco/smileessence/data/ExtractionWord.kt +++ b/app/src/main/java/net/lacolaco/smileessence/data/ExtractionWord.kt @@ -3,6 +3,7 @@ package net.lacolaco.smileessence.data import android.content.ContentValues import java.util.regex.Pattern +@Deprecated("Remove when ManagePagesActivity is done") class ExtractionWord private constructor(val patternString: String) { val pattern: Pattern by lazy { Pattern.compile(patternString) diff --git a/app/src/main/res/layout/activity_manage_profiles.xml b/app/src/main/res/layout/activity_manage_profiles.xml new file mode 100644 index 00000000..81f2606e --- /dev/null +++ b/app/src/main/res/layout/activity_manage_profiles.xml @@ -0,0 +1,17 @@ + + + + + + diff --git a/app/src/main/res/layout/layout_manage_accounts.xml b/app/src/main/res/layout/layout_manage_accounts.xml deleted file mode 100644 index e8aca0f7..00000000 --- a/app/src/main/res/layout/layout_manage_accounts.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/list_item_account.xml b/app/src/main/res/layout/list_item_account.xml deleted file mode 100644 index 14fc2ac2..00000000 --- a/app/src/main/res/layout/list_item_account.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - diff --git a/app/src/main/res/layout/list_item_profile.xml b/app/src/main/res/layout/list_item_profile.xml new file mode 100644 index 00000000..ebbba597 --- /dev/null +++ b/app/src/main/res/layout/list_item_profile.xml @@ -0,0 +1,31 @@ + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 48d16bbb..7ef10eeb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,7 +50,7 @@ Add OK to close? Execute, OK? - Are you sure you want to remove this account @%s? + Are you sure you want to remove the profile for @%s? Delete this query, OK? Succeeded to favorite Failed to favorite @@ -108,7 +108,6 @@ Add to reply Failed to get user timeline Failed to get list timeline - You can\'t remove last account Write access to external storage is required. PageManageActivity -- cgit v1.2.3