",
463 | // "
");
464 |
465 | result = header + addonStyle + result + footer;
466 |
467 | try {
468 | if (returnTitle.equals(title)) {
469 | File tmp = new File(getCacheDir(), title);
470 |
471 | FileOutputStream outStream = new FileOutputStream(tmp);
472 | outStream.write(long2Bytes(revid));
473 | byte[] buffertmp = result.getBytes("utf-8");
474 | outStream.write(long2Bytes(buffertmp.length));
475 | outStream.write(buffertmp);
476 | outStream.close();
477 |
478 | Log.i("MoeGirl", "cache: " + title + " Length: "
479 | + Integer.toString(buffertmp.length));
480 |
481 | } else {
482 | File tmp = new File(getCacheDir(), title);
483 | FileOutputStream outStream = new FileOutputStream(tmp);
484 | outStream.write(long2Bytes(0l));
485 | byte[] buffertmp = returnTitle.getBytes("utf-8");
486 | outStream.write(long2Bytes(buffertmp.length));
487 | outStream.write(buffertmp);
488 | outStream.close();
489 |
490 | tmp = new File(getCacheDir(), returnTitle);
491 | if (!tmp.exists()) {
492 | outStream = new FileOutputStream(tmp);
493 | outStream.write(long2Bytes(revid));
494 | buffertmp = result.getBytes("utf-8");
495 | outStream.write(long2Bytes(buffertmp.length));
496 | outStream.write(buffertmp);
497 | outStream.close();
498 | }
499 | }
500 | } catch (Exception e) {
501 | e.printStackTrace();
502 | Log.e("MoeGirlGetTxt", e.toString());
503 | }
504 | isFromCache = false;
505 | this.result = result;
506 |
507 | if (!returnTitle.equals(title)) {
508 | this.result_extra = returnTitle;
509 | return 1;
510 | } else {
511 | return 0;
512 | }
513 | // return sb.toString();
514 | } catch (org.json.JSONException e) {
515 | // String errhtml = "-1";
516 | return -1;
517 | } catch (Exception e) {
518 | e.printStackTrace();
519 | Log.e("MoeGirl", e.toString());
520 | }
521 | return -2;
522 | }
523 |
524 | @Override
525 | protected void onPostExecute(Integer result) {
526 | boolean isErr = false;
527 | if (result == -1) {
528 | webview1.loadDataWithBaseURL(null, "没有这个词条", "text/html",
529 | "utf-8", null);
530 | setTitle("萌娘百科");
531 | isErr = true;
532 | } else if (result == null || result == -1) {
533 | webview1.loadDataWithBaseURL(null, "发生错误!", "text/html",
534 | "utf-8", null);
535 | setTitle("萌娘百科");
536 | isErr = true;
537 | } else {
538 | if (result == 1) {
539 | title = this.result_extra;
540 | }
541 |
542 | Log.i("MoeGirlView",
543 | "title: " + title.toLowerCase(Locale.getDefault()));
544 | webview1.loadDataWithBaseURL("http://m.moegirl.org/",
545 | this.result, "text/html", "utf-8", null);
546 |
547 | if (title.toLowerCase(Locale.getDefault()).equals("mainpage")) {
548 | setTitle("萌娘百科");
549 | } else {
550 | setTitle(title);
551 | }
552 | webview_html = this.result;
553 | }
554 |
555 | pdialog.dismiss();
556 |
557 | if (!isErr && isFromCache && !forceCache && revid > 0) {
558 | task2 = new CheckUpdateTask();
559 | task2.execute(new String[] { title, Long.toString(revid) });
560 | }
561 | }
562 | }
563 |
564 | @Override
565 | public boolean onKeyDown(int keyCode, KeyEvent event) {
566 | if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() < 5) {
567 | if (title != homePage) {
568 | String target = goback();
569 | while (target.equals(this.title)) {
570 | target = goback();
571 | }
572 | loadtitle(target, false);
573 | return true;
574 | }
575 | }
576 | return super.onKeyDown(keyCode, event);
577 | }
578 |
579 | private String goback() {
580 | if (pageHistory.isEmpty()) {
581 | return homePage;
582 | } else {
583 | return pageHistory.pop();
584 | }
585 | }
586 |
587 | private class HelloWebViewClient extends WebViewClient {
588 | @Override
589 | public boolean shouldOverrideUrlLoading(WebView view, String url) {
590 | // Log.i("MoeGirl", url);
591 | if (url.indexOf("http://m.moegirl.org/") >= 0) {
592 | String newtitle = url.replace("http://m.moegirl.org/", "");
593 | if (url.indexOf("index.php") < 0
594 | && newtitle.indexOf("File:") < 0
595 | && newtitle.indexOf("Category:") < 0) {
596 | try {
597 | loadtitle(URLDecoder.decode(newtitle, "utf-8"));
598 | } catch (UnsupportedEncodingException e) {
599 | // TODO Auto-generated catch block
600 | e.printStackTrace();
601 | }
602 | } else {
603 | Intent intent = new Intent(Intent.ACTION_VIEW);
604 | Uri content_url = Uri.parse(url.replace("redlink=1", ""));
605 | intent.setData(content_url);
606 | startActivity(intent);
607 | // view.loadUrl(url.replace("redlink=1", ""));
608 | // setTitle("萌娘百科");
609 | }
610 | return true;
611 | } else {
612 | Intent intent = new Intent(Intent.ACTION_VIEW);
613 | Uri content_url = Uri.parse(url);
614 | intent.setData(content_url);
615 | startActivity(intent);
616 | return true;
617 | }
618 |
619 | }
620 | }
621 |
622 | private class CheckUpdateTask extends AsyncTask {
623 |
624 | String arg_title;
625 |
626 | @Override
627 | protected Boolean doInBackground(String... arg0) {
628 | arg_title = arg0[0];
629 |
630 | long arg_revid = Long.parseLong(arg0[1]);
631 |
632 | String urladdr = "";
633 | try {
634 | urladdr = String
635 | .format("http://zh.moegirl.org/api.php?action=query&prop=revisions&titles=%1$s&format=json",
636 | URLEncoder.encode(arg_title, "utf-8"));
637 | } catch (UnsupportedEncodingException e1) {
638 | // TODO Auto-generated catch block
639 | e1.printStackTrace();
640 | return false;
641 | }
642 |
643 | HttpClient httpClient1 = new DefaultHttpClient();
644 | httpClient1.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
645 | getResources().getString(R.string.user_agent));
646 | HttpGet httpRequest1 = new HttpGet(urladdr);
647 |
648 | try {
649 | HttpResponse response = httpClient1.execute(httpRequest1);
650 | HttpEntity entity = response.getEntity();
651 |
652 | String getResult = EntityUtils.toString(entity);
653 | // BufferedReader reader = new BufferedReader(
654 | // new InputStreamReader(entity.getContent(), "utf-8"));
655 | //
656 | // StringBuffer sb = new StringBuffer();
657 | // String line = null;
658 | // while ((line = reader.readLine()) != null) {
659 | // sb.append(line + '\n');
660 | // }
661 | // reader.close();
662 | // // Log.i("MoeGirl", sb.toString());
663 |
664 | JSONTokener JsonParser = new JSONTokener(getResult);
665 | JSONObject all = (JSONObject) JsonParser.nextValue();
666 | JSONObject query = all.getJSONObject("query").getJSONObject(
667 | "pages");
668 | if (query.length() > 0) {
669 | JSONObject page = query.getJSONObject(query.names()
670 | .getString(0));
671 | JSONArray revisions = page.getJSONArray("revisions");
672 | long nowRevid = revisions.getJSONObject(0).getLong("revid");
673 |
674 | Log.i("MoeGirlUpdateCheck",
675 | "NewRevid: " + Long.toString(nowRevid)
676 | + " CacheRevid: "
677 | + Long.toString(arg_revid));
678 | if (nowRevid > arg_revid) {
679 | return true;
680 | } else {
681 | return false;
682 | }
683 | } else {
684 | return false;
685 | }
686 | // return sb.toString();
687 | } catch (org.json.JSONException e) {
688 | Log.e("MoeGirlUpdateCheck", e.toString());
689 | return false;
690 | } catch (Exception e) {
691 | Log.e("MoeGirlUpdateCheck", e.toString());
692 | }
693 | return false;
694 | }
695 |
696 | @Override
697 | protected void onPostExecute(Boolean result) {
698 | // Log.i("MoeGirl", result.toString());
699 | if (result && arg_title.equals(title)) {
700 | Toast.makeText(getApplicationContext(), "词条已经更新,点击右上角刷新查看",
701 | Toast.LENGTH_SHORT).show();
702 | }
703 | }
704 |
705 | }
706 |
707 | public int detect() {
708 | ConnectivityManager manager = (ConnectivityManager) this
709 | .getSystemService(Context.CONNECTIVITY_SERVICE);
710 | if (manager == null) {
711 | return 0;
712 | }
713 | NetworkInfo networkinfo = manager.getActiveNetworkInfo();
714 |
715 | if (networkinfo == null || !networkinfo.isAvailable()) {
716 | return 0;
717 | }
718 | if (networkinfo.getType() == ConnectivityManager.TYPE_MOBILE) {
719 | return 1;
720 | } else if (networkinfo.getType() == ConnectivityManager.TYPE_WIFI) {
721 | return 2;
722 | }
723 | return 0;
724 | }
725 |
726 | public static byte[] long2Bytes(long num) {
727 | byte[] byteNum = new byte[8];
728 | for (int ix = 0; ix < 8; ++ix) {
729 | int offset = 64 - (ix + 1) * 8;
730 | byteNum[ix] = (byte) ((num >> offset) & 0xff);
731 | }
732 | return byteNum;
733 | }
734 |
735 | public static long bytes2Long(byte[] byteNum) {
736 | long num = 0;
737 | for (int ix = 0; ix < 8; ++ix) {
738 | num <<= 8;
739 | num |= (byteNum[ix] & 0xff);
740 | }
741 | return num;
742 | }
743 |
744 | @Override
745 | protected void onDestroy() {
746 | // TODO Auto-generated method stub
747 | super.onDestroy();
748 | shakeDetector.stop();
749 | }
750 |
751 | private class ShakeListener implements OnShakeListener {
752 |
753 | @Override
754 | public void onShake() { // TODO Auto-generated method stub
755 | webview1.loadUrl("http://m.moegirl.org/Special:%E9%9A%8F%E6%9C%BA%E9%A1%B5%E9%9D%A2");
756 | }
757 | }
758 |
759 | }
760 |
--------------------------------------------------------------------------------
/src/org/moegirl/moegirlview/SampleSearchActivity.java:
--------------------------------------------------------------------------------
1 | package org.moegirl.moegirlview;
2 |
3 | import android.app.ListActivity;
4 | import android.app.SearchManager;
5 | import android.content.Intent;
6 | import android.os.Bundle;
7 | import android.util.Log;
8 | import android.view.View;
9 | import android.widget.ListView;
10 |
11 | public class SampleSearchActivity extends ListActivity {
12 | @Override
13 | public void onCreate(Bundle savedInstanceState) {
14 | super.onCreate(savedInstanceState);
15 | handleIntent(getIntent());
16 | }
17 |
18 | @Override
19 | public void onNewIntent(Intent intent) {
20 | setIntent(intent);
21 | handleIntent(intent);
22 | }
23 |
24 | @Override
25 | public void onListItemClick(ListView l, View v, int position, long id) {
26 | // call detail activity for clicked entry
27 | }
28 |
29 | private void handleIntent(Intent intent) {
30 | if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
31 | String query = intent.getStringExtra(SearchManager.QUERY);
32 | doSearch(query);
33 | }
34 | }
35 |
36 | private void doSearch(String queryStr) {
37 | // get a Cursor, prepare the ListAdapter
38 | // and set it
39 | Log.i("MoeGirl", queryStr);
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/org/moegirl/moegirlview/SearchSuggestionsProvider.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moegirlwiki/MoegirlAndroid/5be9a58dc34a062e6dd2730e8581ab04f669f5bf/src/org/moegirl/moegirlview/SearchSuggestionsProvider.java
--------------------------------------------------------------------------------
/src/org/moegirl/moegirlview/ShakeDetector.java:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/moegirlwiki/MoegirlAndroid/5be9a58dc34a062e6dd2730e8581ab04f669f5bf/src/org/moegirl/moegirlview/ShakeDetector.java
--------------------------------------------------------------------------------
/src/org/moegirl/moegirlview/SplashActivity.java:
--------------------------------------------------------------------------------
1 | package org.moegirl.moegirlview;
2 |
3 | import android.app.Activity;
4 | import android.content.Intent;
5 | import android.os.Bundle;
6 | import android.os.Handler;
7 | import android.view.Window;
8 |
9 | public class SplashActivity extends Activity {
10 |
11 | @Override
12 | protected void onCreate(Bundle savedInstanceState) {
13 | super.onCreate(savedInstanceState);
14 |
15 | requestWindowFeature(Window.FEATURE_NO_TITLE);
16 |
17 | setContentView(R.layout.activity_splash);
18 |
19 | new Handler().postDelayed(new Runnable() {
20 | public void run() {
21 | Intent i = new Intent(SplashActivity.this, MainActivity.class);
22 | SplashActivity.this.startActivity(i);
23 | SplashActivity.this.finish();
24 | }
25 | }, 800);
26 | }
27 |
28 | class SplashHandler implements Runnable {
29 | public void run() {
30 | startActivity(new Intent(getApplication(), MainActivity.class));
31 | SplashActivity.this.finish();
32 | }
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------