Skip to content

Commit 9913060

Browse files
committed
Merge branch 'develop' into uiImprovements
2 parents 8d34665 + 107c11f commit 9913060

File tree

12 files changed

+148
-67
lines changed

12 files changed

+148
-67
lines changed

.idea/misc.xml

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/com/example/digitalrefrige/services/AlarmBroadcastReceiver.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ public void onReceive(Context context, Intent intent) {
5252
if (expiringItems!= null && !expiringItems.isEmpty()) {
5353
if (intent.getAction().equals("NOTIFY")) {
5454
Intent mIntent = new Intent(context, MainActivity.class);
55-
PendingIntent mPendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_UPDATE_CURRENT);
55+
PendingIntent mPendingIntent = PendingIntent.getActivity(context, 0, mIntent, PendingIntent.FLAG_MUTABLE);
5656
createNotificationChannel();
5757
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
5858
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID)
5959
.setSmallIcon(R.drawable.ic_document)
6060
.setContentTitle("Expiring")
61-
.setContentText("You have item(s) expiring in "+intervalString+" days")
61+
.setContentText("You have expiring item(s)")
6262
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
6363
.setContentIntent(mPendingIntent)
6464
.setAutoCancel(true);

app/src/main/java/com/example/digitalrefrige/services/NfcActivity.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,32 @@
99
import android.os.Bundle;
1010
import android.os.Parcelable;
1111
import android.util.Log;
12+
import android.view.View;
13+
import android.widget.Button;
1214
import android.widget.TextView;
1315

1416
import com.example.digitalrefrige.R;
17+
import com.example.digitalrefrige.model.ItemRepository;
1518
import com.example.digitalrefrige.utils.Converters;
19+
import com.example.digitalrefrige.viewModel.ItemDetailViewModel;
20+
import com.example.digitalrefrige.views.itemList.ItemDetailActivity;
21+
import com.example.digitalrefrige.views.itemList.ItemDetailActivityArgs;
1622

1723
import java.text.SimpleDateFormat;
1824
import java.util.Date;
1925
import java.util.Locale;
2026
import java.util.concurrent.TimeUnit;
2127

28+
import javax.inject.Inject;
29+
30+
import dagger.hilt.android.AndroidEntryPoint;
31+
32+
@AndroidEntryPoint
2233
public class NfcActivity extends AppCompatActivity {
23-
TextView nfcTextView;
34+
private TextView nfcTextView;
35+
private Button nfcButton;
36+
@Inject
37+
ItemRepository itemRepository;
2438

2539
@Override
2640
protected void onCreate(Bundle savedInstanceState) {
@@ -39,9 +53,32 @@ protected void onCreate(Bundle savedInstanceState) {
3953
NdefMessage message = (NdefMessage) messages[0];
4054
NdefRecord record = message.getRecords()[0];
4155
String payload = new String(record.getPayload());
42-
long dayDifferences = Converters.getDayDifferences(payload.substring(3));
56+
long itemID = Long.parseLong(payload.substring(3));
4357
nfcTextView = findViewById(R.id.nfc_textview);
44-
nfcTextView.setText("The item is expiring in "+ Long.toString(dayDifferences)+" days\n"+payload.substring(3));
58+
nfcButton = findViewById(R.id.nfc_button);
59+
60+
if(itemRepository.findItemById(itemID) == null){
61+
nfcTextView.setText("No item");
62+
nfcButton.setVisibility(View.GONE);
63+
}else {
64+
nfcTextView.setText("Click the button to view item");
65+
66+
nfcButton.setOnClickListener(new View.OnClickListener() {
67+
@Override
68+
public void onClick(View v) {
69+
Intent intent = new Intent(NfcActivity.this, ItemDetailActivity.class);
70+
Bundle bundle = new Bundle();
71+
bundle.putLong("itemID",itemID);
72+
intent.putExtras(bundle);
73+
startActivity(intent);
74+
finish();
75+
76+
}
77+
});
78+
}
79+
80+
81+
4582
}
4683
}
4784
}

app/src/main/java/com/example/digitalrefrige/utils/NfcUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ private void check() {
4242
private void init() {
4343
Intent intent = new Intent(activity,activity.getClass());
4444
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
45-
mPendingIntent = PendingIntent.getActivity(activity, 0, intent, PendingIntent.FLAG_IMMUTABLE);
45+
mPendingIntent = PendingIntent.getActivity(activity, 0, intent, PendingIntent.FLAG_MUTABLE);
4646

4747
IntentFilter ndefFilter = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
4848
try {

app/src/main/java/com/example/digitalrefrige/viewModel/adapters/ItemListAdapter.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ public void onBindViewHolder(@NonNull ItemHolder holder, int position) {
7373
*/
7474
class ItemHolder extends RecyclerView.ViewHolder {
7575
private TextView textViewName;
76-
private TextView textViewDescription;
76+
// private TextView textViewDescription;
7777
private TextView expireDate;
7878
private ImageView itemImage;
7979
private long itemID;
8080

8181
public ItemHolder(@NonNull ItemCardBinding binding) {
8282
super(binding.getRoot());
8383
textViewName = binding.textViewTitle;
84-
textViewDescription = binding.textViewDescription;
84+
// textViewDescription = binding.textViewDescription;
8585
expireDate = binding.textViewExpireDate;
8686
itemImage = binding.imageViewFoodPhoto;
8787

@@ -97,7 +97,7 @@ public ItemHolder(@NonNull ItemCardBinding binding) {
9797
public void bind(Item item) {
9898
// bond item content into to this holder
9999
textViewName.setText(item.getName());
100-
textViewDescription.setText(item.getDescription());
100+
// textViewDescription.setText(item.getDescription());
101101
expireDate.setText(Converters.dateToString(item.getExpireDate()));
102102
itemID = item.getItemId();
103103
String uri = item.getImgUrl();

app/src/main/java/com/example/digitalrefrige/views/itemList/ItemDetailActivity.java

Lines changed: 57 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
import static android.app.Activity.RESULT_OK;
44

5+
import static com.example.digitalrefrige.utils.Converters.dateToTimestamp;
6+
import static com.example.digitalrefrige.utils.Converters.strToDate;
7+
58
import android.app.DatePickerDialog;
69
import android.content.Context;
710
import android.content.DialogInterface;
@@ -25,13 +28,15 @@
2528
import androidx.fragment.app.Fragment;
2629
import androidx.lifecycle.Observer;
2730
import androidx.lifecycle.ViewModelProvider;
31+
import androidx.navigation.ActivityNavigator;
2832
import androidx.navigation.Navigation;
2933
import androidx.recyclerview.widget.GridLayoutManager;
3034
import androidx.recyclerview.widget.LinearLayoutManager;
3135
import androidx.recyclerview.widget.RecyclerView;
3236

3337
import android.os.Environment;
3438
import android.os.PersistableBundle;
39+
import android.provider.CalendarContract;
3540
import android.provider.MediaStore;
3641
import android.text.TextUtils;
3742
import android.util.Log;
@@ -62,6 +67,7 @@
6267
import java.io.OutputStream;
6368
import java.text.SimpleDateFormat;
6469
import java.util.ArrayList;
70+
import java.util.Calendar;
6571
import java.util.Date;
6672
import java.util.List;
6773
import java.util.Locale;
@@ -227,16 +233,11 @@ public void onChanged(List<Label> labels) {
227233
binding.addNumButton.setOnClickListener(this::onAddNumberButtonClicked);
228234
binding.minusNumButton.setOnClickListener(this::onMinusNumberButtonClicked);
229235

230-
if (nfcUtils.getmNfcAdapter() == null) {
231-
binding.nfcTrigger.setVisibility(View.GONE);
232-
} else {
233-
binding.nfcTrigger.setOnClickListener(this::onNfcDialogButtonClicked);
234-
}
235-
236236
// change UI according to action type
237237
if (itemId == CREATE_NEW_ITEM) {
238238
binding.buttonDelete.setVisibility(View.GONE);
239239
binding.buttonUpdate.setVisibility(View.GONE);
240+
binding.icsTrigger.setVisibility(View.GONE);
240241
binding.buttonAdd.setOnClickListener(this::onAddButtonClicked);
241242
} else {
242243
// render item image if exist
@@ -248,6 +249,14 @@ public void onChanged(List<Label> labels) {
248249
binding.buttonAdd.setVisibility(View.GONE);
249250
binding.buttonDelete.setOnClickListener(this::onDeleteButtonClicked);
250251
binding.buttonUpdate.setOnClickListener(this::onUpdateButtonClicked);
252+
binding.icsTrigger.setOnClickListener(this::exportICS);
253+
254+
if (nfcUtils.getmNfcAdapter() == null) {
255+
binding.nfcTrigger.setVisibility(View.GONE);
256+
} else {
257+
binding.nfcTrigger.setVisibility(View.VISIBLE);
258+
binding.nfcTrigger.setOnClickListener(this::onNfcDialogButtonClicked);
259+
}
251260

252261
}
253262

@@ -326,16 +335,55 @@ protected void onPause() {
326335
nfcUtils.disableForegroundDispatch();
327336
}
328337

338+
@Override
339+
public void finish() {
340+
super.finish();
341+
ActivityNavigator.applyPopAnimationsToPendingTransition(this);
342+
}
343+
329344
@Override
330345
protected void onNewIntent(Intent intent) {
331346
super.onNewIntent(intent);
347+
long itemID = itemDetailViewModel.getCurItem().getItemId();
332348
try {
333-
nfcUtils.writeNFCToTag("2021-12-12", intent);
334-
Toast.makeText(this, "写入成功: 2021-12-12", Toast.LENGTH_LONG).show();
349+
nfcUtils.writeNFCToTag(String.valueOf(itemID), intent);
350+
Toast.makeText(this, "Write Succeed: ID: "+String.valueOf(itemID), Toast.LENGTH_LONG).show();
335351
} catch (IOException | FormatException e) {
336-
Toast.makeText(this, "写入失败: " + e.getMessage(), Toast.LENGTH_LONG).show();
352+
Toast.makeText(this, "Write Failed: " + e.getMessage(), Toast.LENGTH_LONG).show();
337353
}
338354
}
355+
public void exportICS(View v ){
356+
String title = itemDetailViewModel.getCurItem().getName();
357+
Date expireDate = itemDetailViewModel.getCurItem().getExpireDate();
358+
String description = itemDetailViewModel.getCurItem().getDescription();
359+
360+
//reference 1: https://code.tutsplus.com/tutorials/android-essentials-adding-events-to-the-users-calendar--mobile-8363
361+
//reference 2: https://developer.android.com/reference/android/provider/CalendarContract.EventsColumns#LAST_DATE
362+
//reference 3: https://developer.android.com/reference/android/provider/CalendarContract.EventsColumns#ALL_DAY
363+
Calendar cal = Calendar.getInstance();
364+
int eventCaldendarID = 1;
365+
int eventStartAt = 9;
366+
int eventDuration = 15;
367+
Intent intent = new Intent(Intent.ACTION_EDIT);
368+
intent.setType("vnd.android.cursor.item/event");
369+
370+
371+
intent.putExtra("allDay", false);
372+
intent.putExtra(CalendarContract.Events.CALENDAR_ID,eventCaldendarID);
373+
374+
intent.putExtra(CalendarContract.Events.TITLE, title);
375+
intent.putExtra(CalendarContract.Events.CALENDAR_DISPLAY_NAME, title);
376+
intent.putExtra(CalendarContract.Events.DESCRIPTION, description);
377+
intent.putExtra("hasAlarm", 0);
378+
379+
intent.putExtra("beginTime", dateToTimestamp(expireDate) +
380+
eventStartAt * 60 * 60 * 1000);
381+
intent.putExtra("endTime", dateToTimestamp(expireDate) +
382+
(eventStartAt * 60 * 60 * 1000) +
383+
eventDuration * 60 * 1000);
384+
385+
startActivity(intent);
386+
}
339387

340388
private void onMinusNumberButtonClicked(View view) {
341389

app/src/main/java/com/example/digitalrefrige/views/login/ExpireFragment.java

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import android.view.ViewGroup;
2424
import android.widget.CompoundButton;
2525
import android.widget.EditText;
26+
import android.widget.Toast;
2627

2728
import com.example.digitalrefrige.MainActivity;
2829
import com.example.digitalrefrige.R;
@@ -56,9 +57,6 @@ public void onBindEditText(@NonNull EditText editText) {
5657
editText.setInputType(InputType.TYPE_CLASS_NUMBER);
5758
}
5859
});
59-
if(PreferenceManager.getDefaultSharedPreferences(getActivity()).getBoolean("notifications",false)){
60-
dayExpireEditText.setVisible(true);
61-
}
6260
}
6361

6462
@Override
@@ -85,9 +83,6 @@ public void onPause() {
8583
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
8684
if (key.equals("notifications")) {
8785
if (sharedPreferences.getBoolean(key, false)){
88-
dayExpireEditText.setVisible(true);
89-
90-
Log.i("preference", "notification preference value was updated to: True");
9186
// Setting Alarm for daily notification
9287
alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
9388
// Set the alarm to start at approximately time.
@@ -96,15 +91,13 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
9691

9792
Intent alarmIntent = new Intent(getContext(), AlarmBroadcastReceiver.class);
9893
alarmIntent.setAction("NOTIFY");
99-
PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
94+
PendingIntent pendingIntent = PendingIntent.getBroadcast(getContext(), 0, alarmIntent, PendingIntent.FLAG_MUTABLE);
10095
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
101-
}else {
102-
dayExpireEditText.setVisible(false);
96+
Toast.makeText(getContext(),"Notification enabled",Toast.LENGTH_SHORT).show();
10397
}
10498
}
10599
if (key.equals("expire_day")) {
106-
Log.i("preference", "notification preference value was updated to: "+sharedPreferences.getString(key,"7"));
107-
100+
Toast.makeText(getContext(),"Expiring deadline update to "+sharedPreferences.getString(key,"7"),Toast.LENGTH_SHORT).show();
108101
}
109102

110103

@@ -117,29 +110,4 @@ private void setCalendarHour(int hour, Calendar calendar){
117110
calendar.set(Calendar.SECOND, 0);
118111
calendar.set(Calendar.MILLISECOND, 0);
119112
}
120-
121-
// @Override
122-
// public View onCreateView(LayoutInflater inflater, ViewGroup container,
123-
// Bundle savedInstanceState) {
124-
// binding = FragmentExpireBinding.inflate(inflater, container, false);
125-
//
126-
// binding.switchNotification.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
127-
// @Override
128-
// public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
129-
// if (isChecked){
130-
// binding.notificationSettings.setVisibility(View.VISIBLE);
131-
// }else {
132-
// binding.notificationSettings.setVisibility(View.INVISIBLE);
133-
// }
134-
// }
135-
// });
136-
//
137-
// binding.confirmButton.setOnClickListener(new View.OnClickListener() {
138-
// @Override
139-
// public void onClick(View v) {
140-
//
141-
// }
142-
// });
143-
// return binding.getRoot();
144-
// }
145113
}

app/src/main/res/layout/activity_item_detail.xml

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,17 @@
7474
android:text="ADD NFC TAG"
7575
app:layout_constraintEnd_toEndOf="parent"
7676
app:layout_constraintStart_toStartOf="parent"
77-
app:layout_constraintTop_toBottomOf="@+id/time_picker_button"/>
77+
app:layout_constraintTop_toBottomOf="@+id/time_picker_button"
78+
android:visibility="gone"/>
7879

80+
<Button
81+
android:id="@+id/ics_trigger"
82+
android:layout_width="0dp"
83+
android:layout_height="wrap_content"
84+
android:text="EXPORT ICS"
85+
app:layout_constraintEnd_toEndOf="parent"
86+
app:layout_constraintStart_toStartOf="parent"
87+
app:layout_constraintTop_toBottomOf="@+id/nfc_trigger"/>
7988

8089
<Button
8190
android:id="@+id/label_picker_button"
@@ -86,7 +95,7 @@
8695
android:textColorHint="@color/black"
8796
app:layout_constraintEnd_toEndOf="parent"
8897
app:layout_constraintStart_toStartOf="parent"
89-
app:layout_constraintTop_toBottomOf="@+id/nfc_trigger" />
98+
app:layout_constraintTop_toBottomOf="@+id/ics_trigger" />
9099

91100

92101
<Button
@@ -176,6 +185,7 @@
176185
android:layout_height="41dp"
177186
android:ems="10"
178187
android:text="@={Converters.quantityToStr(itemDetailViewModel.curItem.quantity)}"
188+
android:textAlignment="center"
179189
app:layout_constraintBottom_toBottomOf="@+id/minus_num_button"
180190
app:layout_constraintEnd_toStartOf="@+id/add_num_button"
181191
app:layout_constraintHorizontal_bias="0.486"

app/src/main/res/layout/activity_nfc.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,14 @@
1818
app:layout_constraintEnd_toEndOf="parent"
1919
app:layout_constraintStart_toStartOf="parent"
2020
app:layout_constraintTop_toTopOf="parent" />
21+
22+
<Button
23+
android:id="@+id/nfc_button"
24+
android:layout_width="wrap_content"
25+
android:layout_height="wrap_content"
26+
android:layout_marginTop="48dp"
27+
android:text="View Item"
28+
app:layout_constraintEnd_toEndOf="parent"
29+
app:layout_constraintStart_toStartOf="parent"
30+
app:layout_constraintTop_toBottomOf="@+id/nfc_textview" />
2131
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)