diff --git a/src/app/src/main/java/com/example/sleep/EditScreen.java b/src/app/src/main/java/com/example/sleep/EditScreen.java new file mode 100644 index 0000000..ebbadb7 --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/EditScreen.java @@ -0,0 +1,94 @@ +package com.example.sleep; + +import android.content.Context; +import android.content.SharedPreferences; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.FragmentActivity; +import android.text.TextUtils; +import android.util.Base64; +import android.view.View; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.Toast; + +import com.example.sleep.database.dao.DatabaseManager; + +import java.io.ByteArrayOutputStream; + +public class EditScreen extends FragmentActivity { + private ImageView showImage; + private ImageView postImage; + private String imageUrl; + private EditText messageEdit; + private Bitmap bitmap; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.event_content_activity); + + Bundle extras = getIntent().getExtras(); + boolean isPhoto = getIntent().getBooleanExtra("isPhoto", false); + + postImage = findViewById(R.id.event_content_post); + messageEdit = findViewById(R.id.event_content); + showImage = findViewById(R.id.event_image); + + // 根据传入的数据决定是否显示图片 + if (isPhoto) { + imageUrl = getIntent().getStringExtra("bitmapImageString"); + Bitmap bitmap = BitmapFactory.decodeFile(imageUrl); + showImage.setImageBitmap(bitmap); + } else { + if (extras != null) { + bitmap = extras.getParcelable("bitmapImage"); + if (bitmap != null) { + showImage.setImageBitmap(bitmap); + } + } + } + + postImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String message = messageEdit.getText().toString(); + if (TextUtils.isEmpty(message)) { + Toast.makeText(EditScreen.this, "请添加消息", Toast.LENGTH_SHORT).show(); + return; + } + + // 从SharedPreferences获取用户名 + SharedPreferences sharedPreferences = EditScreen.this.getSharedPreferences("MyPreferences", Context.MODE_PRIVATE); + String retrievedUserName = sharedPreferences.getString("UserNameKey", "DefaultUserName"); + + // 打开数据库管理器 + DatabaseManager manager = new DatabaseManager(EditScreen.this); + manager.open(); + + // 根据是否是照片贴文,将消息和图片信息保存到数据库 + if (isPhoto) { + manager.postMood(retrievedUserName, message, imageUrl); + } else { + String bitmapUrl = bitmapToBase64(bitmap); + manager.postMood(retrievedUserName, message, bitmapUrl); + } + + // 关闭数据库管理器 + manager.close(); + + finish(); + } + }); + } + + // 将Bitmap转换为Base64编码的字符串 + public String bitmapToBase64(Bitmap bitmap) { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); + byte[] byteArray = byteArrayOutputStream.toByteArray(); + return Base64.encodeToString(byteArray, Base64.DEFAULT); + } +} diff --git a/src/app/src/main/java/com/example/sleep/Event.java b/src/app/src/main/java/com/example/sleep/Event.java new file mode 100644 index 0000000..cd4d433 --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/Event.java @@ -0,0 +1,122 @@ +package com.example.sleep; + +import java.io.Serializable; +import java.util.List; + +import java.io.Serializable; +import java.util.List; + +// 事件类 +public class Event implements Serializable { + public String id; // 事件的唯一标识符 + public String title; // 事件的标题 + public String des; // 事件的描述 + public String imageUrl; // 事件的图片URL + public List contents; // 包含事件内容的列表 + + // 事件类构造函数 + public Event(String id, String title, String des, String imageUrl, List contents) { + this.id = id; + this.title = title; + this.des = des; + this.imageUrl = imageUrl; + this.contents = contents; + } + + // 无参构造函数 + public Event() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDes() { + return des; + } + + public void setDes(String des) { + this.des = des; + } + + public String getImageUrl() { + return imageUrl; + } + + public void setImageUrl(String imageUrl) { + this.imageUrl = imageUrl; + } + + public List getContents() { + return contents; + } + + public void setContents(List contents) { + this.contents = contents; + } +} + +// 事件内容类 +class EventContent implements Serializable { + public String contentId; // 内容的唯一标识符 + public String userId; // 用户的唯一标识符,与事件内容关联 + public String content; // 事件的具体内容 + public String userName; // 用户的名字 + + // 事件内容类构造函数 + public EventContent(String contentId, String userId, String content, String userName) { + this.contentId = contentId; + this.userId = userId; + this.content = content; + this.userName = userName; + } + + // 无参构造函数 + public EventContent() { + } + + public String getContentId() { + return contentId; + } + + public void setContentId(String contentId) { + this.contentId = contentId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } +} + diff --git a/src/app/src/main/java/com/example/sleep/ItemModel.java b/src/app/src/main/java/com/example/sleep/ItemModel.java new file mode 100644 index 0000000..dc82b19 --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/ItemModel.java @@ -0,0 +1,22 @@ +package com.example.sleep; + +public class ItemModel { + private String imageUrl; // 用于存储图像URL或资源标识符 + private String text; // 用于存储文本信息 + + // 构造函数,用于创建 ItemModel 对象并初始化其属性 + public ItemModel(String imageUrl, String text) { + this.imageUrl = imageUrl; + this.text = text; + } + + // 获取图像URL或资源标识符的方法 + public String getImageResId() { + return imageUrl; + } + + // 获取文本信息的方法 + public String getText() { + return text; + } +} diff --git a/src/app/src/main/java/com/example/sleep/MyAdapter.java b/src/app/src/main/java/com/example/sleep/MyAdapter.java new file mode 100644 index 0000000..b79db4f --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/MyAdapter.java @@ -0,0 +1,82 @@ +package com.example.sleep; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.util.Base64; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import java.util.List; + +public class MyAdapter extends RecyclerView.Adapter { + + private List dataList; // 数据列表 + private Context context; // 上下文对象 + + public MyAdapter(Context context, List dataList) { + this.context = context; + this.dataList = dataList; + } + + public void setDataList(List dataList) { + this.dataList = dataList; + } + + @NonNull + @Override + public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View itemView = LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false); + return new MyViewHolder(itemView); + } + + @Override + public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { + ItemModel item = dataList.get(position); + holder.textView.setText("用户评论: " + item.getText()); + + // 尝试从文件中加载图片,如果失败则从Base64字符串解码为Bitmap + Bitmap bitmap; + try { + bitmap = BitmapFactory.decodeFile(item.getImageResId()); + } catch (Exception e) { + bitmap = base64ToBitmap(item.getImageResId()); + } + + if (bitmap == null) { + bitmap = base64ToBitmap(item.getImageResId()); + } + + holder.imageView.setImageBitmap(bitmap); + } + + public Bitmap base64ToBitmap(String base64Encoded) { + byte[] decodedByte = Base64.decode(base64Encoded, 0); + return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); + } + + @Override + public int getItemCount() { + if (dataList == null) { + return 0; + } + return dataList.size(); + } + + static class MyViewHolder extends RecyclerView.ViewHolder { + ImageView imageView; + TextView textView; + + MyViewHolder(@NonNull View itemView) { + super(itemView); + imageView = itemView.findViewById(R.id.imageView); + textView = itemView.findViewById(R.id.textView); + } + } +} diff --git a/src/app/src/main/java/com/example/sleep/MySharedPreferences.java b/src/app/src/main/java/com/example/sleep/MySharedPreferences.java new file mode 100644 index 0000000..e429228 --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/MySharedPreferences.java @@ -0,0 +1,31 @@ +package com.example.sleep; + +import android.content.Context; +import android.content.SharedPreferences; + +public class MySharedPreferences { + private static final String PREF_NAME = "MyAppPreferences"; // SharedPreferences 的名称 + private static final String KEY_HOURS = "hours"; // 用于存储小时的键名 + private static final String KEY_MINUTES = "minutes"; // 用于存储分钟的键名 + + // 保存小时和分钟到 SharedPreferences + public static void saveTime(Context context, int hours, int minutes) { + SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); // 获取 SharedPreferences 对象 + SharedPreferences.Editor editor = sharedPreferences.edit(); // 获取 SharedPreferences 编辑器 + editor.putInt(KEY_HOURS, hours); // 存储小时数据 + editor.putInt(KEY_MINUTES, minutes); // 存储分钟数据 + editor.apply(); // 提交数据更改 + } + + // 从 SharedPreferences 中获取小时 + public static int getHours(Context context) { + SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); // 获取 SharedPreferences 对象 + return sharedPreferences.getInt(KEY_HOURS, 0); // 获取存储的小时数据,默认值为 0,表示如果没有存储的值,则返回 0 + } + + // 从 SharedPreferences 中获取分钟 + public static int getMinutes(Context context) { + SharedPreferences sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); // 获取 SharedPreferences 对象 + return sharedPreferences.getInt(KEY_MINUTES, 0); // 获取存储的分钟数据,默认值为 0,表示如果没有存储的值,则返回 0 + } +} diff --git a/src/app/src/main/java/com/example/sleep/Share.java b/src/app/src/main/java/com/example/sleep/Share.java new file mode 100644 index 0000000..3821da4 --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/Share.java @@ -0,0 +1,235 @@ +package com.example.sleep; + +import static android.app.Activity.RESULT_OK; + +import android.Manifest; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.graphics.Bitmap; +import android.net.Uri; +import android.os.Bundle; +import android.provider.MediaStore; +import android.support.design.widget.BottomSheetDialog; +import android.support.v4.app.ActivityCompat; +import android.support.v4.app.Fragment; +import android.support.v4.content.ContextCompat; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import com.example.sleep.database.dao.DatabaseManager; + +import java.io.File; +import java.util.List; + +public class Share extends Fragment { + private static final int RESULT_LOAD_IMAGE = 111; + private static final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 222; + + private ImageView eventPostImage; + + private static final int MY_PERMISSIONS_REQUEST_CAMERA = 3; + + private static final int REQUEST_IMAGE_CAPTURE = 1; + + private Bitmap imageBitmap; + private RecyclerView eventRl; + private MyAdapter adapter; + private List dataList; + + // 在Fragment的onCreateView方法中初始化RecyclerView并设置适配器 + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + Log.i("11111", "onCreateView"); + View view = inflater.inflate(R.layout.event_content, container, false); + eventRl = view.findViewById(R.id.rl); + eventPostImage = view.findViewById(R.id.event_image); + + eventPostImage.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + // 当点击事件被触发时,显示底部对话框 + if (true) { // 在这里应该有条件检查 + showDialog(); + } + } + }); + + initData(); + return view; + } + + @Override + public void onResume() { + super.onResume(); + Log.i("11111", "onResume"); + SharedPreferences sharedPreferences = getActivity().getSharedPreferences("MyPreferences", Context.MODE_PRIVATE); + String retrievedUserName = sharedPreferences.getString("UserNameKey", "DefaultUserName"); + loadData(retrievedUserName); + adapter.setDataList(dataList); + adapter.notifyDataSetChanged(); + } + + private void initData() { + eventRl.setLayoutManager(new LinearLayoutManager(getActivity())); + /*SharedPreferences sharedPreferences = getActivity().getSharedPreferences("MyPreferences", Context.MODE_PRIVATE); + String retrievedUserName = sharedPreferences.getString("UserNameKey", "DefaultUserName"); + loadData(retrievedUserName); // 初始化数据*/ + + adapter = new MyAdapter(getActivity(), dataList); + eventRl.setAdapter(adapter); + } + + private void loadData(String username) { + DatabaseManager manager = new DatabaseManager(getActivity()); + manager.open(); + dataList = manager.getUserNameEvent(username); + } + + private void showDialog() { + // 显示底部对话框 + BottomSheetDialog bottomSheetDialog = new BottomSheetDialog(getActivity()); + View bottomSheetView = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_bottom_sheet_dialog, null); + bottomSheetDialog.setContentView(bottomSheetView); + + bottomSheetView.findViewById(R.id.btn_take_photo).setOnClickListener(v -> { + // 处理拍摄按钮点击事件 + if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + // 请求相机权限 + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA); + } else { + openCamera(); + } + + bottomSheetDialog.dismiss(); + }); + + bottomSheetView.findViewById(R.id.btn_choose_from_gallery).setOnClickListener(v -> { + // 处理从相册中选择按钮点击事件 + if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { + // 请求读取外部存储权限 + ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE); + } else { + // 权限已经授予,进入图片选择流程 + dispatchChoosePictureIntent(); + } + + bottomSheetDialog.dismiss(); + }); + + bottomSheetView.findViewById(R.id.btn_cancel).setOnClickListener(v -> { + bottomSheetDialog.dismiss(); // 关闭对话框 + }); + + bottomSheetDialog.show(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + switch (requestCode) { + case MY_PERMISSIONS_REQUEST_CAMERA: { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // 用户授予了相机权限,可以拍照 + openCamera(); + } else { + // 用户拒绝了相机权限 + } + } + case MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE: { + if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // 用户授予了读取外部存储权限 + dispatchChoosePictureIntent(); + } else { + // 用户拒绝了读取外部存储权限 + } + } + } + } + + private void dispatchChoosePictureIntent() { + if (true) { + // 从相册中选择图片 + Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + startActivityForResult(intent, RESULT_LOAD_IMAGE); + return; + } + + // 创建拍照和选择图片的Intent + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + Intent pickPictureIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + + Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER); + chooserIntent.putExtra(Intent.EXTRA_INTENT, pickPictureIntent); + chooserIntent.putExtra(Intent.EXTRA_TITLE, "选择图片"); + + if (takePictureIntent.resolveActivity(getActivity().getPackageManager()) != null) { + // 创建拍照所需的文件 + File photoFile = null; + if (photoFile != null) { + chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[]{takePictureIntent}); + } + } + } + + private void openCamera() { + // 打开相机应用拍照 + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + if (intent.resolveActivity(getActivity().getPackageManager()) != null) { + startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + if (requestCode == REQUEST_IMAGE_CAPTURE) { + // 处理相机返回的数据 + Bundle extras = data.getExtras(); + imageBitmap = (Bitmap) extras.get("data"); + + // 启动新Activity并传递拍摄的图片 + Intent intent = new Intent(); + Bundle bundle = new Bundle(); + bundle.putParcelable("bitmapImage", imageBitmap); + intent.putExtra("isPhoto", false); + intent.putExtras(bundle); + intent.setClass(getActivity(), EditScreen.class); + startActivity(intent); + } else if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { + Uri selectedImageUri = data.getData(); + + // 处理URI获取图片路径或者直接存储URI + // ... + + // 如果你想获取图片的实际文件路径,可以如此操作 + String[] filePathColumn = {MediaStore.Images.Media.DATA}; + Cursor cursor = getActivity().getContentResolver().query(selectedImageUri, filePathColumn, null, null, null); + if (cursor != null && cursor.moveToFirst()) { + int columnIndex = cursor.getColumnIndexOrThrow(filePathColumn[0]); + String picturePath = cursor.getString(columnIndex); + cursor.close(); + + // 将图片路径保存到数据库 + // saveImagePathToDatabase(picturePath); + // 使用 imageBitmap ... + Intent intent = new Intent(); + intent.putExtra("bitmapImageString", picturePath); + intent.putExtra("isPhoto", true); + intent.setClass(getActivity(), EditScreen.class); + startActivity(intent); + } + + // 或者,可以保存URI.toString()到数据库 + // saveImageUriToDatabase(selectedImageUri.toString()); + } + } + } +} \ No newline at end of file diff --git a/src/app/src/main/java/com/example/sleep/recyclerView/Trace.java b/src/app/src/main/java/com/example/sleep/recyclerView/Trace.java new file mode 100644 index 0000000..0edab9d --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/recyclerView/Trace.java @@ -0,0 +1,22 @@ +package com.example.sleep.recyclerView; + +/** + * 用来绘制记录的类 + */ +public class Trace { + private String Date; // 记录的日期 + private String Time; // 记录的时间 + + public Trace(String mDate, String mTime) { + this.Date = mDate; + this.Time = mTime; + } + + public String getDate() { + return Date; + } + + public String getTime() { + return Time; + } +} diff --git a/src/app/src/main/java/com/example/sleep/recyclerView/TraceListAdapter.java b/src/app/src/main/java/com/example/sleep/recyclerView/TraceListAdapter.java new file mode 100644 index 0000000..1eefeb0 --- /dev/null +++ b/src/app/src/main/java/com/example/sleep/recyclerView/TraceListAdapter.java @@ -0,0 +1,119 @@ +package com.example.sleep.recyclerView; + +import android.content.Context; +import android.content.Intent; +import android.support.annotation.NonNull; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import com.example.sleep.R; +import com.example.sleep.SleepresultScreen; + +import java.util.List; + +public class TraceListAdapter extends RecyclerView.Adapter { + private LayoutInflater inflater; + private List traceList; + private Context context; + private String date; + + public class ViewHolder extends RecyclerView.ViewHolder { + private TextView mDate, mTime; + private TextView mTopLine; + private ImageView mDot; + + ViewHolder(View itemView) { + super(itemView); + mDate = itemView.findViewById(R.id.Date); + mTime = itemView.findViewById(R.id.Time); + mTopLine = itemView.findViewById(R.id.TopLine); + mDot = itemView.findViewById(R.id.Dot); + } + + void bindHolder(Trace trace) { + mDate.setText(trace.getDate()); + mTime.setText(trace.getTime()); + } + } + + public TraceListAdapter(Context context, List traceList, String date) { + // 构造函数,初始化适配器的数据 + this.context = context; + inflater = LayoutInflater.from(context); + this.traceList = traceList; + this.date = date; + } + + @Override + @NonNull + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + // 创建并返回记录项的 ViewHolder + return new ViewHolder(inflater.inflate(R.layout.list_cell, parent, false)); + } + + /** + * 绘制记录 + * + * @param holder 记录的holder + * @param position 记录的位置 + */ + @Override + public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) { + ViewHolder itemHolder = (ViewHolder) holder; + if (position == 0) { + // 第一行头的竖线不显示 + itemHolder.mTopLine.setVisibility(View.INVISIBLE); + itemHolder.mDot.setBackgroundResource(R.drawable.timeline); + } else if (position > 0) { + itemHolder.mTopLine.setVisibility(View.VISIBLE); + itemHolder.mDot.setBackgroundResource(R.drawable.timeline); + } + itemHolder.bindHolder(traceList.get(position)); + final TextView tv1 = holder.itemView.findViewById(R.id.Date); + final TextView tv2 = holder.itemView.findViewById(R.id.Time); + tv1.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + // 点击日期文本的事件处理 + Intent i = new Intent(context, SleepresultScreen.class); + i.putExtra("date", date); + i.putExtra("position", holder.getAdapterPosition()); + context.startActivity(i); + } + } + ); + tv2.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + // 点击时间文本的事件处理 + Intent i = new Intent(context, SleepresultScreen.class); + i.putExtra("date", date); + i.putExtra("position", holder.getAdapterPosition()); + context.startActivity(i); + } + } + ); + } + + @Override + public int getItemCount() { + return traceList.size(); + } + + public interface OnItemClickListener { + void onItemClick(View view, int position); + } + + private OnItemClickListener mOnItemClickListener; + + public void setOnItemClickListener(OnItemClickListener mOnItemClickListener) { + // 设置 RecyclerView 点击事件的监听器 + this.mOnItemClickListener = mOnItemClickListener; + } +}