SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/ActColumnList.java

348 lines
11 KiB
Java

package jp.juggler.subwaytooter;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.woxthebox.draglistview.DragItem;
import com.woxthebox.draglistview.DragItemAdapter;
import com.woxthebox.draglistview.DragListView;
import com.woxthebox.draglistview.swipe.ListSwipeHelper;
import com.woxthebox.draglistview.swipe.ListSwipeItem;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
import jp.juggler.subwaytooter.util.LogCategory;
import jp.juggler.subwaytooter.util.Utils;
public class ActColumnList extends AppCompatActivity {
private static final LogCategory log = new LogCategory( "ActColumnList" );
static final String TMP_FILE_COLUMN_LIST = "tmp_column_list";
public static final String EXTRA_ORDER = "order";
public static final String EXTRA_SELECTION = "selection";
public static void open( ActMain activity, int currentItem, int requestCode ){
JSONArray array = activity.app_state.encodeColumnList();
AppState.saveColumnList( activity, ActColumnList.TMP_FILE_COLUMN_LIST, array );
Intent intent = new Intent( activity, ActColumnList.class );
intent.putExtra( ActColumnList.EXTRA_SELECTION, currentItem );
activity.startActivityForResult( intent, requestCode );
}
@Override
protected void onCreate( @Nullable Bundle savedInstanceState ){
super.onCreate( savedInstanceState );
App1.setActivityTheme( this, false );
initUI();
if( savedInstanceState != null ){
restoreData( savedInstanceState.getInt( EXTRA_SELECTION ) );
}else{
Intent intent = getIntent();
restoreData( intent.getIntExtra( EXTRA_SELECTION, - 1 ) );
}
}
@Override
protected void onSaveInstanceState( Bundle outState ){
super.onSaveInstanceState( outState );
outState.putInt( EXTRA_SELECTION, old_selection );
//
JSONArray array = new JSONArray();
List< MyItem > item_list = listAdapter.getItemList();
for( int i = 0, ie = item_list.size() ; i < ie ; ++ i ){
array.put( item_list.get( i ).json );
}
AppState.saveColumnList( this, TMP_FILE_COLUMN_LIST, array );
}
@Override
public void onBackPressed(){
makeResult( - 1 );
super.onBackPressed();
}
DragListView listView;
MyListAdapter listAdapter;
int old_selection;
private void initUI(){
setContentView( R.layout.act_column_list );
Styler.fixHorizontalPadding2( findViewById( R.id.llContent ) );
// リストのアダプター
listAdapter = new MyListAdapter();
// ハンドル部分をドラッグで並べ替えできるRecyclerView
listView = findViewById( R.id.drag_list_view );
listView.setLayoutManager( new LinearLayoutManager( this ) );
listView.setAdapter( listAdapter, true );
listView.setCanDragHorizontally( false );
listView.setCustomDragItem( new MyDragItem( this, R.layout.lv_column_list ) );
listView.getRecyclerView().setVerticalScrollBarEnabled( true );
listView.setDragListListener( new DragListView.DragListListenerAdapter() {
@Override
public void onItemDragStarted( int position ){
// 操作中はリフレッシュ禁止
// mRefreshLayout.setEnabled( false );
}
@Override
public void onItemDragEnded( int fromPosition, int toPosition ){
// 操作完了でリフレッシュ許可
// mRefreshLayout.setEnabled( USE_SWIPE_REFRESH );
// if( fromPosition != toPosition ){
// // 並べ替えが発生した
// }
}
} );
// リストを左右スワイプした
listView.setSwipeListener( new ListSwipeHelper.OnSwipeListenerAdapter() {
@Override
public void onItemSwipeStarted( ListSwipeItem item ){
// 操作中はリフレッシュ禁止
// mRefreshLayout.setEnabled( false );
}
@Override
public void onItemSwipeEnded( ListSwipeItem item, ListSwipeItem.SwipeDirection swipedDirection ){
// 操作完了でリフレッシュ許可
// mRefreshLayout.setEnabled( USE_SWIPE_REFRESH );
// 左にスワイプした(右端に青が見えた) なら要素を削除する
if( swipedDirection == ListSwipeItem.SwipeDirection.LEFT ){
MyItem adapterItem = (MyItem) item.getTag();
if( adapterItem.json.optBoolean( Column.KEY_DONT_CLOSE, false ) ){
Utils.showToast( ActColumnList.this, false, R.string.column_has_dont_close_option );
listView.resetSwipedViews( null );
return;
}
listAdapter.removeItem( listAdapter.getPositionForItem( adapterItem ) );
}
}
} );
}
void restoreData( int ivSelection ){
this.old_selection = ivSelection;
ArrayList< MyItem > tmp_list = new ArrayList<>();
try{
JSONArray array = AppState.loadColumnList( this, TMP_FILE_COLUMN_LIST );
if( array != null ){
for( int i = 0, ie = array.length() ; i < ie ; ++ i ){
try{
JSONObject src = array.optJSONObject( i );
MyItem item = new MyItem( src, i, this );
if( src != null ){
tmp_list.add( item );
if( old_selection == item.old_index ){
item.setOldSelection( true );
}
}
}catch( Throwable ex ){
log.trace( ex );
}
}
}
}catch( Throwable ex ){
log.trace( ex );
}
listAdapter.setItemList( tmp_list );
}
void makeResult( int new_selection ){
Intent intent = new Intent();
List< MyItem > item_list = listAdapter.getItemList();
// どの要素を選択するか
if( new_selection >= 0 && new_selection < listAdapter.getItemCount() ){
intent.putExtra( EXTRA_SELECTION, new_selection );
}else{
for( int i = 0, ie = item_list.size() ; i < ie ; ++ i ){
if( item_list.get( i ).bOldSelection ){
intent.putExtra( EXTRA_SELECTION, i );
break;
}
}
}
// 並べ替え用データ
ArrayList< Integer > order_list = new ArrayList<>();
for( MyItem item : item_list ){
order_list.add( item.old_index );
}
intent.putExtra( EXTRA_ORDER, order_list );
setResult( RESULT_OK, intent );
}
private void performItemSelected( MyItem item ){
int idx = listAdapter.getPositionForItem( item );
makeResult( idx );
finish();
}
// リスト要素のデータ
static class MyItem {
final long id;
final JSONObject json;
final String name;
final String acct;
final int acct_color_fg;
final int acct_color_bg;
final int old_index;
final int type;
boolean bOldSelection;
MyItem( JSONObject src, long id, Context context ){
this.json = src;
this.name = src.optString( Column.KEY_COLUMN_NAME );
this.acct = src.optString( Column.KEY_COLUMN_ACCESS );
int c = src.optInt( Column.KEY_COLUMN_ACCESS_COLOR, 0 );
this.acct_color_fg = c != 0 ? c : Styler.getAttributeColor( context, R.attr.colorColumnListItemText );
c = src.optInt( Column.KEY_COLUMN_ACCESS_COLOR_BG, 0 );
this.acct_color_bg = c;
this.old_index = src.optInt( Column.KEY_OLD_INDEX );
this.id = id;
this.type = src.optInt( Column.KEY_TYPE );
}
void setOldSelection( @SuppressWarnings("SameParameterValue") boolean b ){
bOldSelection = b;
}
}
// リスト要素のViewHolder
class MyViewHolder extends DragItemAdapter.ViewHolder {
final View ivBookmark;
final TextView tvAccess;
final TextView tvName;
final ImageView ivColumnIcon;
final int acct_pad_lr;
MyViewHolder( final View viewRoot ){
super( viewRoot
, R.id.ivDragHandle // View ID。 ここを押すとドラッグ操作をすぐに開始する
, true // 長押しでドラッグ開始するなら真
);
ivBookmark = viewRoot.findViewById( R.id.ivBookmark );
tvAccess = viewRoot.findViewById( R.id.tvAccess );
tvName = viewRoot.findViewById( R.id.tvName );
ivColumnIcon = viewRoot.findViewById( R.id.ivColumnIcon );
acct_pad_lr = (int) ( 0.5f + 4f * viewRoot.getResources().getDisplayMetrics().density );
// リスト要素のビューが ListSwipeItem だった場合、Swipe操作を制御できる
if( viewRoot instanceof ListSwipeItem ){
ListSwipeItem lsi = (ListSwipeItem) viewRoot;
lsi.setSwipeInStyle( ListSwipeItem.SwipeInStyle.SLIDE );
lsi.setSupportedSwipeDirection( ListSwipeItem.SwipeDirection.LEFT );
}
}
void bind( MyItem item ){
itemView.setTag( item ); // itemView は親クラスのメンバ変数
ivBookmark.setVisibility( item.bOldSelection ? View.VISIBLE : View.INVISIBLE );
tvAccess.setText( item.acct );
tvAccess.setTextColor( item.acct_color_fg );
tvAccess.setBackgroundColor( item.acct_color_bg );
tvAccess.setPaddingRelative( acct_pad_lr, 0, acct_pad_lr, 0 );
tvName.setText( item.name );
ivColumnIcon.setImageResource( Styler.getAttributeResourceId(
ActColumnList.this, Column.getIconAttrId( item.acct, item.type ) ) );
}
// @Override
// public boolean onItemLongClicked( View view ){
// return false;
// }
@Override
public void onItemClicked( View view ){
MyItem item = (MyItem) itemView.getTag(); // itemView は親クラスのメンバ変数
ActColumnList activity = ( (ActColumnList) Utils.getActivityFromView( view ) );
if( activity != null ) activity.performItemSelected( item );
}
}
// ドラッグ操作中のデータ
private class MyDragItem extends DragItem {
MyDragItem( Context context, int layoutId ){
super( context, layoutId );
}
@Override
public void onBindDragView( View clickedView, View dragView ){
MyItem item = (MyItem) clickedView.getTag();
TextView tv = dragView.findViewById( R.id.tvAccess );
tv.setText( item.acct );
tv.setTextColor( item.acct_color_fg );
tv.setBackgroundColor( item.acct_color_bg );
tv = dragView.findViewById( R.id.tvName );
tv.setText( item.name );
ImageView ivColumnIcon = dragView.findViewById( R.id.ivColumnIcon );
ivColumnIcon.setImageResource( Styler.getAttributeResourceId(
ActColumnList.this, Column.getIconAttrId( item.acct, item.type ) ) );
dragView.findViewById( R.id.ivBookmark ).setVisibility(
clickedView.findViewById( R.id.ivBookmark ).getVisibility()
);
dragView.findViewById( R.id.item_layout ).setBackgroundColor(
Styler.getAttributeColor( ActColumnList.this, R.attr.list_item_bg_pressed_dragged )
);
}
}
private class MyListAdapter extends DragItemAdapter< MyItem, MyViewHolder > {
MyListAdapter(){
super();
setHasStableIds( true );
setItemList( new ArrayList< MyItem >() );
}
@Override
public MyViewHolder onCreateViewHolder( ViewGroup parent, int viewType ){
View view = getLayoutInflater().inflate( R.layout.lv_column_list, parent, false );
return new MyViewHolder( view );
}
@Override
public void onBindViewHolder( MyViewHolder holder, int position ){
super.onBindViewHolder( holder, position );
holder.bind( getItemList().get( position ) );
}
@Override public long getUniqueItemId( int position ){
MyItem item = mItemList.get( position ); // mItemList は親クラスのメンバ変数
return item.id;
}
}
}