「別アカウントでお気に入り/ブースト/返信/フォロー/プロフ/メッセージ」のアカウント選択ダイアログで同タンスのアカウントを先頭に表示する

This commit is contained in:
tateisu 2017-09-15 03:28:55 +09:00
parent 6831d31664
commit 57e17a41cf
6 changed files with 178 additions and 140 deletions

View File

@ -9,8 +9,8 @@ android {
applicationId "jp.juggler.subwaytooter"
minSdkVersion 21
targetSdkVersion 26
versionCode 150
versionName "1.5.0"
versionCode 151
versionName "1.5.1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

View File

@ -238,7 +238,6 @@ public class ActMain extends AppCompatActivity
}
}
// 各カラムのアカウント設定を読み直す
reloadAccountSetting();
@ -250,8 +249,6 @@ public class ActMain extends AppCompatActivity
column.onStart( this );
}
// カラムの表示範囲インジケータを更新
updateColumnStripSelection( - 1, - 1f );
@ -316,7 +313,6 @@ public class ActMain extends AppCompatActivity
}
pref.edit().putInt( Pref.KEY_LAST_COLUMN_POS, column_pos ).apply();
super.onPause();
}
@ -371,8 +367,6 @@ public class ActMain extends AppCompatActivity
}
}
@Override public void onClick( View v ){
switch( v.getId() ){
case R.id.btnMenu:
@ -410,7 +404,6 @@ public class ActMain extends AppCompatActivity
}
}
post_helper.content = etQuickToot.getText().toString().trim();
post_helper.spoiler_text = null;
post_helper.visibility = account.visibility;
@ -1252,7 +1245,7 @@ public class ActMain extends AppCompatActivity
String username = "?";
String full_acct = username + "@" + host;
SavedAccount account = SavedAccount.loadPseudoAccount( this,log, full_acct );
SavedAccount account = SavedAccount.loadAccountByAcct( this, log, full_acct );
if( account != null ){
return account;
}
@ -1809,7 +1802,6 @@ public class ActMain extends AppCompatActivity
Utils.showToast( ActMain.this, false, R.string.app_was_muted );
}
//////////////////////////////////////////////////////////////
interface FindAccountCallback {
@ -2043,7 +2035,6 @@ public class ActMain extends AppCompatActivity
// ソートする
SavedAccount.sort( account_list );
ArrayList< SavedAccount > list_original = new ArrayList<>();
ArrayList< SavedAccount > list_original_pseudo = new ArrayList<>();
ArrayList< SavedAccount > list_other = new ArrayList<>();
@ -2191,8 +2182,6 @@ public class ActMain extends AppCompatActivity
return;
}
openChromeTab( pos, (SavedAccount) span.lcc, span.url, false );
}
};
@ -2230,11 +2219,15 @@ public class ActMain extends AppCompatActivity
ActPost.open( this, REQUEST_CODE_POST, account.db_id, "@" + account.getFullAcct( who ) + " " );
}
public void performMentionFromAnotherAccount( SavedAccount access_info, final TootAccount who, ArrayList< SavedAccount > account_list_non_pseudo ){
public void performMentionFromAnotherAccount( SavedAccount access_info, @Nullable final TootAccount who ){
if( who == null ) return;
String who_host = access_info.getAccountHost( who );
final String initial_text = "@" + access_info.getFullAcct( who ) + " ";
AccountPicker.pick( this, false, false
, getString( R.string.account_picker_toot )
, account_list_non_pseudo, new AccountPicker.AccountPickerCallback() {
, makeAccountList( log, false, who_host )
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount ai ){
ActPost.open( ActMain.this, REQUEST_CODE_POST, ai.db_id, initial_text );
}
@ -2314,9 +2307,13 @@ public class ActMain extends AppCompatActivity
}.executeOnExecutor( App1.task_executor );
}
void openProfileFromAnotherAccount( final int pos, @NonNull final SavedAccount access_info, final TootAccount who ){
void openProfileFromAnotherAccount( final int pos, @NonNull final SavedAccount access_info, @Nullable final TootAccount who ){
if( who == null ) return;
String who_host = access_info.getAccountHost( who );
AccountPicker.pick( this, false, false
, getString( R.string.account_picker_open_user_who, AcctColor.getNickname( who.acct ) )
, makeAccountList( log, false, who_host )
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount ai ){
if( ai.host.equalsIgnoreCase( access_info.host ) ){
@ -2370,23 +2367,18 @@ public class ActMain extends AppCompatActivity
// 文脈がないもしくは疑似アカウントだった
// 疑似アカウントではユーザ情報APIを呼べないし検索APIも使えない
// 疑似ではないアカウントの一覧
ArrayList< SavedAccount > account_list_filtered = new ArrayList<>();
for( SavedAccount a : SavedAccount.loadAccountList( ActMain.this, log ) ){
if( a.isPseudo() ) continue;
account_list_filtered.add( a );
}
if( account_list_filtered.isEmpty() ){
// アカウントがないのでchrome tab で開くしかない
if( ! SavedAccount.hasRealAccount(log) ){
// 疑似アカウントではユーザ情報APIを呼べないし検索APIも使えない
// chrome tab で開くしかない
openChromeTab( pos, access_info, url, true );
}else{
// アカウントを選択して開く
AccountPicker.pick( this, false, false
, getString( R.string.account_picker_open_user_who, AcctColor.getNickname( user + "@" + host ) )
, account_list_filtered
, makeAccountList( log,false,host )
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount ai ){
openProfileRemote( pos, ai, url );
@ -2813,10 +2805,11 @@ public class ActMain extends AppCompatActivity
// static final Pattern reUriActivityPubToot = Pattern.compile( "tag:([^,]*),[^:]*:objectId=(\\d+):objectType=Status", Pattern.CASE_INSENSITIVE );
public void openStatusOtherInstance( int pos, @NonNull SavedAccount access_info, @NonNull TootStatusLike status ){
if( status.account == null ){
public void openStatusOtherInstance( int pos, @NonNull SavedAccount access_info, @Nullable TootStatusLike status ){
// アカウント情報がないと出来ないことがある
}else if( status instanceof MSPToot ){
if( status == null || status.account == null ) return;
if( status instanceof MSPToot ){
// トゥート検索の場合
openStatusOtherInstance( pos, access_info, status.url
, status.id
@ -3119,7 +3112,8 @@ public class ActMain extends AppCompatActivity
for( Column column : app_state.column_list ){
column.findStatus( access_info.host, new_status.id, new Column.StatusEntryCallback() {
@Override public boolean onIterate( SavedAccount account, TootStatus status ){
@Override
public boolean onIterate( SavedAccount account, TootStatus status ){
status.pinned = bSet;
return true;
}
@ -4055,6 +4049,7 @@ public class ActMain extends AppCompatActivity
Utils.showToast( ActMain.this, false, R.string.unboost_succeeded );
}
};
private void openOSSLicense(){
startActivity( new Intent( this, ActOSSLicense.class ) );
}
@ -4194,6 +4189,20 @@ public class ActMain extends AppCompatActivity
return dst;
}
private ArrayList< SavedAccount > makeAccountList( @NonNull LogCategory log, boolean bAllowPseudo, @Nullable String pickup_host ){
ArrayList< SavedAccount > list_same_host = new ArrayList<>();
ArrayList< SavedAccount > list_other_host = new ArrayList<>();
for( SavedAccount a : SavedAccount.loadAccountList( ActMain.this, log ) ){
if( a.isPseudo() && ( a.isNA() || ! bAllowPseudo ) ) continue;
( pickup_host == null || pickup_host.equalsIgnoreCase( a.host ) ? list_same_host : list_other_host ).add( a );
}
SavedAccount.sort( list_same_host );
SavedAccount.sort( list_other_host );
list_same_host.addAll( list_other_host );
return list_same_host;
}
// 別アカ操作と別タンスの関係
static final int NOT_CROSS_ACCOUNT = 1;
static final int CROSS_ACCOUNT_SAME_INSTANCE = 2;
@ -4211,9 +4220,11 @@ public class ActMain extends AppCompatActivity
void openBoostFromAnotherAccount( @NonNull final SavedAccount timeline_account, @Nullable final TootStatusLike status ){
if( status == null ) return;
String who_host = status.account == null ? null : timeline_account.getAccountHost( status.account );
AccountPicker.pick( this, false, false
, getString( R.string.account_picker_boost )
, makeAccountListNonPseudo( log )
, makeAccountList( log, false, who_host )
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount action_account ){
performBoost(
@ -4228,11 +4239,13 @@ public class ActMain extends AppCompatActivity
} );
}
void openFavouriteFromAnotherAccount( @NonNull final SavedAccount timeline_account, final TootStatusLike status ){
void openFavouriteFromAnotherAccount( @NonNull final SavedAccount timeline_account, @Nullable final TootStatusLike status ){
if( status == null ) return;
String who_host = status.account == null ? null : timeline_account.getAccountHost( status.account );
AccountPicker.pick( this, false, false
, getString( R.string.account_picker_favourite )
, makeAccountListNonPseudo( log )
, makeAccountList( log, false, who_host )
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount action_account ){
performFavourite(
@ -4246,10 +4259,13 @@ public class ActMain extends AppCompatActivity
} );
}
void openReplyFromAnotherAccount( final TootStatusLike status ){
void openReplyFromAnotherAccount( @NonNull final SavedAccount timeline_account, @Nullable final TootStatusLike status ){
if( status == null ) return;
String who_host = status.account == null ? null : timeline_account.getAccountHost( status.account );
AccountPicker.pick( this, false, false
, getString( R.string.account_picker_reply )
, makeAccountListNonPseudo( log ), new AccountPicker.AccountPickerCallback() {
, makeAccountList( log, false, who_host )
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount ai ){
if( status instanceof MSPToot ){
// MSPの場合status.url https://instance/@user/:status_id の形式になる
@ -4283,12 +4299,15 @@ public class ActMain extends AppCompatActivity
// openFollowFromAnotherAccount( access_info, status.account );
// }
void openFollowFromAnotherAccount( @NonNull SavedAccount access_info, final TootAccount account ){
void openFollowFromAnotherAccount( @NonNull SavedAccount access_info, @Nullable final TootAccount account ){
if( account == null ) return;
String who_host = access_info.getAccountHost( account );
final String who_acct = access_info.getFullAcct( account );
AccountPicker.pick( this, false, false
, getString( R.string.account_picker_follow )
, makeAccountListNonPseudo( log ), new AccountPicker.AccountPickerCallback() {
, makeAccountList( log, false, who_host )
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount ai ){
callRemoteFollow( ai, who_acct, account.locked, false, follow_complete_callback );
}
@ -4464,8 +4483,6 @@ public class ActMain extends AppCompatActivity
tablet_pager_adapter.notifyDataSetChanged();
}
private void scrollToColumn( int index, boolean bAlign ){
scrollColumnStrip( index );
@ -4628,16 +4645,16 @@ public class ActMain extends AppCompatActivity
if( host.equalsIgnoreCase( a.host ) ) account_list.add( a );
}
if( account_list.isEmpty() ){
SavedAccount ai = addPseudoAccount( host );
if( ai != null ){
addColumn( getDefaultInsertPosition(), ai, Column.TYPE_LOCAL );
}
}else{
SavedAccount.sort( account_list);
AccountPicker.pick( this, true, false
, getString( R.string.account_picker_add_timeline_of, host )
, account_list, new AccountPicker.AccountPickerCallback() {
, account_list
, new AccountPicker.AccountPickerCallback() {
@Override public void onAccountPicked( @NonNull SavedAccount ai ){
addColumn( getDefaultInsertPosition(), ai, Column.TYPE_LOCAL );
}

View File

@ -325,7 +325,7 @@ class DlgContextMenu implements View.OnClickListener, View.OnLongClickListener {
break;
case R.id.btnReplyAnotherAccount:
activity.openReplyFromAnotherAccount( status );
activity.openReplyFromAnotherAccount( access_info,status );
break;
case R.id.btnConversationAnotherAccount:
@ -462,21 +462,15 @@ class DlgContextMenu implements View.OnClickListener, View.OnLongClickListener {
break;
case R.id.btnFollowFromAnotherAccount:
if( who != null ){
activity.openFollowFromAnotherAccount( access_info, who );
}
break;
case R.id.btnSendMessageFromAnotherAccount:
if( who != null ){
activity.performMentionFromAnotherAccount( access_info, who, account_list_non_pseudo );
}
activity.performMentionFromAnotherAccount( access_info, who );
break;
case R.id.btnOpenProfileFromAnotherAccount:
if( who != null ){
activity.openProfileFromAnotherAccount( pos, access_info, who );
}
break;
case R.id.btnNickname:

View File

@ -148,7 +148,7 @@ class StatusButtons implements View.OnClickListener, View.OnLongClickListener {
if( status instanceof TootStatus && ! access_info.isPseudo() ){
activity.performReply( access_info, (TootStatus) status );
}else{
activity.openReplyFromAnotherAccount( status );
activity.openReplyFromAnotherAccount( access_info, status );
}
break;
@ -218,13 +218,13 @@ class StatusButtons implements View.OnClickListener, View.OnLongClickListener {
break;
case R.id.btnFollow2:
if( status != null && status.account != null ){
if( status != null ){
activity.openFollowFromAnotherAccount( access_info, status.account );
}
break;
case R.id.btnReply:
activity.openReplyFromAnotherAccount( status );
activity.openReplyFromAnotherAccount( access_info, status );
break;
}

View File

@ -41,7 +41,8 @@ public class AccountPicker {
){
ArrayList< SavedAccount > account_list = SavedAccount.loadAccountList( activity,ActMain.log );
pick( activity, bAllowPseudo, bAuto, message, account_list, callback ,null );
SavedAccount.sort( account_list );
pick( activity, bAllowPseudo, bAuto, message, account_list, true,callback ,null );
}
public static void pick(
@ -50,10 +51,10 @@ public class AccountPicker {
, boolean bAuto
, String message
, @NonNull final AccountPickerCallback callback
, @Nullable final DialogInterface.OnDismissListener dissmiss_callback
, @Nullable final DialogInterface.OnDismissListener dismiss_callback
){
ArrayList< SavedAccount > account_list = SavedAccount.loadAccountList( activity,ActMain.log );
pick( activity, bAllowPseudo, bAuto, message, account_list, callback ,dissmiss_callback );
pick( activity, bAllowPseudo, bAuto, message, account_list, true, callback ,dismiss_callback );
}
public static void pick(
@ -64,15 +65,16 @@ public class AccountPicker {
, @NonNull final ArrayList< SavedAccount > account_list
, @NonNull final AccountPickerCallback callback
){
pick( activity, bAllowPseudo, bAuto, message, account_list, callback ,null );
pick( activity, bAllowPseudo, bAuto, message, account_list, false, callback ,null );
}
public static void pick(
private static void pick(
@NonNull AppCompatActivity activity
, boolean bAllowPseudo
, boolean bAuto
, String message
, @NonNull final ArrayList< SavedAccount > account_list
,boolean bSort
, @NonNull final AccountPickerCallback callback
, @Nullable final DialogInterface.OnDismissListener dismiss_callback
){
@ -95,12 +97,16 @@ public class AccountPicker {
}
}
if(bSort){
SavedAccount.sort( account_list );
}
if( bAuto && account_list.size() == 1 ){
callback.onAccountPicked( account_list.get( 0 ) );
return;
}
SavedAccount.sort( account_list );
@SuppressLint("InflateParams") View viewRoot = activity.getLayoutInflater().inflate( R.layout.dlg_account_picker, null, false );

View File

@ -98,7 +98,7 @@ public class SavedAccount extends TootAccount implements LinkClickContext {
return instance;
}
public void setInstance(@NonNull TootInstance instance){
if( instance != null ) refInstance.set(instance);
refInstance.set(instance);
}
@ -462,7 +462,7 @@ public class SavedAccount extends TootAccount implements LinkClickContext {
}
@Nullable
public static SavedAccount loadPseudoAccount( Context context, @NonNull LogCategory log, String full_acct ){
public static SavedAccount loadAccountByAcct( Context context, @NonNull LogCategory log, String full_acct ){
try{
Cursor cursor = App1.getDB().query( table, null, COL_USER + "=?", new String[]{ full_acct }, null, null, null );
try{
@ -474,11 +474,28 @@ public class SavedAccount extends TootAccount implements LinkClickContext {
}
}catch( Throwable ex ){
log.trace( ex );
log.e( ex, "loadPseudoAccount failed." );
log.e( ex, "loadAccountByAcct failed." );
}
return null;
}
public static boolean hasRealAccount( @NonNull LogCategory log ){
try{
Cursor cursor = App1.getDB().query( table, null, COL_USER + " NOT LIKE '?@%'", null , null, null, null, "1");
try{
if( cursor.moveToNext() ){
return true;
}
}finally{
cursor.close();
}
}catch( Throwable ex ){
log.trace( ex );
log.e( ex, "hasNonPseudoAccount failed." );
}
return false;
}
@SuppressWarnings("WeakerAccess")
public @NonNull String getAccountHost( @Nullable String acct ){
@ -665,4 +682,8 @@ public class SavedAccount extends TootAccount implements LinkClickContext {
Collections.sort( account_list, account_comparator );
}
public @NonNull String getAcctHost( @NonNull TootAccount who ){
String host = who.getAcctHost();
return host != null ? host : this.host;
}
}