diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..7f74339 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java index 8a1d2a8..2af6024 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/login/LoginScreenViewModel.java @@ -1,5 +1,6 @@ package org.ntlab.acanthus_client.views.login; +import android.util.Log; import android.widget.EditText; import androidx.annotation.RestrictTo; @@ -63,6 +64,7 @@ @Override public void onFailure(Call call, Throwable t) { + Log.d("login:", "failed"); } }); } diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java index 6cab191..83065ac 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintActivity.java @@ -6,6 +6,7 @@ import android.content.Intent; import android.os.Bundle; +import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.Button; @@ -15,6 +16,10 @@ import org.ntlab.acanthus_client.Acanthus; import org.ntlab.acanthus_client.R; import org.ntlab.acanthus_client.databinding.ActivityPaintBinding; +import org.ntlab.acanthus_client.entities.Position; +import org.ntlab.acanthus_client.entities.Stroke; + +import java.util.Collection; //----------------------------------------------------------------- // 描画ページ @@ -127,6 +132,28 @@ binding.buttonAddPage.setText(String.valueOf(i)); } }); + paintViewModel.getStroke().observe(this, new Observer>() { + @Override + public void onChanged(Collection strokes) { + paintCanvas.getCanvas(); + } + }); +//1時的コメントアウトここから + // paintViewModel.getmStrokeNo().observe(this, new Observer() { +// @Override +// public void onChanged(Integer integer) { +// paintViewModel.getPosition(integer); +// } +// }); +// paintViewModel.getMlatestPosition().observe(this, new Observer>() { +// @Override +// public void onChanged(Collection positions) { +// if(positions.size()!=1){ +// //paintCanvas.latestPositionWrite(positions); +// } +// } +// }); +//ここまで } //------------------------------------------------------------------ diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java index 4e811a4..2757a84 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintCanvas.java @@ -1,64 +1,80 @@ package org.ntlab.acanthus_client.views.paint; import android.content.Context; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; +import android.os.Build; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; -import org.ntlab.acanthus_client.Acanthus; import org.ntlab.acanthus_client.entities.Position; import org.ntlab.acanthus_client.entities.Stroke; -import org.ntlab.acanthus_client.resources.HelloWorldRest; -import org.ntlab.acanthus_client.resources.gallery.StrokesRest; -import java.util.ArrayList; -import java.util.List; +import java.io.ByteArrayOutputStream; +import java.util.Base64; +import java.util.Collection; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import androidx.annotation.Nullable; -import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; - -import retrofit2.Call; -import retrofit2.Callback; -import retrofit2.Response; -import retrofit2.Retrofit; -import retrofit2.converter.jackson.JacksonConverterFactory; -import retrofit2.converter.scalars.ScalarsConverterFactory; +import androidx.annotation.RequiresApi; //----------------------------------------------------------------- // 描画キャンバスの本体 -public class PaintCanvas extends View implements Runnable{ +public class PaintCanvas extends View { private Path path; - private Path path2; + private Path clonepath; + private Path latestpath; private Paint paint; - private Paint paint2; + private Paint clonepaint; + private Paint latestpaint; private PaintViewModel paintViewModel; private ScheduledThreadPoolExecutor thread = new ScheduledThreadPoolExecutor(1); - private int localstrokeNo=0; + private Canvas curCanvas; + private Bitmap image; + private int curw; + private int curh; + private int curoldw; + private int curoldh; + + //----------------------------------------------------------------- //----------------------------------------------------------------- public PaintCanvas(Context context, @Nullable AttributeSet attrs) { super(context, attrs); path = new Path(); // 図形描画 - path2 = new Path(); // 図形描画 + clonepath = new Path(); // 図形描画 + latestpath = new Path(); // 図形描画 paint = new Paint();//筆の種類 - paint2 = new Paint();//筆の種類 + clonepaint = new Paint();//筆の種類 + latestpaint = new Paint();//筆の種類 paint.setColor(Color.BLACK);//色の指定 paint.setStyle(Paint.Style.STROKE);//線をひく paint.setStrokeWidth(20);//幅 - paint2.setColor(Color.RED);//色の指定 - paint2.setStyle(Paint.Style.STROKE);//線をひく - paint2.setStrokeWidth(20);//幅 - thread.scheduleWithFixedDelay(this, 1000L, 2000L, TimeUnit.MILLISECONDS); + clonepaint.setColor(Color.RED);//色の指定 + clonepaint.setStyle(Paint.Style.STROKE);//線をひく + clonepaint.setStrokeWidth(20);//幅 + latestpaint.setColor(Color.GREEN);//色の指定 + latestpaint.setStyle(Paint.Style.STROKE);//線をひく + latestpaint.setStrokeWidth(20);//幅 + //image = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888); + //curCanvas = new Canvas(image); + + + invalidate(); + } + + //----------------------------------------------------------------- + // getter + public Canvas getCurCanvas() { + return curCanvas; } //----------------------------------------------------------------- @@ -72,9 +88,15 @@ // @Override protected void onDraw(Canvas canvas) { - super.onDraw(canvas); + super.onDraw(curCanvas); + //canvas.setBitmap(image); + //curCanvas = canvas; canvas.drawPath(path, paint); - canvas.drawPath(path2, paint2); + canvas.drawPath(clonepath, clonepaint); + canvas.drawPath(latestpath,latestpaint); + curCanvas.drawPath(path, paint); + curCanvas.drawPath(clonepath, clonepaint); + curCanvas.drawPath(latestpath,latestpaint); } //----------------------------------------------------------------- @@ -91,14 +113,14 @@ Log.d("motion", "+++++++++++++++++++++++++++++++++++++++down======================================================"); onTouched(x, y); paintViewModel.setmStrokeNo(); - paintViewModel.addLocalStrokeRequest(x,y); + paintViewModel.addLocalStrokeRequest(x, y); //paintViewModel.addPositionLocal(x, y); break; case MotionEvent.ACTION_MOVE: Log.d("motion", "move"); onTouchedMove(x, y); - paintViewModel.addPositionRequest(x,y); + paintViewModel.addPositionRequest(x, y); break; case MotionEvent.ACTION_UP: @@ -116,14 +138,14 @@ public void clearCanvas() { paintViewModel.deleteStrokesRequest(); path.reset(); - path2.reset(); + clonepath.reset(); + latestpath.reset(); invalidate(); } //----------------------------------------------------------------- // 押した瞬間の処理 private void onTouched(float x, float y) { - //path = new Path(); path.moveTo(x, y); invalidate(); } @@ -140,30 +162,87 @@ // 押した瞬間の処理 private void onTouched2(float x, float y) { //path2 = new Path(); - path2.moveTo(x, y); + clonepath.moveTo(x, y); invalidate(); } //----------------------------------------------------------------- // 押した後動かした時の処理 private void onTouchedMove2(float x, float y) { - path2.lineTo(x, y); + clonepath.lineTo(x, y); invalidate(); } + //----------------------------------------------------------------- + //----------------------------------------------------------------- + // 押した瞬間の処理 + private void latestOnTouched(float x, float y) { + //path2 = new Path(); + latestpath.moveTo(x, y); + invalidate(); + } + + //----------------------------------------------------------------- + // 押した後動かした時の処理 + private void latestOnTouchedMove(float x, float y) { + latestpath.lineTo(x, y); + invalidate(); + } + + + @RequiresApi(api = Build.VERSION_CODES.O) + public void canvassc() { + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + image.compress(Bitmap.CompressFormat.PNG, 100, stream); + byte[] byteArray = stream.toByteArray(); + String encode = Base64.getEncoder().encodeToString(byteArray); + Log.d("motion", "=====================================up======================================================"); + Log.d("motion", "=====================================up======================================================"); + int stringcnt=0; + int last=0; + for(int i = 0; i positions){ +// int cnt = 0; +// latestpath.reset(); +// invalidate(); +// for(Position p: positions){ +// Log.d("", "latestPositionWrite: "+positions.size()); +// Log.d("", "latestPositionWrite: cnt"+cnt); +// if (cnt == 0) { +// //latestOnTouched(p.getX(), p.getY()); +// Log.d("", "latestPositionWrite: "+p.getX()+","+ p.getY()); +// } else { +// if (p.getX() == -1) { +// } else { +// //latestOnTouchedMove(p.getX(), p.getY()); +// } +// } +// cnt++; +// } +// paintViewModel.deletePosition(); +// } } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java index 006c203..071a083 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintToolBar.java @@ -1,9 +1,11 @@ package org.ntlab.acanthus_client.views.paint; import android.content.Intent; +import android.os.Build; import android.view.MenuItem; import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -21,10 +23,9 @@ //----------------------------------------------------------------- //----------------------------------------------------------------- - public PaintToolBar(AppCompatActivity appCompatActivity, PaintCanvas paintCanvas) { - this.bottomNavigationView = (BottomNavigationView) appCompatActivity.findViewById(R.id.navPaint); - - setNavigationListener(appCompatActivity, paintCanvas); + public PaintToolBar(PaintActivity paintActivity, PaintCanvas paintCanvas) { + this.bottomNavigationView = (BottomNavigationView) paintActivity.findViewById(R.id.navPaint); + setNavigationListener(paintActivity, paintCanvas); } //----------------------------------------------------------------- @@ -32,6 +33,7 @@ // ナビゲーションバーのタッチ監視 private void setNavigationListener(AppCompatActivity appCompatActivity, PaintCanvas paintCanvas) { this.onNavigationItemSelectedListener = new BottomNavigationView.OnNavigationItemSelectedListener() { + @RequiresApi(api = Build.VERSION_CODES.O) @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { @@ -52,6 +54,7 @@ //----------------------------------------------------------------- case R.id.navigation_page: + paintCanvas.canvassc(); transitionPageActivity(appCompatActivity); return true; diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java index c67d605..f9c4e99 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/PaintViewModel.java @@ -8,6 +8,7 @@ import androidx.lifecycle.ViewModel; import org.ntlab.acanthus_client.Acanthus; +import org.ntlab.acanthus_client.entities.Position; import org.ntlab.acanthus_client.entities.Stroke; import org.ntlab.acanthus_client.views.paint.models.PageConnectionModel; import org.ntlab.acanthus_client.views.paint.models.PageOperationModel; @@ -27,7 +28,8 @@ private MutableLiveData mCurPageNo = new MutableLiveData<>(1); private MutableLiveData mCurPageId = new MutableLiveData<>(0); private MutableLiveData mPageSize = new MutableLiveData<>(0); - private MutableLiveData mStrokeNo = new MutableLiveData(0); + private MutableLiveData mStrokeNo = new MutableLiveData(0); + private MutableLiveData> mlatestPosition= new MutableLiveData<>(); private MutableLiveData> mStrokes = new MutableLiveData<>(); private int strokeNo = 0; @@ -42,8 +44,8 @@ return this.mStrokes; } - public int getStrokeNo() { - return this.strokeNo; + public MutableLiveData getmStrokeNo() { + return this.mStrokeNo; } public LiveData getPageNo() { @@ -54,6 +56,8 @@ return paintModelContainer; } + public MutableLiveData> getMlatestPosition(){ return this.mlatestPosition;} + //----------------------------------------------------------------- //----------------------------------------------------------------- // init @@ -62,14 +66,16 @@ paintModelContainer.getPaintConnectionModel().init(acanthus); paintModelContainer.getInvitesConnectionModel().init(acanthus); - mStrokes.setValue(new ArrayList<>()); - mStrokes.getValue().add(new Stroke()); - + //mStrokes.setValue(new ArrayList<>()); + //mStrokes.getValue().add(new Stroke()); + mlatestPosition.setValue(new ArrayList<>()); + mlatestPosition.getValue().add(new Position()); // ページの情報初期化 paintModelContainer.getPageConnectionModel().getPage(mCurPageId); paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); - thread.scheduleWithFixedDelay(this, 1000L, 100L, TimeUnit.MILLISECONDS); + thread.scheduleWithFixedDelay(this, 50L, 100L, TimeUnit.MILLISECONDS); + //thread.scheduleWithFixedDelay(this::latestStrokeNo, 50L, 50L, TimeUnit.MILLISECONDS); } //----------------------------------------------------------------- @@ -182,23 +188,34 @@ public void deleteStroke() { this.mStrokes.getValue().clear(); } + public void deletePosition() { + this.mlatestPosition.getValue().clear(); + } //----------------------------------------------------------------- // public void getPageSizeRequest() { paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); } + //----------------------------------------------------------------- + //最新のStrokePositionを取得 + public void getPosition(Integer latestStrokeNo){ + paintModelContainer.getPaintConnectionModel().getLatestStrokePosition(latestStrokeNo,mlatestPosition); + //Log.d("debug", "run: "+mlatestPosition.getValue()); + } //----------------------------------------------------------------- //----------------------------------------------------------------- // 一定間隔でサーバー上の筆跡を取得する(GET) @Override public void run() { -// Log.d("debug", "run: "); paintModelContainer.getPaintConnectionModel().getStrokes(mStrokes); - paintModelContainer.getPaintConnectionModel().getStrokeNo(mStrokeNo); paintModelContainer.getPageConnectionModel().getPageSize(mPageSize); } + //一定間隔でserver上のStrokeNoSizeを返す + public void latestStrokeNo(){ + paintModelContainer.getPaintConnectionModel().getStrokeNo(mStrokeNo); + } //----------------------------------------------------------------- // diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/Point.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/Point.java new file mode 100644 index 0000000..2b32581 --- /dev/null +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/Point.java @@ -0,0 +1,40 @@ +package org.ntlab.acanthus_client.views.paint; + +import java.io.Serializable; + +public class Point implements Serializable { + float x, y; + float dx, dy; + + public float getDx() { + return dx; + } + + public float getDy() { + return dy; + } + + public void setDx(float dx) { + this.dx = dx; + } + + public void setDy(float dy) { + this.dy = dy; + } + + public float getX() { + return x; + } + + public float getY() { + return y; + } + + public void setX(float x) { + this.x = x; + } + + public void setY(float y) { + this.y = y; + } +} diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java index 3e07d5c..3e06146 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/models/PaintConnectionModel.java @@ -152,6 +152,25 @@ } }); } + //最新のStrokePositionを取得する + public void getLatestStrokePosition(Integer latestStrokeNo,MutableLiveData> mlatestPosition ){ + final StrokesRest strokesRest = retrofit.create(StrokesRest.class); + + //----------------------------------------------------------------- + // 現在の筆跡番号の取得 + Call> call = strokesRest.getPositions(acanthus.getAid(), latestStrokeNo); + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful())mlatestPosition.setValue(response.body()); + } + + @Override + public void onFailure(Call> call, Throwable t) { + + } + }); + } //----------------------------------------------------------------- // "Clear"ボタンによる描画の全消去 / サーバー側の筆跡全削除 diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/title/TitleActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/title/TitleActivity.java index 6a1dab4..b8ca99e 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/title/TitleActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/title/TitleActivity.java @@ -5,7 +5,6 @@ import android.os.Handler; import android.view.View; import android.widget.ImageView; -import android.widget.TextView; import com.bumptech.glide.Glide; diff --git a/app/src/main/res/layout/activity_paint.xml b/app/src/main/res/layout/activity_paint.xml index 7befaa3..17cb285 100644 --- a/app/src/main/res/layout/activity_paint.xml +++ b/app/src/main/res/layout/activity_paint.xml @@ -81,10 +81,11 @@ android:layout_width="410dp" android:layout_height="54dp" android:background="#FFFFFF" + app:labelVisibilityMode="labeled" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintHorizontal_bias="1.0" app:layout_constraintStart_toStartOf="parent" - app:labelVisibilityMode="labeled" app:menu="@menu/bottom_nav_paint" />