Skip to content

Commit e021089

Browse files
committed
增加通知相关类和方法
1 parent c6d4234 commit e021089

File tree

8 files changed

+143
-5
lines changed

8 files changed

+143
-5
lines changed

.github/workflows/android.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,6 @@ jobs:
7474
▫️ 提交: ${{ github.sha }}
7575
▫️ 状态: ${{ job.status }}
7676
▫️ 工作流: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}
77-
document: |
77+
message_file: |
7878
app/build/outputs/apk/debug/*.apk
7979
format: HTML

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
1515
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
1616

17+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
18+
1719
<application
1820
android:name=".MainApplication"
1921
android:allowBackup="true"
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.gg.busStation.function;
2+
3+
import android.Manifest;
4+
import android.app.Activity;
5+
import android.app.Notification;
6+
import android.app.NotificationChannel;
7+
import android.app.NotificationManager;
8+
import android.content.Context;
9+
import android.content.pm.PackageManager;
10+
import android.graphics.drawable.Icon;
11+
import android.os.Build;
12+
import android.widget.Toast;
13+
14+
import androidx.activity.result.contract.ActivityResultContracts;
15+
import androidx.annotation.DrawableRes;
16+
import androidx.appcompat.app.AppCompatActivity;
17+
18+
import com.gg.busStation.R;
19+
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
20+
21+
public class NotificationHelper {
22+
private static final String[] channelIDs = {"Site_Reminder"};
23+
private static final int[] channelNames = {R.string.notification_channel_site_reminder};
24+
private static final int[] channelImportances = {NotificationManager.IMPORTANCE_HIGH};
25+
26+
private NotificationHelper(){
27+
}
28+
29+
public static void postNotification(Activity activity, int notificationId, String channelId, String title, CharSequence text, @DrawableRes int resId) {
30+
if (checkPermission(activity)) {
31+
for (int i = 0; i < channelIDs.length; i++) {
32+
createChannel(activity, channelIDs[i], activity.getString(channelNames[i]), channelImportances[i]);
33+
}
34+
} else {
35+
registerPermission(activity);
36+
}
37+
38+
Notification.Builder builder = new Notification.Builder(activity, channelId)
39+
.setSmallIcon(Icon.createWithResource(activity, resId))
40+
.setContentTitle(title)
41+
.setContentText(text);
42+
43+
NotificationManager manager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
44+
manager.notify(notificationId, builder.build());
45+
}
46+
47+
48+
public static void registerPermission(Activity activity) {
49+
new MaterialAlertDialogBuilder(activity)
50+
.setTitle(R.string.dialog_permission_title)
51+
.setMessage(R.string.dialog_permission_notification_message)
52+
.setNegativeButton(R.string.dialog_permission_decline, (dialog, which) -> {
53+
})
54+
.setPositiveButton(R.string.dialog_permission_accept, (dialog, which) -> launchResult(activity))
55+
.show();
56+
57+
}
58+
59+
60+
private static void launchResult(Activity activity) {
61+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
62+
return;
63+
}
64+
65+
((AppCompatActivity) activity).registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> {
66+
if (Boolean.TRUE.equals(result)) {
67+
for (int i = 0; i < channelIDs.length; i++) {
68+
createChannel(activity, channelIDs[i], activity.getString(channelNames[i]), channelImportances[i]);
69+
}
70+
} else {
71+
Toast.makeText(activity, R.string.dialog_permission_failed_message, Toast.LENGTH_SHORT).show();
72+
}
73+
}).launch(Manifest.permission.POST_NOTIFICATIONS);
74+
}
75+
76+
public static void createChannel(Activity activity, String id, CharSequence name, int importance) {
77+
NotificationChannel channel = new NotificationChannel(id, name, importance);
78+
NotificationManager manager = (NotificationManager) activity.getSystemService(Context.NOTIFICATION_SERVICE);
79+
manager.createNotificationChannel(channel);
80+
}
81+
82+
public static boolean checkPermission(Activity activity) {
83+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
84+
return activity.checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED;
85+
}
86+
87+
return true;
88+
}
89+
90+
public static String[] getChannelIDs(){
91+
return channelIDs;
92+
}
93+
}

app/src/main/java/com/gg/busStation/ui/activity/MainActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public class MainActivity extends AppCompatActivity {
4949
// 权限申请回调
5050
private final ActivityResultLauncher<String> requestPermission = registerForActivityResult(new ActivityResultContracts.RequestPermission(), result -> {
5151
if (Boolean.FALSE.equals(result)) {
52-
Toast.makeText(this, "权限授权失败,请手动给予", Toast.LENGTH_SHORT).show();
52+
Toast.makeText(this, R.string.dialog_permission_failed_message, Toast.LENGTH_SHORT).show();
5353
} else {
5454
LocationHelper.getLocation(true);
5555
}
@@ -177,7 +177,7 @@ public void checkPermissions() {
177177

178178
new MaterialAlertDialogBuilder(this)
179179
.setTitle(R.string.dialog_permission_title)
180-
.setMessage(R.string.dialog_permission_message)
180+
.setMessage(R.string.dialog_permission_location_message)
181181
.setNegativeButton(R.string.dialog_permission_decline, (dialog, which) -> {
182182
})
183183
.setPositiveButton(R.string.dialog_permission_accept, (dialog, which) -> requestPermission.launch(Manifest.permission.ACCESS_FINE_LOCATION))

app/src/main/java/com/gg/busStation/ui/adapter/StopListAdapter.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package com.gg.busStation.ui.adapter;
22

3+
import android.content.res.TypedArray;
4+
import android.view.View;
35
import android.view.ViewGroup;
46

57
import androidx.annotation.NonNull;
8+
import androidx.appcompat.content.res.AppCompatResources;
9+
import androidx.appcompat.widget.PopupMenu;
610
import androidx.fragment.app.FragmentActivity;
711
import androidx.recyclerview.widget.DiffUtil;
812
import androidx.recyclerview.widget.ListAdapter;
913
import androidx.recyclerview.widget.RecyclerView;
1014

15+
import com.gg.busStation.R;
1116
import com.gg.busStation.data.layout.StopItemData;
17+
import com.gg.busStation.function.NotificationHelper;
1218
import com.gg.busStation.ui.layout.StopItemView;
1319

1420
public class StopListAdapter extends ListAdapter<StopItemData, StopListAdapter.ViewHolder> {
@@ -46,6 +52,28 @@ public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
4652
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
4753
StopItemData stopItemData = getItem(position);
4854
((StopItemView) holder.itemView).setData(stopItemData);
55+
56+
holder.stopItemView.findViewById(R.id.more_button).setOnClickListener(this::showMenu);
57+
TypedArray typedArray = mActivity.getTheme().obtainStyledAttributes(R.style.Theme_BusStation, new int[]{com.google.android.material.R.attr.selectableItemBackgroundBorderless});
58+
holder.stopItemView.findViewById(R.id.more_button).setForeground(AppCompatResources.getDrawable(mActivity, typedArray.getResourceId(0, 0)));
59+
typedArray.recycle();
60+
}
61+
62+
private void showMenu(View moreButtion) {
63+
PopupMenu popupMenu = new PopupMenu(mActivity, moreButtion);
64+
popupMenu.inflate(R.menu.stop_item_menu);
65+
66+
popupMenu.setOnMenuItemClickListener(item -> {
67+
int itemId = item.getItemId();
68+
if (itemId == R.id.stop_menu_arrival) {
69+
NotificationHelper.postNotification(mActivity, 0, NotificationHelper.getChannelIDs()[0], "Just test", "just test", R.drawable.ic_launcher_foreground);
70+
return true;
71+
}
72+
73+
return false;
74+
});
75+
76+
popupMenu.show();
4977
}
5078

5179
public static class ViewHolder extends RecyclerView.ViewHolder {
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<menu xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item
4+
android:id="@+id/stop_menu_arrival"
5+
android:title="@string/stop_menu_arrival" />
6+
7+
</menu>

app/src/main/res/values-zh/strings.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
<string name="searchbar_hint">搜索路线</string>
1111
<string name="main_history_hint">搜索路线并点击,此处将存放历史记录</string>
1212
<string name="dialog_permission_title">权限申请</string>
13-
<string name="dialog_permission_message">该软件需要定位权限以便快速跳转最近的巴士站</string>
13+
<string name="dialog_permission_location_message">该软件需要定位权限以便快速跳转最近的巴士站</string>
14+
<string name="dialog_permission_notification_message">该软件需要通知权限以便发送上车等提醒</string>
1415
<string name="dialog_permission_decline">拒绝</string>
1516
<string name="dialog_permission_accept">同意</string>
1617
<string name="about_use_title">引用</string>
@@ -51,4 +52,7 @@
5152
<string name="settings_update_app_now">检查应用更新</string>
5253
<string name="settings_update_app_now_summary">立即检查是否有新版本</string>
5354
<string name="update_app_already">当前已是最新版本</string>
55+
<string name="stop_menu_arrival">上车提醒</string>
56+
<string name="notification_channel_site_reminder">上车提醒</string>
57+
<string name="dialog_permission_failed_message">权限授权失败,请手动给予</string>
5458
</resources>

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<string name="searchbar_hint">Search for a route</string>
1111
<string name="main_history_hint">Search and Click a route to save it here</string>
1212
<string name="dialog_permission_title">Permission request</string>
13-
<string name="dialog_permission_message">This app requires location permissions to quickly jump to the nearest bus stop.</string>
13+
<string name="dialog_permission_location_message">This app requires location permissions to quickly jump to the nearest bus stop.</string>
1414
<string name="dialog_permission_decline">Decline</string>
1515
<string name="dialog_permission_accept">Accept</string>
1616
<string name="about_use_title">References</string>
@@ -52,4 +52,8 @@
5252
<string name="settings_update_app_now">Check update now</string>
5353
<string name="settings_update_app_now_summary">Update app now</string>
5454
<string name="update_app_already">You\'re already up to date</string>
55+
<string name="stop_menu_arrival">Arrival Remind</string>
56+
<string name="dialog_permission_notification_message">This app requires notification permissions to send reminders such as boarding the car.</string>
57+
<string name="notification_channel_site_reminder">Site Remind</string>
58+
<string name="dialog_permission_failed_message">Authorization failed, please grant it manually.</string>
5559
</resources>

0 commit comments

Comments
 (0)