diff --git a/.idea/misc.xml b/.idea/misc.xml index bb506a3..13e7453 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -3,12 +3,10 @@ diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java index cde184d..b56eb3c 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/MainActivity.java @@ -1,11 +1,20 @@ package org.ntlab.acanthus_client.views; +import android.content.Intent; import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; import com.google.android.material.bottomnavigation.BottomNavigationView; +import org.ntlab.acanthus_client.Acanthus; import org.ntlab.acanthus_client.R; import org.ntlab.acanthus_client.databinding.ActivityMainBinding; +import org.ntlab.acanthus_client.views.main_menu_ui.mypage.MyPageFragment; +import org.ntlab.acanthus_client.views.paint.SendScreenShotActivity; +import org.ntlab.acanthus_client.views.userpage.UserPageActivity; import androidx.appcompat.app.AppCompatActivity; import androidx.navigation.NavController; @@ -17,6 +26,7 @@ public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; + Intent intent; @Override protected void onCreate(Bundle savedInstanceState) { @@ -37,4 +47,22 @@ NavigationUI.setupWithNavController(binding.navView, navController); } + // ツールバーにIconを表示 + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.botton_nav_icon, menu); + return true; + } + // Iconを押したときMyPageに遷移させたい +// @Override +// public boolean onOptionsItemSelected(MenuItem item) { +// switch (item.getItemId()) { +// case R.id.icon: +// intent = new Intent(getApplication(), MyPageFragment.class); +// startActivity(intent); +// return true; +// } +// return super.onOptionsItemSelected(item); +// } + } \ No newline at end of file diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/animation_detail/AnimationDetailActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/animation_detail/AnimationDetailActivity.java index 0c73651..4095dc7 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/animation_detail/AnimationDetailActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/animation_detail/AnimationDetailActivity.java @@ -3,15 +3,24 @@ import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.os.Bundle; import android.view.View; +import android.view.ViewGroup; import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; import org.ntlab.acanthus_client.R; -import org.ntlab.acanthus_client.databinding.ActivityPaintBinding; import org.ntlab.acanthus_client.views.animation.AnimationActivity; import org.ntlab.acanthus_client.views.animation.AnimationCanvas; -import org.ntlab.acanthus_client.views.main_menu_ui.mypage.MyPageFragment; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; public class AnimationDetailActivity extends AppCompatActivity { @@ -23,6 +32,23 @@ super.onCreate(savedInstanceState); setContentView(R.layout.activity_animation_detail); + //文字入力テスト + EditText editText = findViewById(R.id.edit_text); + TextView wordText = findViewById(R.id.word_text); + TextView wordText2 = findViewById(R.id.word_text2); + Button wordButton = findViewById(R.id.word_button); + + wordButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // エディットテキストのテキストを取得 + String text = editText.getText().toString(); + // 取得したテキストを TextView に張り付ける + wordText.setText(text); + wordText2.setText(text); + } + }); + //画面を閉じる Button returnButton = findViewById(R.id.return_button); returnButton.setOnClickListener(v -> finish()); @@ -30,18 +56,56 @@ //作成者のページに移動(今は仮でアニメーション画面へ) Button buttonEditor1 = findViewById(R.id.button_editor1); buttonEditor1.setOnClickListener((View v) -> { - Intent intent = new Intent(AnimationDetailActivity.this, AnimationActivity.class); - startActivity(intent); - } + Intent intent = new Intent(AnimationDetailActivity.this, AnimationActivity.class); + startActivity(intent); + } ); - //作成者のページに移動(今は仮でアニメーション画面へ) + /* //作成者のページに移動(今は仮でアニメーション画面へ) Button buttonEditor2 = findViewById(R.id.button_editor2); buttonEditor2.setOnClickListener((View v) -> { - Intent intent = new Intent(AnimationDetailActivity.this, AnimationActivity.class); - startActivity(intent); - } + Intent intent = new Intent(AnimationDetailActivity.this, AnimationActivity.class); + startActivity(intent); + } ); + +*//* //レイアウトパラム定数(縦横の長さの定数)の格納 + final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; + final int MP = ViewGroup.LayoutParams.MATCH_PARENT;*//* + + //基礎画面の作成 + LinearLayout oLayout = new LinearLayout(getApplicationContext()); + oLayout.setOrientation(LinearLayout.VERTICAL); + setContentView(oLayout); + +*//* //普通のviewの生成 + ImageView oImg = new ImageView(getApplicationContext()); + //横MAXの縦幅は画像と同じ高さ + oImg.setLayoutParams(new LinearLayout.LayoutParams(MP, WC));*//* + + ImageView oImg = findViewById(R.id.samune); + + URL url; + InputStream stream; + try { + //画像のURLを直うち + url = new URL("http://nitta-lab-www.is.konan-u.ac.jp/gallery/test/0/test.jpg"); + //インプットストリームで画像を読み込む + stream = url.openStream(); + //読み込んだファイルをビットマップに変換 + Bitmap oBmp = BitmapFactory.decodeStream(stream); + //ビットマップをImageViewに設定 + oImg.setImageBitmap(oBmp); + //インプットストリームを閉じる + stream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + oLayout.addView(oImg);*/ } + } + + + diff --git a/app/src/main/java/org/ntlab/acanthus_client/views/paint/SendScreenShotActivity.java b/app/src/main/java/org/ntlab/acanthus_client/views/paint/SendScreenShotActivity.java index 732e525..a98df51 100644 --- a/app/src/main/java/org/ntlab/acanthus_client/views/paint/SendScreenShotActivity.java +++ b/app/src/main/java/org/ntlab/acanthus_client/views/paint/SendScreenShotActivity.java @@ -3,111 +3,137 @@ import androidx.appcompat.app.AppCompatActivity; import android.app.Activity; +import android.graphics.ImageFormat; +import android.os.Bundle; import android.content.Intent; import android.graphics.Bitmap; -import android.net.Uri; -import android.os.Bundle; -import android.os.Environment; +import android.graphics.PixelFormat; +import android.hardware.display.DisplayManager; +import android.hardware.display.VirtualDisplay; +import android.media.Image; +import android.media.ImageReader; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.util.DisplayMetrics; +import android.util.Log; import android.view.View; import android.widget.Button; +import android.widget.ImageView; +import android.widget.Toast; import org.ntlab.acanthus_client.R; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; +import java.nio.ByteBuffer; -public class SendScreenShotActivity extends Activity implements View.OnClickListener { +import static android.graphics.ImageFormat.JPEG; + + +public class SendScreenShotActivity extends Activity { + + private MediaProjectionManager mpManager; + private MediaProjection mProjection; + private static final int REQUEST_MEDIA_PROJECTION = 1001; + + private int displayWidth, displayHeight; + private ImageReader imageReader; + private VirtualDisplay virtualDisplay; + private int screenDensity; + private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_screen_shot); - // 全体キャプチャ - Button captureAll = (Button)findViewById(R.id.capture_all); - captureAll.setOnClickListener(this); - // アイコン画像のみキャプチャ - Button captureIcon = (Button)findViewById(R.id.capture_icon); - captureIcon.setOnClickListener(this); + Button button = findViewById(R.id.capture); + // ボタンタップでスクリーンショットを撮る + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + getScreenshot(); + } + }); - // キャプチャした画像を添付してメールを送る - Button sendMail = (Button)findViewById(R.id.send_mail); - sendMail.setOnClickListener(this); + // 撮影したスクリーンを表示するImageView + imageView = findViewById(R.id.image); + // 画面の縦横サイズとdpを取得 + DisplayMetrics displayMetrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); + screenDensity = displayMetrics.densityDpi; + displayWidth = displayMetrics.widthPixels; + displayHeight = displayMetrics.heightPixels; + + mpManager = (MediaProjectionManager) + getSystemService(MEDIA_PROJECTION_SERVICE); + + // permissionを確認するintentを投げ、ユーザーの許可・不許可を受け取る + if(mpManager != null){ + startActivityForResult(mpManager.createScreenCaptureIntent(), + REQUEST_MEDIA_PROJECTION); + } + } + + // ユーザーの許可を受け取る + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (REQUEST_MEDIA_PROJECTION == requestCode) { + if (resultCode != RESULT_OK) { + // 拒否された + Toast.makeText(this, + "User cancelled", Toast.LENGTH_LONG).show(); + return; + } + // 許可された結果を受け取る + setUpMediaProjection(resultCode, data); + } + } + + private void setUpMediaProjection(int code, Intent intent) { + mProjection = mpManager.getMediaProjection(code, intent); + setUpVirtualDisplay(); + } + + private void setUpVirtualDisplay() { + imageReader = ImageReader.newInstance( + displayWidth, displayHeight, 0x1, 2); + + virtualDisplay = mProjection.createVirtualDisplay("ScreenCapture", + displayWidth, displayHeight, screenDensity, + DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR, + imageReader.getSurface(), null, null); + } + + private void getScreenshot() { + // ImageReaderから画面を取り出す + Log.d("debug", "getScreenshot"); + + Image image = imageReader.acquireLatestImage(); + Image.Plane[] planes = image.getPlanes(); + ByteBuffer buffer = planes[0].getBuffer(); + + int pixelStride = planes[0].getPixelStride(); + int rowStride = planes[0].getRowStride(); + int rowPadding = rowStride - pixelStride * displayWidth; + + // バッファからBitmapを生成 + Bitmap bitmap = Bitmap.createBitmap( + displayWidth + rowPadding / pixelStride, displayHeight, + Bitmap.Config.ARGB_8888); + bitmap.copyPixelsFromBuffer(buffer); + image.close(); + + imageView.setImageBitmap(bitmap); } @Override - public void onClick(View v) { - // 読み書きするファイル名を指定 - File file = new File(Environment.getExternalStorageDirectory() + "/capture.jpeg"); - // 指定したファイル名が無ければ作成する。 - file.getParentFile().mkdir(); - - switch(v.getId()) { - case R.id.capture_all: - // 全体を撮る - saveCapture(findViewById(android.R.id.content),file); - break; - case R.id.capture_icon: - // View1を撮る - saveCapture(findViewById(R.id.icon),file); - break; - case R.id.send_mail: - Intent intent = new Intent(); - intent.setAction(Intent.ACTION_SEND); - intent.putExtra(Intent.EXTRA_EMAIL, new String[] {"s1871104@s.konan-u.ac.jp"}); - intent.setType("message/rfc822"); - intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file)); - startActivity(intent); - - break; + protected void onDestroy() { + if (virtualDisplay != null) { + Log.d("debug","release VirtualDisplay"); + virtualDisplay.release(); } + super.onDestroy(); } - - /** - * 撮ったキャプチャを保存 - * @param view - * @param 書き込み先ファイルfile - */ - public void saveCapture(View view, File file) { - // キャプチャを撮る - Bitmap capture = getViewCapture(view); - FileOutputStream fos = null; - try { - fos = new FileOutputStream(file, false); - // 画像のフォーマットと画質と出力先を指定して保存 - capture.compress(Bitmap.CompressFormat.JPEG, 100, fos); - fos.flush(); - } catch (Exception e) { - e.printStackTrace(); - } finally { - if (fos != null) { - try { - fos.close(); - } catch (IOException ie) { - fos = null; - } - } - } - } - - /** - * キャプチャを撮る - * @param 撮りたいview - * @return 撮ったキャプチャ(Bitmap) - */ - public Bitmap getViewCapture(View view) { - view.setDrawingCacheEnabled(true); - - // Viewのキャプチャを取得 - Bitmap cache = view.getDrawingCache(); - if(cache == null){ - return null; - } - Bitmap screenShot = Bitmap.createBitmap(cache); - view.setDrawingCacheEnabled(false); - return screenShot; - } - } \ No newline at end of file diff --git a/app/src/main/res/drawable/icon_jen_1007042258.png b/app/src/main/res/drawable/icon_jen_1007042258.png new file mode 100644 index 0000000..1253e7a --- /dev/null +++ b/app/src/main/res/drawable/icon_jen_1007042258.png Binary files differ diff --git a/app/src/main/res/layout/activity_animation_detail.xml b/app/src/main/res/layout/activity_animation_detail.xml index 66148e1..06897a0 100644 --- a/app/src/main/res/layout/activity_animation_detail.xml +++ b/app/src/main/res/layout/activity_animation_detail.xml @@ -4,7 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:id="@+id/animationDetails" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="#F7F7F7">