From cf50c338f8b7fd864bd5f6dd3656996c2f1ade30 Mon Sep 17 00:00:00 2001 From: Spaso1 Date: Fri, 11 Apr 2025 17:06:01 +0800 Subject: [PATCH] 1.6.1 b update --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 24 ++++ .../findmaimaiultra/ui/home/HomeFragment.java | 68 +++++------ .../ui/pixiv/PixivFragment.java | 19 +-- .../ui/widget/MyWidgetProvider.java | 40 +++++++ .../ui/widget/MyWidgetService.java | 80 +++++++++++++ .../ui/widget/WidgetConfigureActivity.java | 14 +++ .../ui/widget/WidgetUpdateService.java | 112 ++++++++++++++++++ .../findmaimaiultra/utill/AddressParser.java | 1 + .../main/res/drawable/rounded_background.xml | 14 +++ app/src/main/res/layout/activity_update.xml | 10 +- .../res/layout/activity_widget_configure.xml | 16 +++ app/src/main/res/layout/widget_2x2.xml | 17 +++ app/src/main/res/layout/widget_item.xml | 14 +++ app/src/main/res/xml/my_widget_info.xml | 14 +++ 15 files changed, 398 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetProvider.java create mode 100644 app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetService.java create mode 100644 app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetConfigureActivity.java create mode 100644 app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetUpdateService.java create mode 100644 app/src/main/res/drawable/rounded_background.xml create mode 100644 app/src/main/res/layout/activity_widget_configure.xml create mode 100644 app/src/main/res/layout/widget_2x2.xml create mode 100644 app/src/main/res/layout/widget_item.xml create mode 100644 app/src/main/res/xml/my_widget_info.xml diff --git a/app/build.gradle b/app/build.gradle index 662c59d..b19d11e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdk 29 targetSdk 34 versionCode 1 - versionName "1.6.1" + versionName "1.6.1 b" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e00a13f..1baf4a2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -69,6 +69,15 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java b/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java index 4b784b8..1590530 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/home/HomeFragment.java @@ -267,8 +267,18 @@ public class HomeFragment extends Fragment { @SuppressLint("StaticFieldLeak") private void sendGetRequest() { OkHttpClient client = new OkHttpClient(); + String tag = ""; + String web = ""; + try { + tag = city.split("市")[0]; + web = "http://mai.godserver.cn:11451/api/mai/v1/search?prompt1=" + tag+ "&status=市"; + }catch ( Exception e) { + tag = "xy("+ x +","+ y +")"; + web = "http://mai.godserver.cn:11451/api/mai/v1/search?prompt1=" + tag+ "&status=xy"; + } + + Log.d("WebWebWebWebWebWebWebWebWebWeb ", web); - String web = "http://mai.godserver.cn:11451/api/mai/v1/search?prompt1=" + city.split("市")[0] + "&status=市"; if (!isFlag) { web = "http://mai.godserver.cn:11451/api/mai/v1/search?data_place=" + tagplace; } @@ -348,55 +358,45 @@ public class HomeFragment extends Fragment { boolean flag2 = true; if (flag2) { - adapter = new PlaceAdapter(a, new PlaceAdapter.OnItemClickListener() { - @Override - public void onItemClick(Place place) { - Intent intent = new Intent(context, PageActivity.class); - intent.putExtra("id", place.getId()); - intent.putExtra("name", place.getName()); - intent.putExtra("address", place.getAddress()); - intent.putExtra("province", place.getProvince()); - intent.putExtra("city", place.getCity()); - intent.putExtra("area", place.getArea()); - intent.putExtra("x", place.getX()); - intent.putExtra("y", place.getY()); - intent.putExtra("count", place.getCount()); - intent.putExtra("bad", place.getBad()); - intent.putExtra("good", place.getGood()); - intent.putExtra("num", place.getNum()); - intent.putExtra("numJ", place.getNumJ()); - intent.putExtra("meituan", place.getMeituan_link()); - intent.putExtra("douyin", place.getDouyin_link()); - startActivity(intent); - } - }); getActivity().runOnUiThread(new Runnable() { @Override public void run() { + adapter = new PlaceAdapter(a, new PlaceAdapter.OnItemClickListener() { + @Override + public void onItemClick(Place place) { + Intent intent = new Intent(context, PageActivity.class); + intent.putExtra("id", place.getId()); + intent.putExtra("name", place.getName()); + intent.putExtra("address", place.getAddress()); + intent.putExtra("province", place.getProvince()); + intent.putExtra("city", place.getCity()); + intent.putExtra("area", place.getArea()); + intent.putExtra("x", place.getX()); + intent.putExtra("y", place.getY()); + intent.putExtra("count", place.getCount()); + intent.putExtra("bad", place.getBad()); + intent.putExtra("good", place.getGood()); + intent.putExtra("num", place.getNum()); + intent.putExtra("numJ", place.getNumJ()); + intent.putExtra("meituan", place.getMeituan_link()); + intent.putExtra("douyin", place.getDouyin_link()); + startActivity(intent); + } + }); recyclerView.setAdapter(adapter); - // 设置 Toolbar 标题 String navHomeLabel = getString(R.string.menu_home); Toolbar toolbar = ((MainActivity) requireActivity()).findViewById(R.id.toolbar); if(!(toolbar.getTitle().equals("歌曲成绩") || toolbar.getTitle().equals("地图")|| toolbar.getTitle().equals("设置"))) { toolbar.setTitle("FindMaimaiDX - " + a.size() + " 店铺" + "\n" + tot); } - - // 更新 SharedViewModel 中的 Map sharedViewModel.setPlacelist(new ArrayList<>(a)); - // 通知适配器数据已更改 adapter.notifyDataSetChanged(); } }); - // 设置Toolbar - - for (Place p : a) { - if (p.getX() == 0.0) { - // Log.i(p.getId() + "", p.getName() + "没有坐标"); - } - } } } + private List parseJsonToPlaceList(String jsonString) { Gson gson = new Gson(); Type placeListType = new TypeToken>() { diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/pixiv/PixivFragment.java b/app/src/main/java/org/astral/findmaimaiultra/ui/pixiv/PixivFragment.java index 371c3d0..3cf621a 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/ui/pixiv/PixivFragment.java +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/pixiv/PixivFragment.java @@ -311,11 +311,12 @@ public class PixivFragment extends Fragment { Log.d("PixivFragment111111111", "onResponse: " + res); if (response.isSuccessful()) { PagePixivResponse photoResponse = new Gson().fromJson(res, PagePixivResponse.class); - TextView user = view.findViewById(R.id.user); - user.setText(photoResponse.getBody().getUserName()); - TextView des = view.findViewById(R.id.des); - des.setText(photoResponse.getBody().getDescription()); - + requireActivity().runOnUiThread(() -> { + TextView user = view.findViewById(R.id.user); + user.setText(photoResponse.getBody().getUserName()); + TextView des = view.findViewById(R.id.des); + des.setText(photoResponse.getBody().getDescription()); + }); } } @@ -407,9 +408,11 @@ public class PixivFragment extends Fragment { Bitmap bitmap = BitmapFactory.decodeStream(inputStream); if (bitmap != null) { handler.post(() -> { - imageView.setImageBitmap(bitmap); - li.addView(imageView); - snackbar.dismiss(); + requireActivity().runOnUiThread(() -> { + imageView.setImageBitmap(bitmap); + li.addView(imageView); + snackbar.dismiss(); + }); }); } else { handler.post(() -> { diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetProvider.java b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetProvider.java new file mode 100644 index 0000000..82a7058 --- /dev/null +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetProvider.java @@ -0,0 +1,40 @@ +package org.astral.findmaimaiultra.ui.widget; + +import android.app.PendingIntent; +import android.appwidget.AppWidgetManager; +import android.appwidget.AppWidgetProvider; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.widget.RemoteViews; +import org.astral.findmaimaiultra.R; +import org.astral.findmaimaiultra.ui.MainActivity; + +public class MyWidgetProvider extends AppWidgetProvider { + private static final String ACTION_UPDATE = "org.astral.findmaimaiultra.ui.widget.UPDATE_WIDGET"; + + @Override + public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { + for (int appWidgetId : appWidgetIds) { + RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_2x2); + + // 设置点击事件 + Intent clickIntent = new Intent(context, MyWidgetProvider.class); + clickIntent.setAction(ACTION_UPDATE); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); + views.setOnClickPendingIntent(R.id.widget_container, pendingIntent); + + appWidgetManager.updateAppWidget(appWidgetId, views); + } + } + + @Override + public void onReceive(Context context, Intent intent) { + super.onReceive(context, intent); + if (ACTION_UPDATE.equals(intent.getAction())) { + // 启动 WidgetUpdateService + Intent serviceIntent = new Intent(context, WidgetUpdateService.class); + context.startService(serviceIntent); + } + } +} diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetService.java b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetService.java new file mode 100644 index 0000000..27a83e0 --- /dev/null +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/MyWidgetService.java @@ -0,0 +1,80 @@ +package org.astral.findmaimaiultra.ui.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.widget.RemoteViews; +import android.widget.RemoteViewsService; +import androidx.annotation.NonNull; +import org.astral.findmaimaiultra.R; + +import java.util.ArrayList; +import java.util.List; + +public class MyWidgetService extends RemoteViewsService { + @Override + public RemoteViewsFactory onGetViewFactory(Intent intent) { + return new MyWidgetFactory(this.getApplicationContext(), intent); + } +} + +class MyWidgetFactory implements RemoteViewsService.RemoteViewsFactory { + private Context context; + private List dataList; + + public MyWidgetFactory(Context context, Intent intent) { + this.context = context; + this.dataList = intent.getStringArrayListExtra("dataList"); + if (dataList == null) { + dataList = new ArrayList<>(); + } + } + + @Override + public void onCreate() { + // 初始化数据 + } + + @Override + public void onDataSetChanged() { + // 数据集发生变化时调用 + } + + @Override + public void onDestroy() { + // 清理资源 + } + + @Override + public int getCount() { + return dataList.size(); + } + + @NonNull + @Override + public RemoteViews getViewAt(int position) { + @SuppressLint("RemoteViewLayout") RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_item); + views.setTextViewText(R.id.widget_item_text, dataList.get(position)); + return views; + } + + @Override + public RemoteViews getLoadingView() { + return null; + } + + @Override + public int getViewTypeCount() { + return 1; + } + + @Override + public long getItemId(int position) { + return position; + } + + @Override + public boolean hasStableIds() { + return true; + } +} diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetConfigureActivity.java b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetConfigureActivity.java new file mode 100644 index 0000000..79348e0 --- /dev/null +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetConfigureActivity.java @@ -0,0 +1,14 @@ +package org.astral.findmaimaiultra.ui.widget; + +import android.app.Activity; +import android.os.Bundle; +import org.astral.findmaimaiultra.R; + +public class WidgetConfigureActivity extends Activity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_widget_configure); + // 添加配置逻辑 + } +} diff --git a/app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetUpdateService.java b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetUpdateService.java new file mode 100644 index 0000000..18bc333 --- /dev/null +++ b/app/src/main/java/org/astral/findmaimaiultra/ui/widget/WidgetUpdateService.java @@ -0,0 +1,112 @@ +package org.astral.findmaimaiultra.ui.widget; + +import android.app.IntentService; +import android.appwidget.AppWidgetManager; +import android.content.ComponentName; +import android.content.Intent; +import android.util.Log; +import android.widget.RemoteViews; +import androidx.annotation.Nullable; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import org.astral.findmaimaiultra.R; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +public class WidgetUpdateService extends IntentService { + private static final String TAG = "WidgetUpdateService"; + + public WidgetUpdateService() { + super("WidgetUpdateService"); + } + + @Override + protected void onHandleIntent(@Nullable Intent intent) { + if (intent != null) { + fetchDataAndUpdateWidget(); + } + } + + private void fetchDataAndUpdateWidget() { + Log.d(TAG + "loading", "Fetching data and updating widget"); + OkHttpClient client = new OkHttpClient(); + String url = "http://yourserver.com/api/data"; // 替换为实际的API地址 + + Request request = new Request.Builder() + .url(url) + .build(); + + client.newCall(request).enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + Log.e(TAG, "Error fetching data: " + e.getMessage()); + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(WidgetUpdateService.this); + ComponentName thisWidget = new ComponentName(WidgetUpdateService.this, MyWidgetProvider.class); + int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + for (int appWidgetId : appWidgetIds) { + RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_2x2); + + // 将数据列表转换为字符串 + StringBuilder dataText = new StringBuilder(); + dataText.append("加载失败"); + // 设置TextView的文本内容 + views.setTextViewText(R.id.widget_text, dataText.toString()); + + appWidgetManager.updateAppWidget(appWidgetId, views); + } + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + if (response.isSuccessful()) { + String responseData = response.body().string(); + List dataList = parseData(responseData); + + AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(WidgetUpdateService.this); + ComponentName thisWidget = new ComponentName(WidgetUpdateService.this, MyWidgetProvider.class); + int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); + + for (int appWidgetId : appWidgetIds) { + RemoteViews views = new RemoteViews(getPackageName(), R.layout.widget_2x2); + + // 将数据列表转换为字符串 + StringBuilder dataText = new StringBuilder(); + for (String data : dataList) { + dataText.append(data).append("\n"); + } + + // 设置TextView的文本内容 + views.setTextViewText(R.id.widget_text, dataText.toString()); + + appWidgetManager.updateAppWidget(appWidgetId, views); + } + } else { + Log.e(TAG, "Failed to fetch data: " + response.code()); + } + } + }); + } + + private List parseData(String jsonData) { + List dataList = new ArrayList<>(); + try { + JSONArray jsonArray = new JSONArray(jsonData); + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String data = jsonObject.getString("data_key"); // 替换为实际的JSON键 + dataList.add(data); + } + } catch (JSONException e) { + Log.e(TAG, "Error parsing JSON: " + e.getMessage()); + } + return dataList; + } +} diff --git a/app/src/main/java/org/astral/findmaimaiultra/utill/AddressParser.java b/app/src/main/java/org/astral/findmaimaiultra/utill/AddressParser.java index 6a5e63a..3c28411 100644 --- a/app/src/main/java/org/astral/findmaimaiultra/utill/AddressParser.java +++ b/app/src/main/java/org/astral/findmaimaiultra/utill/AddressParser.java @@ -53,6 +53,7 @@ public class AddressParser { HomeFragment.province = "天津市"; } } + } }catch (Exception e) { } diff --git a/app/src/main/res/drawable/rounded_background.xml b/app/src/main/res/drawable/rounded_background.xml new file mode 100644 index 0000000..26e50db --- /dev/null +++ b/app/src/main/res/drawable/rounded_background.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/app/src/main/res/layout/activity_update.xml b/app/src/main/res/layout/activity_update.xml index e000c8f..8c4b4cc 100644 --- a/app/src/main/res/layout/activity_update.xml +++ b/app/src/main/res/layout/activity_update.xml @@ -137,25 +137,27 @@ android:text="Re:Mas" android:textSize="12sp" /> - +