This commit is contained in:
tateisu 2017-06-01 12:15:05 +09:00
parent 140968e348
commit 25d57b166f
15 changed files with 645 additions and 282 deletions

View File

@ -9,8 +9,8 @@ android {
applicationId "jp.juggler.subwaytooter"
minSdkVersion 21
targetSdkVersion 25
versionCode 74
versionName "0.7.4"
versionCode 75
versionName "0.7.5"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

View File

@ -4,6 +4,7 @@ import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
@ -33,7 +34,8 @@ import okhttp3.Response;
public class ActAccountSetting extends AppCompatActivity
implements View.OnClickListener
, CompoundButton.OnCheckedChangeListener {
, CompoundButton.OnCheckedChangeListener
{
static final LogCategory log = new LogCategory( "ActAccountSetting" );
@ -98,9 +100,7 @@ public class ActAccountSetting extends AppCompatActivity
private void initUI(){
setContentView( R.layout.act_account_setting );
Styler.fixHorizontalPadding(findViewById( R.id.svContent ));
Styler.fixHorizontalPadding( findViewById( R.id.svContent ) );
tvInstance = (TextView) findViewById( R.id.tvInstance );
tvUser = (TextView) findViewById( R.id.tvUser );
@ -157,7 +157,6 @@ public class ActAccountSetting extends AppCompatActivity
loading = true;
swNSFWOpen.setChecked( a.dont_hide_nsfw );
cbNotificationMention.setChecked( a.notification_mention );
cbNotificationBoost.setChecked( a.notification_boost );
@ -175,7 +174,7 @@ public class ActAccountSetting extends AppCompatActivity
boolean enabled = ! a.isPseudo();
btnAccessToken.setEnabled( enabled );
btnVisibility.setEnabled( enabled );
cbNotificationMention.setEnabled( enabled );
cbNotificationBoost.setEnabled( enabled );
cbNotificationFavourite.setEnabled( enabled );
@ -266,11 +265,11 @@ public class ActAccountSetting extends AppCompatActivity
getString( R.string.visibility_private ),
getString( R.string.visibility_direct ),
};
// public static final String VISIBILITY_PUBLIC ="public";
// public static final String VISIBILITY_UNLISTED ="unlisted";
// public static final String VISIBILITY_PRIVATE ="private";
// public static final String VISIBILITY_DIRECT ="direct";
// public static final String VISIBILITY_PUBLIC ="public";
// public static final String VISIBILITY_UNLISTED ="unlisted";
// public static final String VISIBILITY_PRIVATE ="private";
// public static final String VISIBILITY_DIRECT ="direct";
new AlertDialog.Builder( this )
.setTitle( R.string.choose_visibility )
@ -309,22 +308,28 @@ public class ActAccountSetting extends AppCompatActivity
.setPositiveButton( R.string.ok, new DialogInterface.OnClickListener() {
@Override public void onClick( DialogInterface dialog, int which ){
account.delete();
SharedPreferences pref = Pref.pref( ActAccountSetting.this );
if( account.db_id == pref.getLong( Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT, - 1L ) ){
pref.edit().putLong( Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT, - 1L ).apply();
}
finish();
new AsyncTask<Void,Void,String>(){
new AsyncTask< Void, Void, String >() {
void unregister(){
try{
String install_id = App1.pref.getString(Pref.KEY_INSTALL_ID,null);
String install_id = App1.pref.getString( Pref.KEY_INSTALL_ID, null );
if( TextUtils.isEmpty( install_id ) ){
log.d("performAccountRemove: missing install_id");
log.d( "performAccountRemove: missing install_id" );
return;
}
String tag = account.notification_tag;
if( TextUtils.isEmpty( tag ) ){
log.d("performAccountRemove: missing notification_tag");
log.d( "performAccountRemove: missing notification_tag" );
return;
}
@ -354,7 +359,7 @@ public class ActAccountSetting extends AppCompatActivity
}
@Override protected void onCancelled( String s ){
onPostExecute(s);
onPostExecute( s );
}
@Override protected void onPostExecute( String s ){
@ -431,7 +436,7 @@ public class ActAccountSetting extends AppCompatActivity
}
} );
progress.show();
task.executeOnExecutor(App1.task_executor);
task.executeOnExecutor( App1.task_executor );
}
}

View File

@ -19,8 +19,10 @@ import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.JsonWriter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
@ -38,7 +40,11 @@ import org.apache.commons.io.output.FileWriterWithEncoding;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import jp.juggler.subwaytooter.table.AcctColor;
import jp.juggler.subwaytooter.table.SavedAccount;
import jp.juggler.subwaytooter.util.LogCategory;
import jp.juggler.subwaytooter.util.Utils;
@ -57,6 +63,13 @@ public class ActAppSetting extends AppCompatActivity
SharedPreferences pref;
@Override protected void onPause(){
super.onPause();
// DefaultAccount Spinnerの値を復元するためこのタイミングでも保存することになった
saveUIToData();
}
@Override
protected void onCreate( @Nullable Bundle savedInstanceState ){
super.onCreate( savedInstanceState );
@ -65,7 +78,6 @@ public class ActAppSetting extends AppCompatActivity
pref = Pref.pref( this );
loadUIFromData();
}
Switch swDontConfirmBeforeCloseColumn;
@ -86,6 +98,7 @@ public class ActAppSetting extends AppCompatActivity
Spinner spUITheme;
Spinner spResizeImage;
Spinner spRefreshAfterToot;
Spinner spDefaultAccount;
CheckBox cbNotificationSound;
CheckBox cbNotificationVibration;
@ -220,6 +233,16 @@ public class ActAppSetting extends AppCompatActivity
spRefreshAfterToot.setOnItemSelectedListener( this );
}
{
AccountAdapter adapter = new AccountAdapter();
spDefaultAccount = (Spinner) findViewById( R.id.spDefaultAccount );
spDefaultAccount.setAdapter( adapter );
spDefaultAccount.setOnItemSelectedListener( this );
}
findViewById( R.id.btnFooterBackgroundEdit ).setOnClickListener( this );
findViewById( R.id.btnFooterBackgroundReset ).setOnClickListener( this );
findViewById( R.id.btnFooterForegroundColorEdit ).setOnClickListener( this );
@ -282,6 +305,10 @@ public class ActAppSetting extends AppCompatActivity
spResizeImage.setSelection( pref.getInt( Pref.KEY_RESIZE_IMAGE, 4 ) );
spRefreshAfterToot.setSelection( pref.getInt( Pref.KEY_REFRESH_AFTER_TOOT, 0 ) );
spDefaultAccount.setSelection(
((AccountAdapter)spDefaultAccount.getAdapter()).getIndexFromId( pref.getLong( Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT, -1L ))
);
footer_button_bg_color = pref.getInt( Pref.KEY_FOOTER_BUTTON_BG_COLOR, 0 );
footer_button_fg_color = pref.getInt( Pref.KEY_FOOTER_BUTTON_FG_COLOR, 0 );
footer_tab_bg_color = pref.getInt( Pref.KEY_FOOTER_TAB_BG_COLOR, 0 );
@ -330,7 +357,10 @@ public class ActAppSetting extends AppCompatActivity
.putInt( Pref.KEY_FOOTER_TAB_BG_COLOR, footer_tab_bg_color )
.putInt( Pref.KEY_FOOTER_TAB_DIVIDER_COLOR, footer_tab_divider_color )
.putInt( Pref.KEY_FOOTER_TAB_INDICATOR_COLOR, footer_tab_indicator_color )
.putLong( Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT,((AccountAdapter)spDefaultAccount.getAdapter())
.getIdFromIndex(spDefaultAccount.getSelectedItemPosition() ) )
.putString( Pref.KEY_TIMELINE_FONT, timeline_font )
.putString( Pref.KEY_COLUMN_WIDTH, etColumnWidth.getText().toString().trim() )
.putString( Pref.KEY_MEDIA_THUMB_HEIGHT, etMediaThumbHeight.getText().toString().trim() )
@ -756,4 +786,63 @@ public class ActAppSetting extends AppCompatActivity
finish();
}
private class AccountAdapter extends BaseAdapter {
final ArrayList<SavedAccount> list = new ArrayList<>( );
AccountAdapter(){
for( SavedAccount a : SavedAccount.loadAccountList( log ) ){
if( a.isPseudo() ) continue;
list.add(a);
}
Collections.sort( list, new Comparator< SavedAccount >() {
@Override
public int compare( SavedAccount a, SavedAccount b ){
return String.CASE_INSENSITIVE_ORDER.compare( AcctColor.getNickname( a.acct ), AcctColor.getNickname( b.acct ) );
}
} );
}
@Override public int getCount(){
return 1+list.size();
}
@Override public Object getItem( int position ){
return position == 0 ? null : list.get(position-1);
}
@Override public long getItemId( int position ){
return 0;
}
@Override public View getView( int position, View view, ViewGroup parent ){
if( view == null ) view = getLayoutInflater().inflate( android.R.layout.simple_spinner_item,parent,false );
((TextView)view.findViewById(android.R.id.text1 )).setText(
position == 0 ? getString(R.string.ask_always) : AcctColor.getNickname( list.get(position-1).acct )
);
return view;
}
@Override public View getDropDownView( int position, View view, ViewGroup parent ){
if( view ==null ) view = getLayoutInflater().inflate( R.layout.lv_spinner_dropdown,parent,false );
((TextView)view.findViewById(android.R.id.text1 )).setText(
position == 0 ? getString(R.string.ask_always) : AcctColor.getNickname( list.get(position-1).acct )
);
return view;
}
int getIndexFromId( long db_id ){
for( int i=0,ie=list.size();i<ie;++i){
if( list.get(i).db_id == db_id ) return i+1;
}
return 0;
}
long getIdFromIndex( int position ){
if( position > 0 ) return list.get( position -1).db_id;
return -1L;
}
}
}

View File

@ -3,6 +3,7 @@ package jp.juggler.subwaytooter;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.ColorInt;
@ -296,6 +297,17 @@ public class ActCustomStreamListener extends AppCompatActivity implements View.O
if(! reUrl.matcher( sv ).find() ){
addLog( strInstance + "." + key + " : not like Url." );
has_error = true;
}else if( Uri.parse(sv).getScheme().equals( "https" ) ){
try{
addLog("check access to "+sv+"");
builder = new Request.Builder() .url( sv );
call = App1.ok_http_client.newCall( builder.build() );
call.execute();
}catch(Throwable ex){
ex.printStackTrace( );
addLog( strInstance + "." + key + " : "+ Utils.formatError( ex,"connect failed." ) );
has_error = true;
}
}
}
}

View File

@ -1703,6 +1703,13 @@ public class ActMain extends AppCompatActivity
ActPost.open( this, REQUEST_CODE_POST, c.access_info.db_id, "" );
return;
}
}else{
long db_id = pref.getLong( Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT, - 1L );
SavedAccount a = SavedAccount.loadAccount( log, db_id );
if( a != null ){
ActPost.open( this, REQUEST_CODE_POST, a.db_id, "" );
return;
}
}
AccountPicker.pick( this, false, true, getString( R.string.account_picker_toot ), new AccountPicker.AccountPickerCallback() {

View File

@ -54,6 +54,7 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@ -61,6 +62,7 @@ import jp.juggler.subwaytooter.api.TootApiClient;
import jp.juggler.subwaytooter.api.TootApiResult;
import jp.juggler.subwaytooter.api.entity.TootAttachment;
import jp.juggler.subwaytooter.api.entity.TootMention;
import jp.juggler.subwaytooter.api.entity.TootResults;
import jp.juggler.subwaytooter.api.entity.TootStatus;
import jp.juggler.subwaytooter.dialog.DlgConfirm;
import jp.juggler.subwaytooter.dialog.DlgDraftPicker;
@ -100,6 +102,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
static final String KEY_IN_REPLY_TO_ID = "in_reply_to_id";
static final String KEY_IN_REPLY_TO_TEXT = "in_reply_to_text";
static final String KEY_IN_REPLY_TO_IMAGE = "in_reply_to_image";
static final String KEY_IN_REPLY_TO_URL = "in_reply_to_url";
public static void open( Activity activity, int request_code, long account_db_id, TootStatus reply_status ){
Intent intent = new Intent( activity, ActPost.class );
@ -307,6 +310,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
this.in_reply_to_id = savedInstanceState.getLong( KEY_IN_REPLY_TO_ID, - 1L );
this.in_reply_to_text = savedInstanceState.getString( KEY_IN_REPLY_TO_TEXT );
this.in_reply_to_image = savedInstanceState.getString( KEY_IN_REPLY_TO_IMAGE );
this.in_reply_to_url = savedInstanceState.getString( KEY_IN_REPLY_TO_URL );
}else{
this.attachment_list = app_state.attachment_list = null;
@ -414,6 +418,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
in_reply_to_id = reply_status.id;
in_reply_to_text = reply_status.decoded_content.toString();
in_reply_to_image = reply_status.account.avatar_static;
in_reply_to_url = reply_status.url;
// 公開範囲
try{
@ -495,6 +500,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
outState.putLong( KEY_IN_REPLY_TO_ID, in_reply_to_id );
outState.putString( KEY_IN_REPLY_TO_TEXT, in_reply_to_text );
outState.putString( KEY_IN_REPLY_TO_IMAGE, in_reply_to_image );
outState.putString( KEY_IN_REPLY_TO_URL, in_reply_to_url );
}
@Override protected void onRestoreInstanceState( Bundle savedInstanceState ){
@ -774,15 +780,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
}
final ArrayList< SavedAccount > tmp_account_list = new ArrayList<>();
if( in_reply_to_id != - 1L ){
// リプライは数値IDなのでサーバが同じじゃないと選択できない
for( SavedAccount a : account_list ){
if( ! a.host.equals( account.host ) ) continue;
tmp_account_list.add( a );
}
}else{
tmp_account_list.addAll( account_list );
}
tmp_account_list.addAll( account_list );
String[] caption_list = new String[ tmp_account_list.size() ];
for( int i = 0, ie = tmp_account_list.size() ; i < ie ; ++ i ){
@ -794,25 +792,118 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
.setItems( caption_list, new DialogInterface.OnClickListener() {
@Override
public void onClick( DialogInterface dialog, int which ){
if( which >= 0 && which < tmp_account_list.size() ){
SavedAccount account = tmp_account_list.get( which );
setAccount( account );
try{
if( account.visibility != null && TootStatus.compareVisibility( visibility, account.visibility ) > 0 ){
Utils.showToast( ActPost.this, true, R.string.spoil_visibility_for_account );
visibility = account.visibility;
showVisibility();
}
}catch( Throwable ex ){
ex.printStackTrace();
if( which <0 || which >= tmp_account_list.size() ){
// 範囲外
return;
}
SavedAccount a = tmp_account_list.get( which );
if( ! a.host.equals( account.host ) ){
// 別タンスへの移動
if( in_reply_to_id != -1L ){
// 別タンスのアカウントならin_reply_toの変換が必要
startReplyConversion(a);
}
}
// リプライがないか同タンスへの移動
setAccountWithVisibilityConversion(a);
}
} )
.setNegativeButton( R.string.cancel, null )
.show();
}
void setAccountWithVisibilityConversion(@NonNull SavedAccount a){
setAccount( a );
try{
if( account.visibility != null && TootStatus.compareVisibility( visibility, a.visibility ) > 0 ){
Utils.showToast( ActPost.this, true, R.string.spoil_visibility_for_account );
visibility = a.visibility;
showVisibility();
}
}catch( Throwable ex ){
ex.printStackTrace();
}
}
private void startReplyConversion( @NonNull final SavedAccount access_info ){
if( in_reply_to_url == null ){
// 下書きが古い形式の場合URLがないので別タンスへの移動ができない
new AlertDialog.Builder( ActPost.this )
.setMessage( R.string.account_change_failed_old_draft_has_no_in_reply_to_url )
.setNeutralButton( R.string.close, null )
.show();
return;
}
final ProgressDialog progress = new ProgressDialog( this );
final AsyncTask< Void, Void, TootApiResult > task = new AsyncTask< Void, Void, TootApiResult >() {
TootStatus target_status;
@Override protected TootApiResult doInBackground( Void... params ){
TootApiClient client = new TootApiClient( ActPost.this, new TootApiClient.Callback() {
@Override public boolean isApiCancelled(){
return isCancelled();
}
@Override public void publishApiProgress( final String s ){
}
} );
client.setAccount( access_info );
// 検索APIに他タンスのステータスのURLを投げると自タンスのステータスを得られる
String path = String.format( Locale.JAPAN, Column.PATH_SEARCH, Uri.encode( in_reply_to_url ) );
path = path + "&resolve=1";
TootApiResult result = client.request( path );
if( result != null && result.object != null ){
TootResults tmp = TootResults.parse( log, access_info, result.object );
if( tmp != null && tmp.statuses != null && ! tmp.statuses.isEmpty() ){
target_status = tmp.statuses.get( 0 );
}
if( target_status == null ){
return new TootApiResult( getString( R.string.status_id_conversion_failed ) );
}
}
return result;
}
@Override protected void onCancelled( TootApiResult result ){
super.onPostExecute( result );
}
@Override protected void onPostExecute( TootApiResult result ){
try{
progress.dismiss();
}catch(Throwable ex){
ex.printStackTrace();
}
if( isCancelled() ) return;
if( result == null ){
// cancelled.
}else if( target_status != null ){
in_reply_to_id = target_status.id;
setAccountWithVisibilityConversion( access_info );
}else{
Utils.showToast( ActPost.this, true, getString(R.string.in_reply_to_id_conversion_failed ) +"\n"+result.error );
}
}
}.executeOnExecutor( App1.task_executor );
progress.setIndeterminate( true );
progress.setOnDismissListener( new DialogInterface.OnDismissListener() {
@Override public void onDismiss( DialogInterface dialog ){
task.cancel( true );
}
} );
progress.show();
}
//////////////////////////////////////////////////////////
// Attachment
@ -1564,6 +1655,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
long in_reply_to_id = - 1L;
String in_reply_to_text;
String in_reply_to_image;
String in_reply_to_url;
void showReplyTo(){
if( in_reply_to_id == - 1L ){
@ -1573,7 +1665,6 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
tvReplyTo.setText( HTMLDecoder.decodeHTML( account, in_reply_to_text, true, null ) );
ivReply.setCornerRadius( pref, 16f );
ivReply.setImageUrl( in_reply_to_image );
}
}
@ -1581,6 +1672,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
in_reply_to_id = - 1L;
in_reply_to_text = null;
in_reply_to_image = null;
in_reply_to_url = null;
showReplyTo();
}
@ -1596,6 +1688,8 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
static final String DRAFT_REPLY_ID = "reply_id";
static final String DRAFT_REPLY_TEXT = "reply_text";
static final String DRAFT_REPLY_IMAGE = "reply_image";
static final String DRAFT_REPLY_URL = "reply_url";
private void saveDraft(){
String content = etContent.getText().toString();
@ -1623,6 +1717,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
json.put( DRAFT_REPLY_ID, in_reply_to_id );
json.put( DRAFT_REPLY_TEXT, in_reply_to_text );
json.put( DRAFT_REPLY_IMAGE, in_reply_to_image );
json.put( DRAFT_REPLY_URL, in_reply_to_url );
PostDraft.save( System.currentTimeMillis(), json );
@ -1683,6 +1778,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
draft.remove( DRAFT_REPLY_ID );
draft.remove( DRAFT_REPLY_TEXT );
draft.remove( DRAFT_REPLY_IMAGE );
draft.remove( DRAFT_REPLY_URL );
}catch( JSONException ignored ){
}
return "OK";
@ -1756,9 +1852,10 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
boolean content_warning_checked = draft.optBoolean( DRAFT_CONTENT_WARNING_CHECK );
boolean nsfw_checked = draft.optBoolean( DRAFT_NSFW_CHECK );
JSONArray tmp_attachment_list = draft.optJSONArray( DRAFT_ATTACHMENT_LIST );
long reply_id = draft.optLong( DRAFT_REPLY_ID, in_reply_to_id );
String reply_text = draft.optString( DRAFT_REPLY_TEXT, in_reply_to_text );
String reply_image = draft.optString( DRAFT_REPLY_IMAGE, in_reply_to_image );
long reply_id = draft.optLong( DRAFT_REPLY_ID, -1L );
String reply_text = draft.optString( DRAFT_REPLY_TEXT, null );
String reply_image = draft.optString( DRAFT_REPLY_IMAGE, null );
String reply_url = draft.optString( DRAFT_REPLY_URL, null );
etContent.setText( content );
etContent.setSelection( content.length() );
@ -1788,6 +1885,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener,
in_reply_to_id = reply_id;
in_reply_to_text = reply_text;
in_reply_to_image = reply_image;
in_reply_to_url = reply_url;
}
updateContentWarning();

View File

@ -22,8 +22,10 @@ import jp.juggler.subwaytooter.util.Utils;
public class ActText extends AppCompatActivity implements View.OnClickListener {
static final LogCategory log = new LogCategory( "ActText" );
static final String EXTRA_TEXT = "text";
static final String EXTRA_CONTENT_START = "content_start";
static String encodeStatus( Context context, SavedAccount access_info, TootStatus status ){
static void encodeStatus( Intent intent, Context context, SavedAccount access_info, TootStatus status ){
StringBuilder sb = new StringBuilder();
sb.append( context.getString( R.string.send_header_url ) );
sb.append( ": " );
@ -48,16 +50,21 @@ public class ActText extends AppCompatActivity implements View.OnClickListener {
sb.append( "\n" );
}
sb.append( "\n" );
intent.putExtra( EXTRA_CONTENT_START, sb.length() );
sb.append( HTMLDecoder.decodeHTML( access_info, status.content ,false,null) );
return sb.toString();
intent.putExtra( EXTRA_TEXT, sb.toString() );
}
static final String EXTRA_TEXT = "text";
public static void open( ActMain activity, SavedAccount access_info, TootStatus status ){
String sv = encodeStatus( activity, access_info, status );
Intent intent = new Intent( activity, ActText.class );
intent.putExtra( EXTRA_TEXT, sv );
encodeStatus( intent,activity, access_info, status );
activity.startActivity( intent );
}
@ -70,12 +77,12 @@ public class ActText extends AppCompatActivity implements View.OnClickListener {
if( savedInstanceState == null ){
Intent intent = getIntent();
String sv = intent.getStringExtra( EXTRA_TEXT );
int content_start = intent.getIntExtra( EXTRA_CONTENT_START, 0);
etText.setText(sv);
etText.setSelection( 0,sv.length() );
etText.setSelection( content_start,sv.length() );
}
}
EditText etText;
void initUI(){

View File

@ -313,6 +313,12 @@ public class AppDataExporter {
e.putInt( k, iv );
break;
// long
case Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT:
long lv = reader.nextLong();
e.putLong( k, lv );
break;
// string
case Pref.KEY_COLUMN_WIDTH:
case Pref.KEY_MEDIA_THUMB_HEIGHT:
@ -444,6 +450,14 @@ public class AppDataExporter {
}
}
{
long old_id = app_state.pref.getLong( Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT, - 1L );
if( old_id != -1L ){
Long new_id = account_id_map.get( old_id );
app_state.pref.edit().putLong( Pref.KEY_TABLET_TOOT_DEFAULT_ACCOUNT, ( new_id != null ? new_id : - 1L ) ).apply();
}
}
if( result == null ){
throw new RuntimeException( "import data does not includes column list!" );
}

View File

@ -54,6 +54,7 @@ public class Pref {
static final String KEY_STREAM_LISTENER_SECRET = "stream_listener_secret";
static final String KEY_STREAM_LISTENER_CONFIG_URL = "stream_listener_config_url";
static final String KEY_STREAM_LISTENER_CONFIG_DATA = "stream_listener_config_data";
static final String KEY_TABLET_TOOT_DEFAULT_ACCOUNT = "tablet_toot_default_account";
// 項目を追加したらAppDataExporter#importPref のswitch文も更新すること
}

View File

@ -8,8 +8,6 @@
android:scrollbarStyle="outsideOverlay"
android:id="@+id/svContent"
android:paddingTop="12dp"
android:paddingBottom="128dp"
android:clipToPadding="false"
>
@ -19,6 +17,8 @@
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="12dp"
android:paddingBottom="12dp"
>
<View

View File

@ -24,115 +24,106 @@
android:orientation="vertical"
>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/notifications"
/>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_use_streaming_api"
android:text="@string/notification_option"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontUseStreaming"
<CheckBox
android:id="@+id/cbNotificationSound"
style="@style/setting_horizontal_stretch"
android:gravity="center"
android:text="@string/sound"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<LinearLayout style="@style/setting_row_form">
<CheckBox
android:id="@+id/cbNotificationVibration"
style="@style/setting_horizontal_stretch"
android:text="@string/vibration"
/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_refresh_on_activity_resume"
/>
</LinearLayout>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontRefreshOnResume"
<CheckBox
android:id="@+id/cbNotificationLED"
style="@style/setting_horizontal_stretch"
android:gravity="center"
android:text="@string/led"
/>
</LinearLayout>
<LinearLayout style="@style/setting_row_form">
<TextView
style="@style/setting_horizontal_stretch"
android:text="@string/notification_on_off_desc"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/disable_tablet_mode"
android:text="@string/custom_stream_listener"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDisableTabletMode"
style="@style/setting_horizontal_stretch"
android:gravity="center"
<Button
android:id="@+id/btnCustomStreamListenerEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/edit"
android:textAllCaps="false"
/>
<Button
android:id="@+id/btnCustomStreamListenerReset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset"
android:textAllCaps="false"
/>
</LinearLayout>
<LinearLayout style="@style/setting_row_form">
<TextView
style="@style/setting_horizontal_stretch"
android:text="@string/custom_stream_listener_desc"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:labelFor="@+id/etColumnWidth"
android:text="@string/minimum_column_width"
/>
<LinearLayout style="@style/setting_row_form">
<EditText
android:id="@+id/etColumnWidth"
style="@style/setting_horizontal_stretch"
android:gravity="center"
android:inputType="number"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_row_label"
android:labelFor="@+id/etMediaThumbHeight"
android:text="@string/media_thumbnail_height"
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/behavior"
/>
<LinearLayout style="@style/setting_row_form">
<EditText
android:id="@+id/etMediaThumbHeight"
style="@style/setting_horizontal_stretch"
android:gravity="center"
android:inputType="number"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_crop_media_thumbnail"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontCropMediaThumb"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -182,6 +173,142 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_screen_off"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontScreenOff"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/post"
/>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/resize_image"
/>
<LinearLayout style="@style/setting_row_form">
<Spinner
android:id="@+id/spResizeImage"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/refresh_after_toot"
/>
<LinearLayout style="@style/setting_row_form">
<Spinner
android:id="@+id/spRefreshAfterToot"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/tablet_mode"
/>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/disable_tablet_mode"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDisableTabletMode"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:labelFor="@+id/etColumnWidth"
android:text="@string/minimum_column_width"
/>
<LinearLayout style="@style/setting_row_form">
<EditText
android:id="@+id/etColumnWidth"
style="@style/setting_horizontal_stretch"
android:gravity="center"
android:inputType="number"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/toot_button_default_account"
/>
<LinearLayout style="@style/setting_row_form">
<Spinner
android:id="@+id/spDefaultAccount"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/media_attachment"
/>
<View style="@style/setting_divider"/>
@ -201,6 +328,52 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:labelFor="@+id/etMediaThumbHeight"
android:text="@string/media_thumbnail_height"
/>
<LinearLayout style="@style/setting_row_form">
<EditText
android:id="@+id/etMediaThumbHeight"
style="@style/setting_horizontal_stretch"
android:gravity="center"
android:inputType="number"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_crop_media_thumbnail"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontCropMediaThumb"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/appearance"
/>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/disable_fast_scroller"
@ -215,23 +388,6 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/ui_theme"
/>
<LinearLayout style="@style/setting_row_form">
<Spinner
android:id="@+id/spUITheme"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -251,59 +407,6 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/notification_option"
/>
<LinearLayout style="@style/setting_row_form">
<CheckBox
android:id="@+id/cbNotificationSound"
style="@style/setting_horizontal_stretch"
android:text="@string/sound"
/>
</LinearLayout>
<LinearLayout style="@style/setting_row_form">
<CheckBox
android:id="@+id/cbNotificationVibration"
style="@style/setting_horizontal_stretch"
android:text="@string/vibration"
/>
</LinearLayout>
<LinearLayout style="@style/setting_row_form">
<CheckBox
android:id="@+id/cbNotificationLED"
style="@style/setting_horizontal_stretch"
android:text="@string/led"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/resize_image"
/>
<LinearLayout style="@style/setting_row_form">
<Spinner
android:id="@+id/spResizeImage"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/show_follow_button_in_button_bar"
@ -319,24 +422,6 @@
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/refresh_after_toot"
/>
<LinearLayout style="@style/setting_row_form">
<Spinner
android:id="@+id/spRefreshAfterToot"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
@ -356,6 +441,22 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/ui_theme"
/>
<LinearLayout style="@style/setting_row_form">
<Spinner
android:id="@+id/spUITheme"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/footer_color"
@ -365,7 +466,8 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
>
<LinearLayout
android:id="@+id/llFooterBG"
@ -417,7 +519,6 @@
android:orientation="horizontal"
>
</LinearLayout>
</HorizontalScrollView>
@ -444,15 +545,16 @@
/>
</LinearLayout>
<View android:layout_width="48dp"
android:layout_height="2dp"
android:layout_gravity="center_horizontal"
tools:background="#f00"
android:id="@+id/vIndicator"/>
<View
android:id="@+id/vIndicator"
android:layout_width="48dp"
android:layout_height="2dp"
android:layout_gravity="center_horizontal"
tools:background="#f00"
/>
</FrameLayout>
</LinearLayout>
<LinearLayout style="@style/setting_row_form">
<TextView
@ -481,7 +583,6 @@
</LinearLayout>
<LinearLayout style="@style/setting_row_form"
>
@ -597,22 +698,6 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_screen_off"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontScreenOff"
style="@style/setting_horizontal_stretch"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/timeline_font"
@ -649,12 +734,65 @@
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/performance"
/>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_use_streaming_api"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontUseStreaming"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/dont_refresh_on_activity_resume"
/>
<LinearLayout style="@style/setting_row_form">
<Switch
android:id="@+id/swDontRefreshOnResume"
style="@style/setting_horizontal_stretch"
android:gravity="center"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<TextView
style="@style/setting_group_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/actions"
/>
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/actions"
/>
<LinearLayout style="@style/setting_row_form">
<Button
@ -689,40 +827,8 @@
<View style="@style/setting_divider"/>
<TextView
style="@style/setting_row_label"
android:text="@string/custom_stream_listener"
/>
<LinearLayout style="@style/setting_row_form">
<Button
android:id="@+id/btnCustomStreamListenerEdit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/edit"
android:textAllCaps="false"
/>
<Button
android:id="@+id/btnCustomStreamListenerReset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/reset"
android:textAllCaps="false"
/>
</LinearLayout>
<LinearLayout style="@style/setting_row_form">
<TextView
style="@style/setting_horizontal_stretch"
android:text="@string/custom_stream_listener_desc"
/>
</LinearLayout>
<View style="@style/setting_divider"/>
<!-- =============================================== -->
<!-- =============================================== -->
<!--<TextView-->
<!--style="@style/setting_row_label"-->
@ -766,7 +872,6 @@
<!--</LinearLayout>-->
<!--<View style="@style/setting_divider"/>-->
<!--<TextView-->
@ -783,7 +888,6 @@
<!--/>-->
<!--</LinearLayout>-->
<!--<View style="@style/setting_divider"/>-->
<!--<TextView-->
@ -800,7 +904,6 @@
<!--/>-->
<!--</LinearLayout>-->
<!--<View style="@style/setting_divider"/>-->
<!--<TextView-->

View File

@ -199,7 +199,7 @@
<string name="nickname">Pseudonyme</string>
<string name="nickname_and_color">Pseudo et couleur</string>
<string name="nickname_applied_after_reload">Le changement de pseudo/couleur sera appliqué après actualisation.</string>
<string name="nickname_label">Pseudo. (s\'il est spécifié, il remplacera le nom du compte affiché)</string>
<string name="nickname_label">Pseudo et couleur. (s\'il est spécifié, il remplacera le nom du compte affiché)</string>
<string name="not_available_for_pseudo_account">Non disponible pour les personnes non connectés</string>
<string name="not_selected">(Aucune sélection)</string>
<string name="notification_count">%1$d notifications</string>
@ -344,6 +344,15 @@
<string name="plugin_not_installed">Aucun plugin Mushroom n\'est installé.</string>
<string name="language_code">fr</string>
<string name="recommended_plugin">Plugins Mushroom recommandés</string>
<string name="appearance">Appearance</string>
<string name="behavior">Behavior</string>
<string name="notification_on_off_desc">See also account setting to enable/disable notification.</string>
<string name="performance">Performance</string>
<string name="tablet_mode">Tablet mode</string>
<string name="post">Post</string>
<string name="toot_button_default_account">Default acount when toot button tapped</string>
<string name="account_change_failed_old_draft_has_no_in_reply_to_url">Account change failed. Old draft data has no in_reply_to_url, can\'t convert in_repley_to for selected instance.</string>
<string name="in_reply_to_id_conversion_failed">\"in_reply_to\" ID conversion failed.</string>
<!--<string name="abc_action_bar_home_description">Revenir à l\'accueil</string>-->
<!--<string name="abc_action_bar_home_description_format">%1$s, %2$s</string>-->

View File

@ -300,7 +300,7 @@
<!---->
<string name="back_button_action">戻るボタンの動作</string>
<!---->
<string name="prior_local_url_when_open_attachment">添付画像を開く時に自タンスURLを重視</string>
<string name="prior_local_url_when_open_attachment">添付メディアを開く時に自タンスURLを重視</string>
<!---->
<string name="disable_fast_scroller">FastScrollerを無効にする(アプリ再起動が必要)</string>
<!---->
@ -452,7 +452,7 @@
<!---->
<string name="nickname"></string>
<!---->
<string name="nickname_label">通称 (指定するとAcctの代わりに表示されます)</string>
<string name="nickname_label">通称と色 (指定するとAcctの代わりに表示されます)</string>
<!---->
<string name="preview">プレビュー</string>
<!---->
@ -498,7 +498,7 @@
<!---->
<string name="favourited_by">発言をお気に入りした人</string>
<!---->
<string name="refresh_after_toot">発言後の更新</string>
<string name="refresh_after_toot">投稿後の更新</string>
<!---->
<string name="refresh_no_scroll">更新するがスクロールしない</string>
<!---->
@ -631,5 +631,14 @@
<string name="plugin_not_installed">プラグインがインストールされてません</string>
<string name="language_code">ja</string>
<string name="recommended_plugin">おすすめプラグイン</string>
<string name="appearance">見た目</string>
<string name="behavior">挙動</string>
<string name="notification_on_off_desc">通知のON/OFFはアカウント設定にあります</string>
<string name="performance">性能</string>
<string name="tablet_mode">タブレットモード</string>
<string name="post">投稿</string>
<string name="toot_button_default_account">トゥートボタンを押した時のデフォルトアカウント</string>
<string name="account_change_failed_old_draft_has_no_in_reply_to_url">アカウント切り替えできません。古い下書きデータにはin_reply_to_urlがなくて、別タンスへの切り替えができません。</string>
<string name="in_reply_to_id_conversion_failed">アカウント切り替えできません。in_reply_toのID変換に失敗しました。</string>
</resources>

View File

@ -222,7 +222,7 @@
<string name="confirm_block_user">User \'%1$s\' will be blocked. Are you sure?</string>
<string name="confirm_mute_user">User \'%1$s\' will be muted. Are you sure?</string>
<string name="confirm_delete_status">This toot will be deleted. Are you sure?</string>
<string name="nickname_label">Nickname (if specified, it\'s shown instead of full acct)</string>
<string name="nickname_label">Nickname and color (if specified, it\'s shown instead of full acct)</string>
<string name="color">Color</string>
<string name="reset">Reset</string>
<string name="edit">Edit</string>
@ -340,4 +340,13 @@
<string name="plugin_not_installed">Plugin is not installed.</string>
<string name="language_code">en</string>
<string name="recommended_plugin">Recommended plugin</string>
<string name="tablet_mode">Tablet mode</string>
<string name="appearance">Appearance</string>
<string name="performance">Performance</string>
<string name="behavior">Behavior</string>
<string name="notification_on_off_desc">See also account setting to enable/disable notification.</string>
<string name="post">Post</string>
<string name="toot_button_default_account">Default acount when toot button tapped</string>
<string name="account_change_failed_old_draft_has_no_in_reply_to_url">Account change failed. Old draft data has no in_reply_to_url, can\'t convert in_repley_to for selected instance.</string>
<string name="in_reply_to_id_conversion_failed">\"in_reply_to\" ID conversion failed.</string>
</resources>

View File

@ -193,7 +193,7 @@
<item name="android:layout_height">wrap_content</item>
<item name="android:textSize">20sp</item>
<item name="android:textStyle">bold</item>
<item name="android:layout_marginTop">20dp</item>
<item name="android:layout_marginTop">32dp</item>
</style>