diff --git a/app/build.gradle b/app/build.gradle index 634ca945..d0d88918 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "jp.juggler.subwaytooter" minSdkVersion 21 targetSdkVersion 26 - versionCode 125 - versionName "1.2.5" + versionCode 126 + versionName "1.2.6" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/jp/juggler/subwaytooter/ActPost.java b/app/src/main/java/jp/juggler/subwaytooter/ActPost.java index a0d750e8..02a37fdb 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/ActPost.java +++ b/app/src/main/java/jp/juggler/subwaytooter/ActPost.java @@ -312,7 +312,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, JSONArray array = new JSONArray( sv ); for( int i = 0, ie = array.length() ; i < ie ; ++ i ){ try{ - TootAttachment a = TootAttachment.parse( array.optJSONObject( i ) ); + TootAttachment a = TootAttachment.parse( array.optJSONObject( i ) ); if( a != null ){ attachment_list.add( new PostAttachment( a ) ); } @@ -395,73 +395,76 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, try{ TootStatus reply_status = TootStatus.parse( ActPost.this, account, new JSONObject( sv ) ); - // CW をリプライ元に合わせる - if( ! TextUtils.isEmpty( reply_status.spoiler_text ) ){ - cbContentWarning.setChecked( true ); - etContentWarning.setText( reply_status.spoiler_text ); - } - - ArrayList< String > mention_list = new ArrayList<>(); - - // 元レスにあった mention - if( reply_status.mentions != null ){ - for( TootMention mention : reply_status.mentions ){ - - if( account.isMe( mention.acct ) ) continue; - - sv = "@" + account.getFullAcct( mention.acct ); - if( ! mention_list.contains( sv ) ){ - mention_list.add( sv ); - } + if( reply_status !=null ){ + // CW をリプライ元に合わせる + if( ! TextUtils.isEmpty( reply_status.spoiler_text ) ){ + cbContentWarning.setChecked( true ); + etContentWarning.setText( reply_status.spoiler_text ); } - } - - // 今回メンションを追加する? - { - sv = account.getFullAcct( reply_status.account ); - //noinspection StatementWithEmptyBody - if( mention_list.contains( "@" + sv ) ){ - // 既に含まれている - }else if( ! account.isMe( reply_status.account ) || mention_list.isEmpty() ){ - // 自分ではない、もしくは、メンションが空 - mention_list.add( "@" + sv ); - } - } - - StringBuilder sb = new StringBuilder(); - for( String acct : mention_list ){ - if( sb.length() > 0 ) sb.append( ' ' ); - sb.append( acct ); - } - if( sb.length() > 0 ){ - sb.append( ' ' ); - etContent.setText( sb.toString() ); - etContent.setSelection( sb.length() ); - } - - // リプライ表示をつける - in_reply_to_id = reply_status.id; - in_reply_to_text = reply_status.content; - in_reply_to_image = reply_status.account == null ? null : reply_status.account.avatar_static; - in_reply_to_url = reply_status.url; - - // 公開範囲 - try{ - // 比較する前にデフォルトの公開範囲を計算する - if( TextUtils.isEmpty( visibility ) ){ - visibility = account.visibility; - if( TextUtils.isEmpty( visibility ) ){ - visibility = TootStatus.VISIBILITY_PUBLIC; + + ArrayList< String > mention_list = new ArrayList<>(); + + // 元レスにあった mention + if( reply_status.mentions != null ){ + for( TootMention mention : reply_status.mentions ){ + + if( account.isMe( mention.acct ) ) continue; + + sv = "@" + account.getFullAcct( mention.acct ); + if( ! mention_list.contains( sv ) ){ + mention_list.add( sv ); + } } } - // デフォルトの方が公開範囲が大きい場合、リプライ元に合わせて公開範囲を狭める - int i = TootStatus.compareVisibility( this.visibility, reply_status.visibility ); - if( i > 0 ){ // より大きい=>より公開範囲が広い - this.visibility = reply_status.visibility; + // 今回メンションを追加する? + { + sv = account.getFullAcct( reply_status.account ); + //noinspection StatementWithEmptyBody + if( mention_list.contains( "@" + sv ) ){ + // 既に含まれている + }else if( ! account.isMe( reply_status.account ) || mention_list.isEmpty() ){ + // 自分ではない、もしくは、メンションが空 + mention_list.add( "@" + sv ); + } } - }catch( Throwable ex ){ - log.trace( ex ); + + StringBuilder sb = new StringBuilder(); + for( String acct : mention_list ){ + if( sb.length() > 0 ) sb.append( ' ' ); + sb.append( acct ); + } + if( sb.length() > 0 ){ + sb.append( ' ' ); + etContent.setText( sb.toString() ); + etContent.setSelection( sb.length() ); + } + + // リプライ表示をつける + in_reply_to_id = reply_status.id; + in_reply_to_text = reply_status.content; + in_reply_to_image = reply_status.account == null ? null : reply_status.account.avatar_static; + in_reply_to_url = reply_status.url; + + // 公開範囲 + try{ + // 比較する前にデフォルトの公開範囲を計算する + if( TextUtils.isEmpty( visibility ) ){ + visibility = account.visibility; + if( TextUtils.isEmpty( visibility ) ){ + visibility = TootStatus.VISIBILITY_PUBLIC; + } + } + + // デフォルトの方が公開範囲が大きい場合、リプライ元に合わせて公開範囲を狭める + int i = TootStatus.compareVisibility( this.visibility, reply_status.visibility ); + if( i > 0 ){ // より大きい=>より公開範囲が広い + this.visibility = reply_status.visibility; + } + }catch( Throwable ex ){ + log.trace( ex ); + } + } }catch( Throwable ex ){ @@ -487,8 +490,10 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, showVisibility(); updateTextCount(); showReplyTo(); + showEnquete(); } + @Override protected void onDestroy(){ post_helper.onDestroy(); @@ -536,6 +541,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, showVisibility(); updateTextCount(); showReplyTo(); + showEnquete(); } Button btnAccount; @@ -548,6 +554,11 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, CheckBox cbContentWarning; MyEditText etContentWarning; MyEditText etContent; + + CheckBox cbEnquete; + View llEnquete; + final MyEditText[] list_etChoice = new MyEditText[4]; + TextView tvCharCount; Handler handler; View formRoot; @@ -578,26 +589,34 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, Styler.fixHorizontalMargin( findViewById( R.id.llFooterBar ) ); formRoot = findViewById( R.id.viewRoot ); - scrollView = (ScrollView) findViewById( R.id.scrollView ); - btnAccount = (Button) findViewById( R.id.btnAccount ); - btnVisibility = (ImageButton) findViewById( R.id.btnVisibility ); + scrollView = findViewById( R.id.scrollView ); + btnAccount = findViewById( R.id.btnAccount ); + btnVisibility = findViewById( R.id.btnVisibility ); btnAttachment = findViewById( R.id.btnAttachment ); btnPost = findViewById( R.id.btnPost ); llAttachment = findViewById( R.id.llAttachment ); - ivMedia[ 0 ] = (MyNetworkImageView) findViewById( R.id.ivMedia1 ); - ivMedia[ 1 ] = (MyNetworkImageView) findViewById( R.id.ivMedia2 ); - ivMedia[ 2 ] = (MyNetworkImageView) findViewById( R.id.ivMedia3 ); - ivMedia[ 3 ] = (MyNetworkImageView) findViewById( R.id.ivMedia4 ); - cbNSFW = (CheckBox) findViewById( R.id.cbNSFW ); - cbContentWarning = (CheckBox) findViewById( R.id.cbContentWarning ); - etContentWarning = (MyEditText) findViewById( R.id.etContentWarning ); - etContent = (MyEditText) findViewById( R.id.etContent ); - tvCharCount = (TextView) findViewById( R.id.tvCharCount ); + ivMedia[ 0 ] = findViewById( R.id.ivMedia1 ); + ivMedia[ 1 ] = findViewById( R.id.ivMedia2 ); + ivMedia[ 2 ] = findViewById( R.id.ivMedia3 ); + ivMedia[ 3 ] = findViewById( R.id.ivMedia4 ); + cbNSFW = findViewById( R.id.cbNSFW ); + cbContentWarning = findViewById( R.id.cbContentWarning ); + etContentWarning = findViewById( R.id.etContentWarning ); + etContent = findViewById( R.id.etContent ); + + cbEnquete = findViewById( R.id.cbEnquete ); + llEnquete = findViewById( R.id.llEnquete ); + list_etChoice[0] = findViewById( R.id.etChoice1 ); + list_etChoice[1] = findViewById( R.id.etChoice2 ); + list_etChoice[2] = findViewById( R.id.etChoice3 ); + list_etChoice[3] = findViewById( R.id.etChoice4 ); + + tvCharCount = findViewById( R.id.tvCharCount ); llReply = findViewById( R.id.llReply ); - tvReplyTo = (TextView) findViewById( R.id.tvReplyTo ); + tvReplyTo = findViewById( R.id.tvReplyTo ); btnRemoveReply = findViewById( R.id.btnRemoveReply ); - ivReply = (MyNetworkImageView) findViewById( R.id.ivReply ); + ivReply = findViewById( R.id.ivReply ); account_list = SavedAccount.loadAccountList( ActPost.this, log ); Collections.sort( account_list, new Comparator< SavedAccount >() { @@ -628,6 +647,12 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, updateContentWarning(); } } ); + cbEnquete.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged( CompoundButton buttonView, boolean isChecked ){ + showEnquete(); + } + } ); post_helper = new PostHelper( this, pref, app_state.handler ); post_helper.attachEditText( formRoot, etContent, false, new PostHelper.Callback2() { @@ -1154,7 +1179,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, opener.deleteTempFile(); if( result != null && result.object != null ){ - pa.attachment = TootAttachment.parse( result.object ); + pa.attachment = TootAttachment.parse( result.object ); if( pa.attachment == null ){ result.error = "TootAttachment.parse failed"; } @@ -1402,6 +1427,15 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, private void performPost(){ post_helper.content = etContent.getText().toString().trim(); + if( ! cbEnquete.isChecked() ){ + post_helper.enquete_items = null; + }else{ + post_helper.enquete_items = new ArrayList<>(); + for( MyEditText et : list_etChoice ){ + post_helper.enquete_items.add( et.getText().toString().trim() ); + } + } + if( ! cbContentWarning.isChecked() ){ post_helper.spoiler_text = null; }else{ @@ -1467,14 +1501,30 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, static final String DRAFT_REPLY_TEXT = "reply_text"; static final String DRAFT_REPLY_IMAGE = "reply_image"; static final String DRAFT_REPLY_URL = "reply_url"; + static final String DRAFT_IS_ENQUETE = "is_enquete"; + static final String DRAFT_ENQUETE_ITEMS = "enquete_items"; private void saveDraft(){ String content = etContent.getText().toString(); - String content_warning = etContentWarning.getText().toString(); - if( TextUtils.isEmpty( content.trim() ) && TextUtils.isEmpty( content_warning.trim() ) ){ + String content_warning = cbContentWarning.isChecked() ? etContentWarning.getText().toString() : ""; + boolean isEnquete = cbEnquete.isChecked(); + String[] str_choice = new String[]{ + isEnquete ? list_etChoice[0].getText().toString():"", + isEnquete ? list_etChoice[1].getText().toString():"", + isEnquete ? list_etChoice[2].getText().toString():"", + isEnquete ? list_etChoice[3].getText().toString():"", + }; + boolean hasContent = false; + if( !TextUtils.isEmpty( content.trim() ) ) hasContent = true; + if( !TextUtils.isEmpty( content_warning.trim() ) ) hasContent = true; + for(String s :str_choice ){ + if( !TextUtils.isEmpty( s.trim() ) ) hasContent = true; + } + if(!hasContent ){ log.d( "saveDraft: dont save empty content" ); return; } + try{ JSONArray tmp_attachment_list = new JSONArray(); if( attachment_list != null ){ @@ -1496,6 +1546,13 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, json.put( DRAFT_REPLY_IMAGE, in_reply_to_image ); json.put( DRAFT_REPLY_URL, in_reply_to_url ); + json.put( DRAFT_IS_ENQUETE, isEnquete ); + JSONArray array = new JSONArray( ); + for(String s : str_choice){ + array.put(s); + } + json.put( DRAFT_ENQUETE_ITEMS, array ); + PostDraft.save( System.currentTimeMillis(), json ); }catch( Throwable ex ){ @@ -1544,7 +1601,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, list_warning.add( getString( R.string.account_in_draft_is_lost ) ); try{ for( int i = 0, ie = tmp_attachment_list.length() ; i < ie ; ++ i ){ - TootAttachment ta = TootAttachment.parse( tmp_attachment_list.optJSONObject( i ) ); + TootAttachment ta = TootAttachment.parse( tmp_attachment_list.optJSONObject( i ) ); if( ta != null ){ content = content.replace( ta.text_url, "" ); } @@ -1590,7 +1647,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, boolean isSomeAttachmentRemoved = false; for( int i = tmp_attachment_list.length() - 1 ; i >= 0 ; -- i ){ if( isCancelled() ) return null; - TootAttachment ta = TootAttachment.parse( tmp_attachment_list.optJSONObject( i ) ); + TootAttachment ta = TootAttachment.parse( tmp_attachment_list.optJSONObject( i ) ); if( ta == null ){ isSomeAttachmentRemoved = true; tmp_attachment_list.remove( i ); @@ -1642,6 +1699,20 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, cbNSFW.setChecked( nsfw_checked ); ActPost.this.visibility = visibility; + cbEnquete.setChecked( draft.optBoolean( DRAFT_IS_ENQUETE ,false) ); + JSONArray array = draft.optJSONArray( DRAFT_ENQUETE_ITEMS ); + if( array != null ){ + int src_index = 0; + for(MyEditText et : list_etChoice){ + if( src_index < array.length() ){ + et.setText( array.optString( src_index )); + ++src_index; + }else{ + et.setText( ""); + } + } + } + if( account != null ) setAccount( account ); if( tmp_attachment_list.length() > 0 ){ @@ -1651,7 +1722,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, attachment_list = new ArrayList<>(); } for( int i = 0, ie = tmp_attachment_list.length() ; i < ie ; ++ i ){ - TootAttachment ta = TootAttachment.parse( tmp_attachment_list.optJSONObject( i ) ); + TootAttachment ta = TootAttachment.parse( tmp_attachment_list.optJSONObject( i ) ); if( ta != null ){ PostAttachment pa = new PostAttachment( ta ); attachment_list.add( pa ); @@ -1670,6 +1741,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, showVisibility(); updateTextCount(); showReplyTo(); + showEnquete(); if( ! list_warning.isEmpty() ){ StringBuilder sb = new StringBuilder(); @@ -1784,7 +1856,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, @SuppressLint("InflateParams") View viewRoot = getLayoutInflater().inflate( R.layout.dlg_plugin_missing, null, false ); - TextView tvText = (TextView) viewRoot.findViewById( R.id.tvText ); + TextView tvText = viewRoot.findViewById( R.id.tvText ); LinkClickContext lcc = new LinkClickContext() { @Override public AcctColor findAcctColor( String url ){ return null; @@ -1794,7 +1866,7 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, tvText.setText( sv ); tvText.setMovementMethod( LinkMovementMethod.getInstance() ); - TextView tvTitle = (TextView) viewRoot.findViewById( R.id.tvTitle ); + TextView tvTitle = viewRoot.findViewById( R.id.tvTitle ); if( TextUtils.isEmpty( title ) ){ tvTitle.setVisibility( View.GONE ); }else{ @@ -1823,4 +1895,10 @@ public class ActPost extends AppCompatActivity implements View.OnClickListener, } } }; + + + private void showEnquete(){ + llEnquete.setVisibility( cbEnquete.isChecked() ? View.VISIBLE : View.GONE ); + } + } diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/PostHelper.java b/app/src/main/java/jp/juggler/subwaytooter/util/PostHelper.java index ebadbdec..178b8c49 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/PostHelper.java +++ b/app/src/main/java/jp/juggler/subwaytooter/util/PostHelper.java @@ -14,6 +14,10 @@ import android.text.TextUtils; import android.text.TextWatcher; import android.view.View; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -37,7 +41,6 @@ import okhttp3.RequestBody; public class PostHelper { private static final LogCategory log = new LogCategory( "PostHelper" ); - public interface Callback{ void onPostComplete(SavedAccount target_account,TootStatus status); } @@ -72,6 +75,7 @@ public class PostHelper { public boolean bNSFW; public long in_reply_to_id; public ArrayList< PostAttachment > attachment_list; + public ArrayList< String > enquete_items; public void post( final SavedAccount account,final boolean bConfirmTag, final boolean bConfirmAccount ,final Callback callback){ if( TextUtils.isEmpty( content ) ){ @@ -122,36 +126,84 @@ public class PostHelper { } } - final StringBuilder sb = new StringBuilder(); + RequestBody request_body; + String body_string; - sb.append( "status=" ); - sb.append( Uri.encode( content ) ); - - sb.append( "&visibility=" ); - sb.append( Uri.encode( visibility ) ); - - if( bNSFW ){ - sb.append( "&sensitive=1" ); - } - - if( spoiler_text != null ){ - sb.append( "&spoiler_text=" ); - sb.append( Uri.encode( spoiler_text ) ); - } - - if( in_reply_to_id != - 1L ){ - sb.append( "&in_reply_to_id=" ); - sb.append( Long.toString( in_reply_to_id ) ); - } - - if( attachment_list != null ){ - for( PostAttachment pa : attachment_list ){ - if( pa.attachment != null ){ - sb.append( "&media_ids[]=" ).append( pa.attachment.id ); + if( enquete_items == null || enquete_items.isEmpty() ){ + StringBuilder sb = new StringBuilder(); + + sb.append( "status=" ); + sb.append( Uri.encode( content ) ); + + sb.append( "&visibility=" ); + sb.append( Uri.encode( visibility ) ); + + if( bNSFW ){ + sb.append( "&sensitive=1" ); + } + + if( spoiler_text != null ){ + sb.append( "&spoiler_text=" ); + sb.append( Uri.encode( spoiler_text ) ); + } + + if( in_reply_to_id != - 1L ){ + sb.append( "&in_reply_to_id=" ); + sb.append( Long.toString( in_reply_to_id ) ); + } + + if( attachment_list != null ){ + for( PostAttachment pa : attachment_list ){ + if( pa.attachment != null ){ + sb.append( "&media_ids[]=" ).append( pa.attachment.id ); + } } } + + body_string = sb.toString(); + request_body = RequestBody.create( + TootApiClient.MEDIA_TYPE_FORM_URL_ENCODED + , body_string + ); + }else{ + JSONObject json = new JSONObject( ); + try{ + json.put("status",content); + json.put("visibility",visibility); + json.put("sensitive",bNSFW); + json.put("spoiler_text",TextUtils.isEmpty( spoiler_text ) ? "" : spoiler_text ); + json.put("in_reply_to_id", in_reply_to_id == -1L ? null : in_reply_to_id ); + JSONArray array = new JSONArray(); + if( attachment_list != null ){ + for( PostAttachment pa : attachment_list ){ + if( pa.attachment != null ){ + array.put( pa.attachment.id ); + } + } + } + json.put("media_ids",array); + json.put("isEnquete",true); + array = new JSONArray(); + for( String item : enquete_items ){ + array.put( item ); + } + json.put("enquete_items",array); + }catch(JSONException ex){ + log.trace( ex ); + log.e(ex,"status encoding failed."); + } + + body_string = json.toString(); + request_body = RequestBody.create( + TootApiClient.MEDIA_TYPE_JSON + , body_string + ); } + final Request.Builder request_builder = new Request.Builder() + .post(request_body ); + final String digest =Utils.digestSHA256( body_string + account.acct ); + final ProgressDialog progress = new ProgressDialog( activity ); final AsyncTask< Void, Void, TootApiResult > task = new AsyncTask< Void, Void, TootApiResult >() { @@ -175,14 +227,7 @@ public class PostHelper { } ); client.setAccount( target_account ); - String post_content = sb.toString(); - String digest = Utils.digestSHA256( post_content + target_account.acct ); - Request.Builder request_builder = new Request.Builder() - .post( RequestBody.create( - TootApiClient.MEDIA_TYPE_FORM_URL_ENCODED - , post_content - ) ); if( ! pref.getBoolean( Pref.KEY_DONT_DUPLICATION_CHECK, false ) ){ request_builder.header( "Idempotency-Key", digest ); @@ -191,29 +236,30 @@ public class PostHelper { TootApiResult result = client.request( "/api/v1/statuses", request_builder ); if( result != null && result.object != null ){ status = TootStatus.parse( activity, account, result.object ); - - Spannable s = status.decoded_content; - MyClickableSpan[] span_list = s.getSpans( 0, s.length(), MyClickableSpan.class ); - if( span_list != null ){ - ArrayList< String > tag_list = new ArrayList<>(); - for( MyClickableSpan span : span_list ){ - int start = s.getSpanStart( span ); - int end = s.getSpanEnd( span ); - String text = s.subSequence( start, end ).toString(); - if( text.startsWith( "#" ) ){ - tag_list.add( text.substring( 1 ) ); + if( status != null ){ + Spannable s = status.decoded_content; + MyClickableSpan[] span_list = s.getSpans( 0, s.length(), MyClickableSpan.class ); + if( span_list != null ){ + ArrayList< String > tag_list = new ArrayList<>(); + for( MyClickableSpan span : span_list ){ + int start = s.getSpanStart( span ); + int end = s.getSpanEnd( span ); + String text = s.subSequence( start, end ).toString(); + if( text.startsWith( "#" ) ){ + tag_list.add( text.substring( 1 ) ); + } } + int count = tag_list.size(); + if( count > 0 ){ + TagSet.saveList( + System.currentTimeMillis() + , tag_list.toArray( new String[ count ] ) + , 0 + , count + ); + } + } - int count = tag_list.size(); - if( count > 0 ){ - TagSet.saveList( - System.currentTimeMillis() - , tag_list.toArray( new String[ count ] ) - , 0 - , count - ); - } - } } diff --git a/app/src/main/res/layout/act_post.xml b/app/src/main/res/layout/act_post.xml index cafb8b5b..4b4171d3 100644 --- a/app/src/main/res/layout/act_post.xml +++ b/app/src/main/res/layout/act_post.xml @@ -78,9 +78,9 @@ android:layout_height="40dp" android:layout_marginStart="4dp" android:background="@drawable/btn_bg_transparent" + android:contentDescription="@string/delete" android:gravity="center_vertical" android:src="?attr/btn_close" - android:contentDescription="@string/delete" /> @@ -166,7 +166,6 @@ /> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -275,7 +383,6 @@ android:layout_weight="1" /> - Enquete was end. Voted! Vote failed. %1$s + choice 1 + choice 2 + choice 3(optional) + choice 4(optional) + Make enquete - + diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index a90583f0..dff1dc31 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -736,5 +736,10 @@ 投票は終わってる 投票しました 投票に失敗。%1$s + 項目1 + 項目2 + 項目3(オプション) + 項目4(オプション) + アンケートを作成する(一部タンスのみ有効) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c1640e5d..d77e53a5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -444,5 +444,10 @@ Enquete was end. Voted! Vote failed. %1$s + choice 1 + choice 2 + choice 3(optional) + choice 4(optional) + Make enquete