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