Add support for selecting account when sharing from outside apps (#1011)
* Add direct-share support (API 23+) * Add account selection dialog for non-direct sharingmain
parent
f3e57bce1e
commit
549789b283
@ -0,0 +1,58 @@ |
||||
/* Copyright 2019 Levi Bard |
||||
* |
||||
* This file is a part of Tusky. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the |
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even |
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
||||
* Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License along with Tusky; if not, |
||||
* see <http://www.gnu.org/licenses>. */ |
||||
|
||||
package com.keylesspalace.tusky.adapter |
||||
|
||||
import android.content.Context |
||||
import android.text.TextUtils |
||||
import android.view.LayoutInflater |
||||
import android.view.View |
||||
import android.view.ViewGroup |
||||
import android.widget.ArrayAdapter |
||||
import com.keylesspalace.tusky.R |
||||
import com.keylesspalace.tusky.db.AccountEntity |
||||
import com.keylesspalace.tusky.util.CustomEmojiHelper |
||||
import com.squareup.picasso.Picasso |
||||
|
||||
import kotlinx.android.synthetic.main.item_autocomplete_account.view.* |
||||
|
||||
class AccountSelectionAdapter(context: Context): ArrayAdapter<AccountEntity>(context, R.layout.item_autocomplete_account) { |
||||
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { |
||||
var view = convertView |
||||
|
||||
if (convertView == null) { |
||||
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater |
||||
view = layoutInflater.inflate(R.layout.item_autocomplete_account, parent, false) |
||||
} |
||||
view!! |
||||
|
||||
val account = getItem(position) |
||||
if (account != null) { |
||||
val username = view.username |
||||
val displayName = view.display_name |
||||
val avatar = view.avatar |
||||
username.text = account.fullName |
||||
displayName.text = CustomEmojiHelper.emojifyString(account.displayName, account.emojis, displayName) |
||||
if (!TextUtils.isEmpty(account.profilePictureUrl)) { |
||||
Picasso.with(context) |
||||
.load(account.profilePictureUrl) |
||||
.placeholder(R.drawable.avatar_default) |
||||
.into(avatar) |
||||
} |
||||
} |
||||
|
||||
return view |
||||
} |
||||
} |
@ -0,0 +1,22 @@ |
||||
/* Copyright 2019 Levi Bard |
||||
* |
||||
* This file is a part of Tusky. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the |
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even |
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
||||
* Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License along with Tusky; if not, |
||||
* see <http://www.gnu.org/licenses>. */ |
||||
|
||||
package com.keylesspalace.tusky.interfaces |
||||
|
||||
import com.keylesspalace.tusky.db.AccountEntity |
||||
|
||||
interface AccountSelectionListener { |
||||
fun onAccountSelected(account: AccountEntity) |
||||
} |
@ -0,0 +1,61 @@ |
||||
/* Copyright 2019 Levi Bard |
||||
* |
||||
* This file is a part of Tusky. |
||||
* |
||||
* This program is free software; you can redistribute it and/or modify it under the terms of the |
||||
* GNU General Public License as published by the Free Software Foundation; either version 3 of the |
||||
* License, or (at your option) any later version. |
||||
* |
||||
* Tusky is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even |
||||
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
||||
* Public License for more details. |
||||
* |
||||
* You should have received a copy of the GNU General Public License along with Tusky; if not, |
||||
* see <http://www.gnu.org/licenses>. */ |
||||
|
||||
package com.keylesspalace.tusky.service |
||||
|
||||
import android.annotation.TargetApi |
||||
import android.content.ComponentName |
||||
import android.content.IntentFilter |
||||
import android.graphics.drawable.Icon |
||||
import android.os.Bundle |
||||
import android.service.chooser.ChooserTarget |
||||
import android.service.chooser.ChooserTargetService |
||||
import android.text.TextUtils |
||||
import com.keylesspalace.tusky.R |
||||
import com.keylesspalace.tusky.db.AccountManager |
||||
import com.keylesspalace.tusky.di.Injectable |
||||
import com.keylesspalace.tusky.util.NotificationHelper |
||||
import com.squareup.picasso.Picasso |
||||
import dagger.android.AndroidInjection |
||||
import javax.inject.Inject |
||||
|
||||
@TargetApi(23) |
||||
class AccountChooserService : ChooserTargetService(), Injectable { |
||||
@Inject |
||||
lateinit var accountManager: AccountManager |
||||
|
||||
override fun onCreate() { |
||||
super.onCreate() |
||||
AndroidInjection.inject(this) |
||||
} |
||||
|
||||
override fun onGetChooserTargets(targetActivityName: ComponentName?, intentFilter: IntentFilter?): MutableList<ChooserTarget> { |
||||
val targets = mutableListOf<ChooserTarget>() |
||||
for (account in accountManager.getAllAccountsOrderedByActive()) { |
||||
val icon: Icon = if (TextUtils.isEmpty(account.profilePictureUrl)) { |
||||
Icon.createWithResource(applicationContext, R.drawable.avatar_default) |
||||
} else { |
||||
Icon.createWithBitmap(Picasso.with(this).load(account.profilePictureUrl) |
||||
.error(R.drawable.avatar_default) |
||||
.placeholder(R.drawable.avatar_default) |
||||
.get()) |
||||
} |
||||
val bundle = Bundle() |
||||
bundle.putLong(NotificationHelper.ACCOUNT_ID, account.id) |
||||
targets.add(ChooserTarget(account.displayName, icon, 1.0f, targetActivityName, bundle)) |
||||
} |
||||
return targets |
||||
} |
||||
} |
Loading…
Reference in new issue