xiongzhu 3 年之前
父節點
當前提交
1520eef922

+ 16 - 14
app/src/main/AndroidManifest.xml

@@ -11,8 +11,7 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
-
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
 
     <queries>
         <intent>
@@ -32,12 +31,15 @@
         android:fullBackupContent="@xml/backup_content"
         android:icon="@mipmap/ic_launcher"
         android:label="@string/app_name"
+        android:networkSecurityConfig="@xml/network_security_config"
         android:requestLegacyExternalStorage="true"
         android:roundIcon="@mipmap/ic_launcher"
         android:supportsRtl="true"
         android:theme="@style/DarkTheme"
-        android:usesCleartextTraffic="true"
-        android:networkSecurityConfig="@xml/network_security_config">
+        android:usesCleartextTraffic="true">
+        <activity
+            android:name=".ReviewActivity"
+            android:exported="false" />
         <activity
             android:name=".RegisterActivity"
             android:exported="false" />
@@ -57,12 +59,12 @@
         </activity>
 
         <activity-alias
-            android:name=".components.launcher.LauncherCalculator"
-            android:enabled="false"
+            android:name=".components.launcher.LauncherReal"
+            android:enabled="true"
             android:exported="true"
-            android:icon="@mipmap/ic_launcher_calculator"
-            android:label="@string/app_name_fake_calculator"
-            android:roundIcon="@mipmap/ic_launcher_calculator_round"
+            android:icon="@mipmap/ic_launcher"
+            android:label="@string/app_name"
+            android:roundIcon="@mipmap/ic_launcher"
             android:targetActivity=".PINActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -71,12 +73,12 @@
             </intent-filter>
         </activity-alias>
         <activity-alias
-            android:name=".components.launcher.LauncherReal"
-            android:enabled="true"
+            android:name=".components.launcher.LauncherCalculator"
+            android:enabled="false"
             android:exported="true"
-            android:icon="@mipmap/ic_launcher"
-            android:label="@string/app_name"
-            android:roundIcon="@mipmap/ic_launcher"
+            android:icon="@mipmap/ic_launcher_calculator"
+            android:label="@string/app_name_fake_calculator"
+            android:roundIcon="@mipmap/ic_launcher_calculator_round"
             android:targetActivity=".PINActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />

+ 2 - 1
app/src/main/java/com/dar/nbook/MainActivity.java

@@ -190,7 +190,8 @@ public class MainActivity extends BaseActivity
 
         manageDrawer();
         setActivityTitle();
-        if (firstTime) checkUpdate();
+//        if (firstTime)
+        checkUpdate();
         if (inspector != null) {
             inspector.start();
         } else {

+ 3 - 1
app/src/main/java/com/dar/nbook/PINActivity.java

@@ -140,6 +140,7 @@ public class PINActivity extends GeneralActivity {
         HttpClient.request(HttpClient.getApiService().getAppConfig(), new HttpCallback<>() {
             @Override
             public void onSuccess(SysConfigResponse<AppConfig> data) {
+                Global.setReview(data.getValue().getAppInfo().getReviewVersionCode() == BuildConfig.VERSION_CODE);
                 if (isDestroyed()) return;
                 GlideX
                     .with(PINActivity.this)
@@ -179,7 +180,8 @@ public class PINActivity extends GeneralActivity {
     public void finish() {
         if (finish) return;
         finish = true;
-        Intent i = new Intent(this, setMode ? SettingsActivity.class : MainActivity.class);
+        Intent i = new Intent(this, setMode ? SettingsActivity.class :
+            (Global.isReview() ? ReviewActivity.class : MainActivity.class));
         if (setMode || !hasPin() || pin.equals(getTruePin())) startActivity(i);
         if (openUrl != null) {
             Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(openUrl));

+ 58 - 0
app/src/main/java/com/dar/nbook/ReviewActivity.kt

@@ -0,0 +1,58 @@
+package com.dar.nbook
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+import androidx.recyclerview.widget.RecyclerView
+import com.dar.nbook.adapters.FakeAdapter
+import com.dar.nbook.api.HttpCallback
+import com.dar.nbook.api.HttpClient
+import com.dar.nbook.api.HttpError
+import com.dar.nbook.api.components.NUser
+import com.dar.nbook.api.response.FakeGallery
+import com.dar.nbook.api.response.GalleryResponse
+import com.dar.nbook.databinding.ActivityBloginBinding
+import com.dar.nbook.databinding.ActivityReviewBinding
+import com.dar.nbook.settings.Login
+import com.dar.nbook.utility.snackError
+import splitties.views.recyclerview.gridLayoutManager
+
+class ReviewActivity : AppCompatActivity() {
+
+    private lateinit var binding: ActivityReviewBinding;
+    private lateinit var adapter: FakeAdapter;
+    private lateinit var data: MutableList<FakeGallery>;
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        binding = ActivityReviewBinding.inflate(layoutInflater)
+        val view = binding.root
+        setContentView(view)
+        data = mutableListOf()
+        adapter = FakeAdapter(data)
+        binding.list.layoutManager = gridLayoutManager(2, false) {}
+        binding.list.adapter = adapter
+        binding.refresher.setOnRefreshListener {
+            getData()
+        }
+        getData()
+    }
+
+    fun getData() {
+        HttpClient.request(
+            HttpClient.getApiService().gallery(),
+            object : HttpCallback<GalleryResponse> {
+                override fun onSuccess(res: GalleryResponse?) {
+                    binding.refresher.isRefreshing = false
+                    if (res?.items != null) {
+                        data.clear()
+                        data.addAll(res.items)
+                        adapter.notifyDataSetChanged()
+                    }
+                }
+
+                override fun onFailure(error: HttpError<GalleryResponse>) {
+                    binding.refresher.isRefreshing = false
+                }
+            })
+    }
+}

+ 46 - 0
app/src/main/java/com/dar/nbook/adapters/FakeAdapter.kt

@@ -0,0 +1,46 @@
+package com.dar.nbook.adapters
+
+import android.content.Context
+import android.view.LayoutInflater
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+import com.bumptech.glide.Glide
+import com.dar.nbook.R
+import com.dar.nbook.api.response.FakeGallery
+import com.dar.nbook.components.GlideX
+import com.dar.nbook.databinding.EntryLayoutBinding
+
+class FakeAdapter(private val dataSet: List<FakeGallery>) :
+    RecyclerView.Adapter<FakeAdapter.ViewHolder>() {
+
+    class ViewHolder(binding: EntryLayoutBinding) :
+        RecyclerView.ViewHolder(binding.root) {
+        private var binding: EntryLayoutBinding
+
+        init {
+            this.binding = binding
+        }
+
+        fun bind(fakeGallery: FakeGallery) {
+            Glide.with(binding.root.context)
+                .load(fakeGallery.thumb)
+                .placeholder(R.drawable.ic_logo)
+                .into(binding.image)
+            binding.title.text = fakeGallery.title
+        }
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val itemBinding =
+            EntryLayoutBinding.inflate(LayoutInflater.from(parent.context), parent, false)
+        return ViewHolder(itemBinding)
+    }
+
+    override fun getItemCount(): Int {
+        return dataSet.size
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        holder.bind(dataSet[position])
+    }
+}

+ 7 - 0
app/src/main/java/com/dar/nbook/api/ApiService.java

@@ -4,10 +4,14 @@ import com.dar.nbook.api.components.NUser;
 import com.dar.nbook.api.request.UserLogin;
 import com.dar.nbook.api.request.UserRegister;
 import com.dar.nbook.api.response.AppConfig;
+import com.dar.nbook.api.response.FakeGallery;
+import com.dar.nbook.api.response.GalleryResponse;
 import com.dar.nbook.api.response.HasInviteResponse;
 import com.dar.nbook.api.response.LoginResponse;
 import com.dar.nbook.api.response.SysConfigResponse;
 
+import java.util.List;
+
 import retrofit2.Call;
 import retrofit2.http.Body;
 import retrofit2.http.GET;
@@ -31,4 +35,7 @@ public interface ApiService {
 
     @GET("users/{id}/hasInvite")
     Call<HasInviteResponse> hasInvite(@Path("id") Integer id);
+
+    @POST("gallery")
+    Call<GalleryResponse> gallery();
 }

+ 9 - 0
app/src/main/java/com/dar/nbook/api/response/AppConfig.java

@@ -5,6 +5,7 @@ public class AppConfig {
         private String packageName;
         private String versionName;
         private int versionCode;
+        private int reviewVersionCode;
         private String url;
 
         public String getPackageName() {
@@ -38,6 +39,14 @@ public class AppConfig {
         public void setUrl(String url) {
             this.url = url;
         }
+
+        public int getReviewVersionCode() {
+            return reviewVersionCode;
+        }
+
+        public void setReviewVersionCode(int reviewVersionCode) {
+            this.reviewVersionCode = reviewVersionCode;
+        }
     }
 
     public class AdInfo {

+ 60 - 0
app/src/main/java/com/dar/nbook/api/response/FakeGallery.java

@@ -0,0 +1,60 @@
+package com.dar.nbook.api.response;
+
+import java.util.List;
+
+public class FakeGallery{
+    private String createdAt;
+    private String thumb;
+    private String artist;
+    private List<String> details;
+    private int id;
+    private String title;
+
+    public void setCreatedAt(String createdAt){
+        this.createdAt = createdAt;
+    }
+
+    public String getCreatedAt(){
+        return createdAt;
+    }
+
+    public void setThumb(String thumb){
+        this.thumb = thumb;
+    }
+
+    public String getThumb(){
+        return thumb;
+    }
+
+    public void setArtist(String artist){
+        this.artist = artist;
+    }
+
+    public String getArtist(){
+        return artist;
+    }
+
+    public void setDetails(List<String> details){
+        this.details = details;
+    }
+
+    public List<String> getDetails(){
+        return details;
+    }
+
+    public void setId(int id){
+        this.id = id;
+    }
+
+    public int getId(){
+        return id;
+    }
+
+    public void setTitle(String title){
+        this.title = title;
+    }
+
+    public String getTitle(){
+        return title;
+    }
+}

+ 24 - 0
app/src/main/java/com/dar/nbook/api/response/GalleryResponse.java

@@ -0,0 +1,24 @@
+package com.dar.nbook.api.response;
+
+import java.util.List;
+
+public class GalleryResponse {
+    private Meta meta;
+    private List<FakeGallery> items;
+
+    public void setMeta(Meta meta) {
+        this.meta = meta;
+    }
+
+    public Meta getMeta() {
+        return meta;
+    }
+
+    public void setItems(List<FakeGallery> items) {
+        this.items = items;
+    }
+
+    public List<FakeGallery> getItems() {
+        return items;
+    }
+}

+ 49 - 0
app/src/main/java/com/dar/nbook/api/response/Meta.java

@@ -0,0 +1,49 @@
+package com.dar.nbook.api.response;
+
+public class Meta{
+	private int totalItems;
+	private int itemsPerPage;
+	private int totalPages;
+	private int currentPage;
+	private int itemCount;
+
+	public void setTotalItems(int totalItems){
+		this.totalItems = totalItems;
+	}
+
+	public int getTotalItems(){
+		return totalItems;
+	}
+
+	public void setItemsPerPage(int itemsPerPage){
+		this.itemsPerPage = itemsPerPage;
+	}
+
+	public int getItemsPerPage(){
+		return itemsPerPage;
+	}
+
+	public void setTotalPages(int totalPages){
+		this.totalPages = totalPages;
+	}
+
+	public int getTotalPages(){
+		return totalPages;
+	}
+
+	public void setCurrentPage(int currentPage){
+		this.currentPage = currentPage;
+	}
+
+	public int getCurrentPage(){
+		return currentPage;
+	}
+
+	public void setItemCount(int itemCount){
+		this.itemCount = itemCount;
+	}
+
+	public int getItemCount(){
+		return itemCount;
+	}
+}

+ 10 - 0
app/src/main/java/com/dar/nbook/settings/Global.java

@@ -97,6 +97,16 @@ public class Global {
     private static Point screenSize;
     private static String userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:110.0) Gecko/20100101 Firefox/110.0";
 
+    private static boolean review;
+
+    public static boolean isReview() {
+        return review;
+    }
+
+    public static void setReview(boolean review) {
+        Global.review = review;
+    }
+
     public static long recursiveSize(File path) {
         if (path.isFile()) return path.length();
         long size = 0;

+ 39 - 0
app/src/main/res/layout/activity_review.xml

@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    tools:context=".ReviewActivity">
+
+    <com.google.android.material.appbar.AppBarLayout
+        android:id="@+id/appBar"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent">
+
+        <androidx.appcompat.widget.Toolbar
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            app:title="@string/app_name" />
+    </com.google.android.material.appbar.AppBarLayout>
+
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/refresher"
+        android:layout_width="0dp"
+        android:layout_height="0dp"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/appBar">
+
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:clipToPadding="false" />
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+</androidx.constraintlayout.widget.ConstraintLayout>