Skip to content

Commit a73e119

Browse files
SoxiaLiSAclaude
andcommitted
feat: 屏蔽记录支持导出/导入,方便换机迁移
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 905ebbb commit a73e119

10 files changed

Lines changed: 198 additions & 2 deletions

File tree

app/src/main/java/ceui/lisa/fragments/FragmentViewPager.java

Lines changed: 111 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package ceui.lisa.fragments;
22

3+
import android.content.Intent;
4+
import android.net.Uri;
5+
import android.os.Build;
36
import android.os.Bundle;
47
import android.text.TextUtils;
58
import android.view.View;
@@ -13,15 +16,34 @@
1316
import androidx.fragment.app.Fragment;
1417
import androidx.fragment.app.FragmentPagerAdapter;
1518
import androidx.viewpager.widget.ViewPager;
19+
20+
import com.blankj.utilcode.util.UriUtils;
21+
import com.google.gson.reflect.TypeToken;
22+
23+
import java.lang.reflect.Type;
24+
import java.util.List;
25+
1626
import ceui.lisa.R;
27+
import ceui.lisa.activities.BaseActivity;
1728
import ceui.lisa.activities.Shaft;
29+
import ceui.lisa.database.AppDatabase;
30+
import ceui.lisa.database.MuteEntity;
1831
import ceui.lisa.databinding.ViewpagerWithTablayoutBinding;
32+
import ceui.lisa.download.IllustDownload;
33+
import ceui.lisa.interfaces.Callback;
34+
import ceui.lisa.utils.Common;
1935
import ceui.lisa.utils.Dev;
2036
import ceui.lisa.utils.MyOnTabSelectedListener;
2137
import ceui.lisa.utils.Params;
2238

39+
import static android.app.Activity.RESULT_OK;
40+
import static android.provider.DocumentsContract.EXTRA_INITIAL_URI;
41+
2342
public class FragmentViewPager extends BaseFragment<ViewpagerWithTablayoutBinding> {
2443

44+
private static final int REQUEST_CODE_IMPORT_MUTE = 20082;
45+
private static final String MUTE_RECORDS_FILE_NAME = "Shaft-MuteRecords.json";
46+
2547
private String title;
2648
private ListFragment[] mFragments = null;
2749

@@ -65,7 +87,7 @@ public void initView() {
6587
new FragmentMutedObjects(),
6688
};
6789
baseBind.toolbar.inflateMenu(R.menu.delete_and_add);
68-
baseBind.toolbar.setOnMenuItemClickListener((Toolbar.OnMenuItemClickListener) mFragments[0]);
90+
setMuteMenuListener(mFragments[0]);
6991
baseBind.toolbarTitle.setText(R.string.muted_history);
7092
baseBind.viewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager()) {
7193
@NonNull
@@ -93,7 +115,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
93115

94116
@Override
95117
public void onPageSelected(int position) {
96-
baseBind.toolbar.setOnMenuItemClickListener((Toolbar.OnMenuItemClickListener) mFragments[position]);
118+
setMuteMenuListener(mFragments[position]);
97119
if (position == 0) {
98120
baseBind.toolbar.getMenu().clear();
99121
baseBind.toolbar.inflateMenu(R.menu.delete_and_add);
@@ -160,4 +182,91 @@ public void forceRefresh() {
160182
e.printStackTrace();
161183
}
162184
}
185+
186+
private void setMuteMenuListener(ListFragment delegate) {
187+
baseBind.toolbar.setOnMenuItemClickListener(item -> {
188+
if (item.getItemId() == R.id.action_export_mute) {
189+
exportMuteRecords();
190+
return true;
191+
} else if (item.getItemId() == R.id.action_import_mute) {
192+
pickMuteRecordsFile();
193+
return true;
194+
}
195+
return ((Toolbar.OnMenuItemClickListener) delegate).onMenuItemClick(item);
196+
});
197+
}
198+
199+
private void exportMuteRecords() {
200+
new Thread(() -> {
201+
List<MuteEntity> all = AppDatabase.getAppDatabase(mContext)
202+
.searchDao().getAllMuteEntities();
203+
if (all == null || all.isEmpty()) {
204+
mActivity.runOnUiThread(() ->
205+
Common.showToast(getString(R.string.mute_records_export_empty)));
206+
return;
207+
}
208+
String json = Shaft.sGson.toJson(all);
209+
mActivity.runOnUiThread(() ->
210+
IllustDownload.downloadBackupFile((BaseActivity<?>) mActivity,
211+
MUTE_RECORDS_FILE_NAME, json, new Callback<Uri>() {
212+
@Override
213+
public void doSomething(Uri t) {
214+
Common.showToast(getString(R.string.mute_records_export_success, all.size()));
215+
}
216+
}));
217+
}).start();
218+
}
219+
220+
private void pickMuteRecordsFile() {
221+
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
222+
intent.addCategory(Intent.CATEGORY_OPENABLE);
223+
intent.setType("*/*");
224+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
225+
Uri initialUri = Uri.parse("content://com.android.externalstorage.documents/document/primary:"
226+
+ "Download%2fShaftBackups%2f" + MUTE_RECORDS_FILE_NAME);
227+
intent.putExtra(EXTRA_INITIAL_URI, initialUri);
228+
}
229+
startActivityForResult(intent, REQUEST_CODE_IMPORT_MUTE);
230+
}
231+
232+
@Override
233+
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
234+
super.onActivityResult(requestCode, resultCode, data);
235+
if (requestCode == REQUEST_CODE_IMPORT_MUTE && resultCode == RESULT_OK && data != null) {
236+
Uri uri = data.getData();
237+
if (uri == null) {
238+
Common.showToast(getString(R.string.mute_records_import_no_file));
239+
return;
240+
}
241+
new Thread(() -> {
242+
try {
243+
String fileString = new String(UriUtils.uri2Bytes(uri));
244+
Type listType = new TypeToken<List<MuteEntity>>() {}.getType();
245+
List<MuteEntity> entities = Shaft.sGson.fromJson(fileString, listType);
246+
if (entities == null || entities.isEmpty()) {
247+
mActivity.runOnUiThread(() ->
248+
Common.showToast(getString(R.string.mute_records_import_invalid)));
249+
return;
250+
}
251+
int imported = 0;
252+
for (MuteEntity entity : entities) {
253+
if (entity == null || entity.getTagJson() == null || entity.getTagJson().isEmpty()) {
254+
continue;
255+
}
256+
AppDatabase.getAppDatabase(mContext).searchDao().insertMuteTag(entity);
257+
imported++;
258+
}
259+
int finalImported = imported;
260+
mActivity.runOnUiThread(() -> {
261+
forceRefresh();
262+
Common.showToast(getString(R.string.mute_records_import_success, finalImported));
263+
});
264+
} catch (Exception e) {
265+
e.printStackTrace();
266+
mActivity.runOnUiThread(() ->
267+
Common.showToast(getString(R.string.mute_records_import_failed, String.valueOf(e.getMessage()))));
268+
}
269+
}).start();
270+
}
271+
}
163272
}

app/src/main/res/menu/delete_and_add.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,16 @@
1414
android:icon="@drawable/ic_add_black_24dp"
1515
android:title="@string/add"
1616
app:showAsAction="ifRoom" />
17+
18+
<item
19+
android:id="@+id/action_export_mute"
20+
android:orderInCategory="200"
21+
android:title="@string/mute_records_export"
22+
app:showAsAction="never" />
23+
24+
<item
25+
android:id="@+id/action_import_mute"
26+
android:orderInCategory="201"
27+
android:title="@string/mute_records_import"
28+
app:showAsAction="never" />
1729
</menu>

app/src/main/res/menu/delete_muted_history.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,16 @@
88
android:title="@string/delete_all"
99
app:showAsAction="ifRoom" />
1010

11+
<item
12+
android:id="@+id/action_export_mute"
13+
android:orderInCategory="200"
14+
android:title="@string/mute_records_export"
15+
app:showAsAction="never" />
16+
17+
<item
18+
android:id="@+id/action_import_mute"
19+
android:orderInCategory="201"
20+
android:title="@string/mute_records_import"
21+
app:showAsAction="never" />
22+
1123
</menu>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,15 @@
718718
<string name="download_records_import_success">Imported %1$d records successfully</string>
719719
<string name="download_records_import_failed">Import failed: %1$s</string>
720720

721+
<string name="mute_records_export">Export mute records</string>
722+
<string name="mute_records_import">Import mute records</string>
723+
<string name="mute_records_export_empty">No mute records to export</string>
724+
<string name="mute_records_export_success">Exported %1$d mute records</string>
725+
<string name="mute_records_import_no_file">Import failed: no file selected</string>
726+
<string name="mute_records_import_invalid">Import failed: file is empty or malformed</string>
727+
<string name="mute_records_import_success">Imported %1$d mute records successfully</string>
728+
<string name="mute_records_import_failed">Import failed: %1$s</string>
729+
721730
<!-- V3 illust detail -->
722731
<string name="v3_label_views">Views</string>
723732
<string name="v3_label_likes">Likes</string>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -754,6 +754,15 @@
754754
<string name="download_records_import_success">%1$d 件のレコードをインポートしました</string>
755755
<string name="download_records_import_failed">インポートに失敗しました:%1$s</string>
756756

757+
<string name="mute_records_export">ミュート履歴をエクスポート</string>
758+
<string name="mute_records_import">ミュート履歴をインポート</string>
759+
<string name="mute_records_export_empty">エクスポート可能なミュート履歴がありません</string>
760+
<string name="mute_records_export_success">ミュート履歴をエクスポートしました(%1$d 件)</string>
761+
<string name="mute_records_import_no_file">インポートに失敗しました:ファイルが選択されていません</string>
762+
<string name="mute_records_import_invalid">インポートに失敗しました:ファイルが空または形式が正しくありません</string>
763+
<string name="mute_records_import_success">%1$d 件のミュート記録をインポートしました</string>
764+
<string name="mute_records_import_failed">インポートに失敗しました:%1$s</string>
765+
757766
<!-- V3 illust detail -->
758767
<string name="v3_label_views">閲覧数</string>
759768
<string name="v3_label_likes">いいね</string>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,6 +662,15 @@
662662
<string name="download_records_import_success">%1$d개의 기록을 가져왔습니다</string>
663663
<string name="download_records_import_failed">가져오기 실패: %1$s</string>
664664

665+
<string name="mute_records_export">뮤트 기록 내보내기</string>
666+
<string name="mute_records_import">뮤트 기록 가져오기</string>
667+
<string name="mute_records_export_empty">내보낼 뮤트 기록이 없습니다</string>
668+
<string name="mute_records_export_success">뮤트 기록을 내보냈습니다 (%1$d개)</string>
669+
<string name="mute_records_import_no_file">가져오기 실패: 파일이 선택되지 않았습니다</string>
670+
<string name="mute_records_import_invalid">가져오기 실패: 파일이 비어있거나 형식이 올바르지 않습니다</string>
671+
<string name="mute_records_import_success">%1$d개의 뮤트 기록을 가져왔습니다</string>
672+
<string name="mute_records_import_failed">가져오기 실패: %1$s</string>
673+
665674
<!-- V3 illust detail -->
666675
<string name="v3_label_views">조회수</string>
667676
<string name="v3_label_likes">좋아요</string>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,15 @@
655655
<string name="download_records_import_success">Импортировано записей: %1$d</string>
656656
<string name="download_records_import_failed">Ошибка импорта: %1$s</string>
657657

658+
<string name="mute_records_export">Экспорт списка скрытых</string>
659+
<string name="mute_records_import">Импорт списка скрытых</string>
660+
<string name="mute_records_export_empty">Нет записей для экспорта</string>
661+
<string name="mute_records_export_success">Экспортировано записей: %1$d</string>
662+
<string name="mute_records_import_no_file">Ошибка импорта: файл не выбран</string>
663+
<string name="mute_records_import_invalid">Ошибка импорта: файл пуст или имеет неверный формат</string>
664+
<string name="mute_records_import_success">Импортировано записей: %1$d</string>
665+
<string name="mute_records_import_failed">Ошибка импорта: %1$s</string>
666+
658667
<!-- V3 illust detail -->
659668
<string name="v3_label_views">Просмотры</string>
660669
<string name="v3_label_likes">Лайки</string>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -653,6 +653,15 @@
653653
<string name="download_records_import_success">%1$d kayıt başarıyla içe aktarıldı</string>
654654
<string name="download_records_import_failed">İçe aktarma başarısız: %1$s</string>
655655

656+
<string name="mute_records_export">Sessize alma kayıtlarını dışa aktar</string>
657+
<string name="mute_records_import">Sessize alma kayıtlarını içe aktar</string>
658+
<string name="mute_records_export_empty">Dışa aktarılacak sessize alma kaydı yok</string>
659+
<string name="mute_records_export_success">%1$d sessize alma kaydı dışa aktarıldı</string>
660+
<string name="mute_records_import_no_file">İçe aktarma başarısız: dosya seçilmedi</string>
661+
<string name="mute_records_import_invalid">İçe aktarma başarısız: dosya boş veya geçersiz biçim</string>
662+
<string name="mute_records_import_success">%1$d kayıt başarıyla içe aktarıldı</string>
663+
<string name="mute_records_import_failed">İçe aktarma başarısız: %1$s</string>
664+
656665
<!-- V3 illust detail -->
657666
<string name="v3_label_views">Görüntüleme</string>
658667
<string name="v3_label_likes">Beğeni</string>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,15 @@
767767
<string name="download_records_import_success">匯入成功,共 %1$d 條記錄</string>
768768
<string name="download_records_import_failed">匯入失敗:%1$s</string>
769769

770+
<string name="mute_records_export">匯出屏蔽記錄</string>
771+
<string name="mute_records_import">匯入屏蔽記錄</string>
772+
<string name="mute_records_export_empty">沒有可匯出的屏蔽記錄</string>
773+
<string name="mute_records_export_success">屏蔽記錄已匯出,共 %1$d 條</string>
774+
<string name="mute_records_import_no_file">匯入失敗:未選擇檔案</string>
775+
<string name="mute_records_import_invalid">匯入失敗:檔案為空或格式不正確</string>
776+
<string name="mute_records_import_success">匯入成功,共 %1$d 條記錄</string>
777+
<string name="mute_records_import_failed">匯入失敗:%1$s</string>
778+
770779
<!-- V3 illust detail -->
771780
<string name="v3_label_views">瀏覽</string>
772781
<string name="v3_label_likes">按讚</string>

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,15 @@
924924
<string name="download_records_import_success">导入成功,共 %1$d 条记录</string>
925925
<string name="download_records_import_failed">导入失败:%1$s</string>
926926

927+
<string name="mute_records_export">导出屏蔽记录</string>
928+
<string name="mute_records_import">导入屏蔽记录</string>
929+
<string name="mute_records_export_empty">没有可导出的屏蔽记录</string>
930+
<string name="mute_records_export_success">屏蔽记录已导出,共 %1$d 条</string>
931+
<string name="mute_records_import_no_file">导入失败:未选择文件</string>
932+
<string name="mute_records_import_invalid">导入失败:文件为空或格式不正确</string>
933+
<string name="mute_records_import_success">导入成功,共 %1$d 条记录</string>
934+
<string name="mute_records_import_failed">导入失败:%1$s</string>
935+
927936
<!-- V3 illust detail -->
928937
<string name="v3_label_views">浏览</string>
929938
<string name="v3_label_likes">点赞</string>

0 commit comments

Comments
 (0)