Commit 86e06a30 by amateur

1

1 parent 1ff6b395
......@@ -5,37 +5,36 @@ import com.alibaba.fastjson.annotation.JSONField;
public class AdvertisementBean {
@JSONField(name = "picUrl")
String picUrl;
private String picUrl;
@JSONField(name = "linkUrl")
String linkUrl;
@JSONField(name = "insideUrl")
private String insideUrl;
@JSONField(name = "outsideUrl")
private String outsideUrl;
@JSONField(name = "linkType")
String linkType;
private String linkType;
@JSONField(name = "isShare")
int isShare;
private String isShare;
@JSONField(name = "isLogin")
int isLogin;
private String isLogin;
public String getPicUrl() {
return picUrl;
}
public String getLinkUrl() {
return linkUrl;
}
public String getLinkType() {
return linkType;
}
public int getIsShare() {
public String getIsShare() {
return isShare;
}
public int getIsLogin() {
public String getIsLogin() {
return isLogin;
}
......@@ -43,19 +42,31 @@ public class AdvertisementBean {
this.picUrl = picUrl;
}
public void setLinkUrl(String linkUrl) {
this.linkUrl = linkUrl;
}
public void setLinkType(String linkType) {
this.linkType = linkType;
}
public void setIsShare(int isShare) {
public void setIsShare(String isShare) {
this.isShare = isShare;
}
public void setIsLogin(int isLogin) {
public void setIsLogin(String isLogin) {
this.isLogin = isLogin;
}
public String getOutsideUrl() {
return outsideUrl;
}
public void setOutsideUrl(String outsideUrl) {
this.outsideUrl = outsideUrl;
}
public String getInsideUrl() {
return insideUrl;
}
public void setInsideUrl(String insideUrl) {
this.insideUrl = insideUrl;
}
}
......@@ -3,7 +3,7 @@ package com.polysoft.nafmii.fragment;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.util.Log;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
......@@ -15,22 +15,23 @@ import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.DrawableImageViewTarget;
import com.bumptech.glide.request.transition.Transition;
import com.polysoft.nafmii.bean.AdvertisementBean;
import com.polysoft.nafmii.utils.IntentUtils;
import com.polysoft.nafmii.viewmodel.AdvertisementViewModel;
import com.whaty.nafmii.R;
import com.whaty.nafmii.activity.AdvertisementWebviewActvity;
import com.whaty.nafmii.activity.IActivityEvent;
import com.whaty.nafmii.activity.TestHomeActivity;
public class AdvertisementFragment extends Fragment implements View.OnClickListener {
private final String TAG = AdvertisementFragment.class.getName();
private ImageView mImgView;
private TextView mCountDown;
private boolean finished = false;
private View mRootView;
public static AdvertisementFragment newInstance(String data) {
AdvertisementFragment fragment = new AdvertisementFragment();
......@@ -43,24 +44,25 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_advertisement, container, false);
if (null == this.mRootView) {
this.mRootView = inflater.inflate(R.layout.fragment_advertisement, container, false);
this.initView(this.mRootView);
} else {
((ViewGroup) this.mRootView.getParent()).removeView(this.mImgView);
}
return this.mRootView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
private void initView(View view) {
view.findViewById(R.id.advertisement_pass).setOnClickListener(this);
this.mImgView = view.findViewById(R.id.advertisement_imgview);
this.mCountDown = view.findViewById(R.id.advertisement_countdown);
this.mImgView.setOnClickListener(this);
// this.loadAdvertisementImage();
this.loadAdvertisementImageTest();
// this.loadAdvertisementImage();
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.advertisement_pass) {
......@@ -74,13 +76,13 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe
private void loadAdvertisementImage() {
String json = getArguments().getString("data");
JSONObject item = JSON.parseObject(json);
String id = item.getString("id");
String description = item.getString("description");
String picture = item.getString("picture");
String url = item.getString("url");
if (TextUtils.isEmpty(json)) {
this.dispatchActivityEvent();
return;
}
AdvertisementBean bean = JSON.parseObject(json, AdvertisementBean.class);
Glide.with(getContext()).load(picture).into(new DrawableImageViewTarget(this.mImgView) {
Glide.with(getContext()).load(bean.getPicUrl()).into(new DrawableImageViewTarget(this.mImgView) {
@Override
public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
super.onResourceReady(resource, transition);
......@@ -102,11 +104,12 @@ public class AdvertisementFragment extends Fragment implements View.OnClickListe
@Override
public void onTick(long millisUntilFinished) {
long second = millisUntilFinished / unit;
mCountDown.setText(String.format("%ds", second));
mCountDown.setText(String.format("%ds", (second + 1)));
}
@Override
public void onFinish() {
this.cancel();
dispatchActivityEvent();
}
}.start();
......
......@@ -162,14 +162,14 @@ public class OkhttpApi {
Request request = chain.request();
Buffer buffer = new Buffer();
request.body().writeTo(buffer);
buffer.close();
Log.d(TAG, String.format("request:{%n url:%s,%n headers:{%n%s},%n body:%s%n}", request.url(), request.headers(), buffer.readUtf8()));
Response response = chain.proceed(request);
ResponseBody resBody = response.body();
String bodyStr = resBody.string();
long endTime = System.nanoTime();
Log.d(TAG, String.format("response:{%n url:%s,%n headers:{%n%s},%n time:%.1fms,%n body:%s%n ",
response.request().url(), response.headers(), (endTime - startTime) / 1e6d, bodyStr));
Log.d(TAG, String.format("response:{%n url:%s,%n time:%.1fms,%n req:%s,%n res:%s%n ",
response.request().url(), (endTime - startTime) / 1e6d, buffer.readUtf8(), bodyStr));
return response.newBuilder().body(ResponseBody.Companion.create(bodyStr, resBody.contentType())).build();
}
......
......@@ -58,7 +58,7 @@ public abstract class RequestBack<T> {
JSONObject data = res.getJSONObject("data");
this.onResponse(StateEnum.OK, (T) data, null);
} else {
T data = JSON.parseObject(json, type);
T data = JSON.parseObject(json, arguments[0]);
this.onResponse(StateEnum.OK, data, null);
}
} else {
......
......@@ -5,7 +5,7 @@ import android.os.Handler;
public class TimerUtils {
public static void setTimeOut(Handler.Callback callback, long millisInFuture) {
public static void setTimeout(TimerFinishBack back, long millisInFuture) {
new CountDownTimer(millisInFuture, 1000) {
@Override
public void onTick(long millisUntilFinished) {
......@@ -13,8 +13,32 @@ public class TimerUtils {
@Override
public void onFinish() {
callback.handleMessage(null);
this.cancel();
back.onFinish();
}
}.start();
}
public static void setTimeout(TimerTickBack back, long millisInFuture) {
new CountDownTimer(millisInFuture, 1000) {
@Override
public void onTick(long millisUntilFinished) {
if (back.onTick(millisUntilFinished)) {
this.cancel();
}
}
@Override
public void onFinish() {
}
}.start();
}
public interface TimerFinishBack {
void onFinish();
}
public interface TimerTickBack {
boolean onTick(long millisUntilFinished);
}
}
package com.polysoft.nafmii.viewmodel;
import android.app.Activity;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModel;
import androidx.lifecycle.ViewModelProvider;
import androidx.lifecycle.ViewModelStoreOwner;
import com.polysoft.nafmii.bean.AdvertisementBean;
import com.polysoft.nafmii.constants.ServerApi;
import com.polysoft.nafmii.database.ObjectBox;
import com.polysoft.nafmii.database.entity.DataEntity;
import com.polysoft.nafmii.enums.StateEnum;
import com.polysoft.nafmii.net.RequestBack;
import com.polysoft.nafmii.utils.TimerUtils;
......@@ -22,8 +20,10 @@ import com.whaty.nafmii.BuildConfig;
public class AdvertisementViewModel extends ViewModel {
private MutableLiveData<LiveData> dataModel = new MutableLiveData<>();
private final MutableLiveData<LiveData> dataModel = new MutableLiveData<>();
private final LifecycleOwner owner;
private final String DB_KEY = "advertisement";
private boolean isSetModelValue = false;
public static AdvertisementViewModel newInstance(FragmentActivity owner) {
ViewModelProvider.Factory factory = new ViewModelProvider.Factory() {
......@@ -46,25 +46,36 @@ public class AdvertisementViewModel extends ViewModel {
this.dataModel.observe(this.owner, observer);
}
private void fetchData() {
ServerApi.postAdvertisement(new RequestBack<AdvertisementBean>() {
TimerUtils.setTimeout(() -> {
DataEntity entity = ObjectBox.findByName(DB_KEY);
this.postModelValue(null == entity ? null : entity.getValue());
}, 2000);
ServerApi.postAdvertisement(new RequestBack<String>() {
@Override
protected void onResponse(StateEnum state, AdvertisementBean data, String message) {
protected void onResponse(StateEnum state, String data, String message) {
if (state.state == StateEnum.OK.state) {
dataModel.setValue(new LiveData(data));
postModelValue(data);
ObjectBox.put(new DataEntity(DB_KEY, data));
} else {
dataModel.setValue(new LiveData(null));
postModelValue(null);
}
}
});
}
private synchronized void postModelValue(String value) {
if (!this.isSetModelValue) {
this.isSetModelValue = true;
this.dataModel.postValue(new LiveData(value));
}
}
public static class LiveData {
public final AdvertisementBean data;
public final String data;
LiveData(AdvertisementBean data) {
LiveData(String data) {
this.data = data;
}
......@@ -72,7 +83,7 @@ public class AdvertisementViewModel extends ViewModel {
if (BuildConfig.DEBUG) {
return false;
}
return null == this.data || TextUtils.isEmpty(this.data.getPicUrl());
return TextUtils.isEmpty(data);
}
}
......
......@@ -11,6 +11,7 @@ import androidx.fragment.app.FragmentTransaction;
import com.polysoft.nafmii.utils.StatusBarUtils;
import com.polysoft.nafmii.utils.ToastUtils;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
......@@ -74,6 +75,24 @@ public class BaseActivity extends AppCompatActivity implements IActivityEvent {
return super.getSupportFragmentManager().findFragmentByTag(tag);
}
public List<Fragment> getFragments() {
return super.getSupportFragmentManager().getFragments();
}
public boolean isFragmentExists(Class<? extends Fragment> c) {
List<Fragment> fragments = this.getFragments();
for (Fragment fragment : fragments) {
if (fragment.getClass().getName().equals(c.getName())) {
return true;
}
}
return false;
}
public boolean isFragmentExists(String fragmentKey) {
return null != this.findFragmentTag(fragmentKey);
}
@Override
public void dispatchEvent(String event) {
......
package com.whaty.nafmii.activity;
import android.Manifest;
import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.annotation.NonNull;
......@@ -23,6 +22,7 @@ import com.whaty.nafmii.R;
public class MainActivity extends BaseActivity {
private AdvertisementViewModel.LiveData mAdvertisementData;
private final String FIRST_RUN_KEY = getFirstRunKey();
@Override
protected void onCreate(Bundle savedInstanceState) {
......@@ -46,7 +46,7 @@ public class MainActivity extends BaseActivity {
@Override
public void dispatchEvent(String event) {
if (IActivityEvent.EVENT_GUIDE.equals(event)) {
SpUtils.putBoolean(getFirstRunKey(), true);
SpUtils.putBoolean(FIRST_RUN_KEY, true);
IntentUtils.startActivity(this, TestHomeActivity.class);
} else if (IActivityEvent.EVENT_ADVERTISEMENT.equals(event)) {
IntentUtils.startActivity(this, TestHomeActivity.class);
......@@ -65,9 +65,8 @@ public class MainActivity extends BaseActivity {
// 必要读写权限申请失败
if (!PermissionUtils.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ToastUtils.showLong("请授权APP必要运行权限");
TimerUtils.setTimeOut(msg -> {
TimerUtils.setTimeout(() -> {
PermissionUtils.toAppSetting(MainActivity.this);
return false;
}, 2000);
return false;
}
......@@ -75,32 +74,42 @@ public class MainActivity extends BaseActivity {
}
private void showLayout() {
AdvertisementViewModel.newInstance(this).observe(data -> this.mAdvertisementData = data);
AdvertisementViewModel.newInstance(this).observe(data -> {
this.mAdvertisementData = data;
this.showAdvertisement();
});
// 延时2秒获取广告数据
TimerUtils.setTimeOut(msg -> {
if (!SpUtils.getBoolean(this.getFirstRunKey(), false)) {
TimerUtils.setTimeout(() -> {
if (!this.isFirstRun()) {
FragmentTransaction transaction = super.newFragmentTransaction();
transaction.replace(R.id.main_framelayout, GuideFragment.newInstance()).commit();
} else {
this.showAdvertisement();
}
return false;
}, 2000);
}
private synchronized void showAdvertisement() {
if (null == this.mAdvertisementData || this.mAdvertisementData.empty()) {
boolean isReturn = null == this.mAdvertisementData || !this.isFirstRun();
if (isReturn || super.isFragmentExists(AdvertisementFragment.class)) {
return;
}
if (this.mAdvertisementData.empty()) {
this.dispatchEvent(IActivityEvent.EVENT_ADVERTISEMENT);
return;
}
FragmentTransaction transaction = super.newFragmentTransaction();
Fragment fragment = AdvertisementFragment.newInstance("");
Fragment fragment = AdvertisementFragment.newInstance(this.mAdvertisementData.data);
transaction.replace(R.id.main_framelayout, fragment).commit();
}
@SuppressLint("DefaultLocale")
private String getFirstRunKey() {
private boolean isFirstRun() {
return SpUtils.getBoolean(FIRST_RUN_KEY, false);
}
private static String getFirstRunKey() {
int versionCode = CtxUtils.getPackageInfo().versionCode;
return String.format("ISFIRSTRUN_%d", versionCode);
}
......
<?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"
android:background="@color/white">
<FrameLayout
android:id="@+id/advertisement_framelayout"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".fragment.AdvertisementFragment">
tools:context="com.polysoft.nafmii.fragment.AdvertisementFragment">
<ImageView
android:id="@+id/advertisement_imgview"
......@@ -16,25 +16,34 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/advertisement_pass"
android:layout_width="80dp"
android:layout_height="30dp"
android:layout_marginTop="50dp"
android:layout_marginRight="20dp"
android:background="@mipmap/advertisement_pass"
android:gravity="center"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/advertisement_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5s"
android:textSize="20sp"
app:layout_constraintBottom_toBottomOf="@+id/advertisement_pass"
app:layout_constraintEnd_toStartOf="@+id/advertisement_pass"
app:layout_constraintTop_toTopOf="@+id/advertisement_pass" />
android:text="跳过"
android:textColor="@color/white"
android:textSize="18sp" />
<TextView
android:id="@+id/advertisement_pass"
android:id="@+id/advertisement_countdown"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:layout_marginRight="40dp"
android:padding="20dp"
android:text="跳过"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:layout_marginLeft="5dp"
android:text="5s"
android:textColor="@color/white"
android:textSize="18sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
......@@ -3,17 +3,16 @@
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=".fragment.WebViewFragment">
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/webview_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:orientation="vertical"></LinearLayout>
app:layout_constraintTop_toTopOf="parent"></LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:fitsSystemWindows="false"
android:gravity="center">
<TextView
android:id="@+id/test_fragment_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="首页"
android:textSize="30sp" />
</LinearLayout>
\ No newline at end of file

1.7 KB | W: | H:

796 Bytes | W: | H:

app/src/main/res/mipmap-mdpi/advertisement_pass.png
app/src/main/res/mipmap-mdpi/advertisement_pass.png
app/src/main/res/mipmap-mdpi/advertisement_pass.png
app/src/main/res/mipmap-mdpi/advertisement_pass.png
  • 2-up
  • Swipe
  • Onion skin
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!