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" />