Commit b7526533 authored by 张释方's avatar 张释方

代码合并

parents 39843456 53cf96d8
*.iml *.iml
.gradle .gradle
/local.properties /local.properties
/.idea/caches /.idea
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
/.idea/navEditor.xml
/.idea/vcs.xml
/.idea/assetWizardSettings.xml
.DS_Store .DS_Store
/build /build
/captures /captures
.externalNativeBuild .externalNativeBuild
.cxx .cxx
/.idea/shelf/
/library_ad/build/ /library_ad/build/
/shareSdkLib/build/
...@@ -15,11 +15,20 @@ android { ...@@ -15,11 +15,20 @@ android {
versionCode rootProject.ext.android.versionCode versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName versionName rootProject.ext.android.versionName
//flavorDimensions "default" flavorDimensions "default"
//多个dex //多个dex
multiDexEnabled true multiDexEnabled true
//配置so文件
ndk {
abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
}
manifestPlaceholders = [CHANNEL_NAME_VALUE: "street",
UMENG_KEY : RELEASE_UMENG_KEY,
SHARE_KEY : RELEASE_SHARESDK_KEY,
SHARE_SECRET : RELEASE_SHARESDK_SECRET]
} }
buildFeatures{ buildFeatures{
...@@ -33,40 +42,102 @@ android { ...@@ -33,40 +42,102 @@ android {
targetCompatibility rootProject.ext.java_version["targetJavaVersion"] targetCompatibility rootProject.ext.java_version["targetJavaVersion"]
} }
// buildTypes { signingConfigs {
// debug { debug {
// storeFile file(RELEASE_STORE_FILE)
// storePassword RELEASE_STORE_PASSWORD
// //混淆 keyAlias RELEASE_KEY_ALIAS
// minifyEnabled false keyPassword RELEASE_KEY_PASSWORD
// zipAlignEnabled false }
// shrinkResources false//打开
// release {
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' storeFile file(RELEASE_STORE_FILE)
// } storePassword RELEASE_STORE_PASSWORD
// release { keyAlias RELEASE_KEY_ALIAS
// keyPassword RELEASE_KEY_PASSWORD
// //混淆 }
// minifyEnabled true }
// zipAlignEnabled true
// shrinkResources true buildTypes {
// //signingConfig signingConfigs.release
// proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' debug {
// } // 不显示Log
// } buildConfigField "boolean", "LOG_DEBUG", "true"
buildConfigField "String", "AppKeyPre", "\"abcd\""
buildConfigField "String", "MainIp", DEBUG_URL
//混淆
minifyEnabled false
zipAlignEnabled false
shrinkResources false//打开
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.debug
}
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
buildConfigField "String", "AppKeyPre", "\"abcd\""
buildConfigField "String", "MainIp", RELEASE_URL
//混淆
minifyEnabled true
zipAlignEnabled true
shrinkResources true//打开
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
lintOptions {
//lint 遇到 error 时继续 构建
//abortOnError false
//build release 版本 时 开启lint 检测
checkReleaseBuilds false
// 防止在发布的时候出现因MissingTranslation导致Build Failed!
disable 'MissingTranslation'
}
productFlavors {
streetpkg {}
toutiao {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CHANNEL_NAME_VALUE: name]
}
// 自定义输出配置
applicationVariants.all { variant ->
variant.outputs.all { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
outputFileName = "${variant.productFlavors[0].name}_${defaultConfig.versionName}.apk"
}
}
}
repositories {
flatDir {
dirs 'libs'
}
}
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
} }
dependencies { dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"]) implementation fileTree(include: ['*.jar'], dir: 'libs')
testImplementation rootProject.ext.support["junit"] testImplementation rootProject.ext.support["junit"]
// implementation 'androidx.appcompat:appcompat:1.1.0'
// implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
// testImplementation 'junit:junit:4.12'
// androidTestImplementation 'androidx.test.ext:junit:1.1.1'
// androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
//下拉刷新 //下拉刷新
implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-26' implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-26'
implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-26' implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.0-alpha-26'
...@@ -83,8 +154,6 @@ dependencies { ...@@ -83,8 +154,6 @@ dependencies {
// 三方接入 // 三方接入
// bugly
implementation 'com.tencent.bugly:crashreport:3.3.92'
// 移动安全联盟 // 移动安全联盟
implementation(name: 'oaid_sdk_1.0.23', ext: 'aar') implementation(name: 'oaid_sdk_1.0.23', ext: 'aar')
// shareSdk // shareSdk
...@@ -105,4 +174,5 @@ dependencies { ...@@ -105,4 +174,5 @@ dependencies {
implementation(name: 'open_ad_sdk_3.7.0.1', ext: 'aar') implementation(name: 'open_ad_sdk_3.7.0.1', ext: 'aar')
// 广点通广告 腾讯 // 广点通广告 腾讯
implementation(name: 'GDTSDK.unionNormal.4.362.1232', ext: 'aar') implementation(name: 'GDTSDK.unionNormal.4.362.1232', ext: 'aar')
} }
\ No newline at end of file
This diff is collapsed.
...@@ -7,6 +7,13 @@ ...@@ -7,6 +7,13 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<application <application
android:name="com.mints.street.AppApplication" android:name="com.mints.street.AppApplication"
...@@ -19,7 +26,36 @@ ...@@ -19,7 +26,36 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"> android:usesCleartextTraffic="true">
<activity android:name="com.mints.street.main.MainActivity">
<uses-library
android:name="org.apache.http.legacy"
android:required="false" /> <!-- 适配小米(xiaomi)刘海屏 -->
<meta-data
android:name="android.max_aspect"
android:value="2.4"
tools:replace="android:value" />
<meta-data
android:name="android.notch_support"
android:value="true" />
<meta-data
android:name="notch.config"
android:value="portrait|landscape" /> <!-- 渠道名称 -->
<meta-data
android:name="CHANNEL_NAME"
android:value="${CHANNEL_NAME_VALUE}" /> <!-- 友盟 -->
<meta-data
android:name="UMENG_KEY"
android:value="${UMENG_KEY}" /> <!-- ShareSDK -->
<meta-data
android:name="Mob-AppKey"
android:value="${SHARE_KEY}" />
<meta-data
android:name="Mob-AppSecret"
android:value="${SHARE_SECRET}" />
<activity android:name="com.mints.street.splash.SplashActivity"
android:excludeFromRecents="true"
android:theme="@style/NormalSplash">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />
...@@ -29,7 +65,11 @@ ...@@ -29,7 +65,11 @@
<activity android:name="com.mints.street.login.LoginActivity"> <activity android:name="com.mints.street.login.LoginActivity">
</activity> </activity>
<activity android:name="com.mints.street.splash.SplashActivity"> <activity android:name="com.mints.street.main.MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="true"
android:launchMode="singleTask"
android:theme="@style/AppTheme.NoneTranslucent">
</activity> </activity>
...@@ -58,11 +98,11 @@ ...@@ -58,11 +98,11 @@
</provider> <!-- 穿山甲广告 --> </provider> <!-- 穿山甲广告 -->
<provider <provider
android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider" android:name="com.bytedance.sdk.openadsdk.multipro.TTMultiProvider"
android:authorities="${applicationId}.TTMultiProvider" android:authorities="com.mints.street.TTMultiProvider"
android:exported="false" /> android:exported="false" />
<provider <provider
android:name="com.bytedance.sdk.openadsdk.TTFileProvider" android:name="com.bytedance.sdk.openadsdk.TTFileProvider"
android:authorities="${applicationId}.TTFileProvider" android:authorities="com.mints.street.TTFileProvider"
android:exported="false" android:exported="false"
android:grantUriPermissions="true" android:grantUriPermissions="true"
tools:replace="android:authorities"> tools:replace="android:authorities">
...@@ -70,7 +110,8 @@ ...@@ -70,7 +110,8 @@
android:name="android.support.FILE_PROVIDER_PATHS" android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" android:resource="@xml/file_paths"
tools:replace="android:resource" /> tools:replace="android:resource" />
</provider> <!-- 广点通广告 --> </provider>
<!-- 广点通广告 -->
<uses-library <uses-library
android:name="org.apache.http.legacy" android:name="org.apache.http.legacy"
android:required="false" /> android:required="false" />
......
package com.mints.street package com.mints.street
import android.content.Context
import android.os.StrictMode import android.os.StrictMode
import android.os.StrictMode.VmPolicy import android.os.StrictMode.VmPolicy
import android.util.Log import android.util.Log
import com.fry.base.base.BaseApp import com.fry.base.base.BaseApp
import com.mints.street.manager.CsjGroMoreManager
import com.mints.street.manager.UmengManager
import java.util.concurrent.TimeoutException import java.util.concurrent.TimeoutException
/** /**
* Created by 冯瑞雨 on 2021/7/1. * Created by 冯瑞雨 on 2021/7/1.
*/ */
class AppApplication :BaseApp() { class AppApplication : BaseApp() {
override fun onCreate() { override fun onCreate() {
super.onCreate() super.onCreate()
mContext = this
thirdConfig()
val builder = VmPolicy.Builder() val builder = VmPolicy.Builder()
StrictMode.setVmPolicy(builder.build()) StrictMode.setVmPolicy(builder.build())
builder.detectFileUriExposure() builder.detectFileUriExposure()
...@@ -28,5 +35,23 @@ class AppApplication :BaseApp() { ...@@ -28,5 +35,23 @@ class AppApplication :BaseApp() {
} }
} }
/*
* 三方配置
*/
private fun thirdConfig() {
UmengManager.preInit()
// GroMore
CsjGroMoreManager.init(this)
}
companion object {
var mContext: AppApplication? = null
fun getContext(): AppApplication? {
return mContext
}
}
} }
\ No newline at end of file
package com.mints.street.ad;
import android.app.Activity;
import android.content.Context;
import android.provider.Settings;
import com.bytedance.msdk.api.TTAdConfig;
import com.bytedance.msdk.api.TTAdConstant;
import com.bytedance.msdk.api.TTMediationAdSdk;
import com.bytedance.msdk.api.UserInfoForSegment;
import com.mints.street.common.Constant;
import com.mints.street.BuildConfig;
import com.mints.street.manager.CsjGroMoreManager;
import java.util.HashMap;
import java.util.Map;
/**
* 可以用一个单例来保存TTAdManager实例,在需要初始化sdk的时候调用
*/
public class TTGroMoreAdManagerHolder {
private static boolean sInit;
public static void init(Context context) {
doInit(context);
}
public static void initUnitySdkBanner(Activity activity) {
TTMediationAdSdk.initUnityForBanner(activity);
}
//step1:接入网盟广告sdk的初始化操作,详情见接入文档和穿山甲平台说明
private static void doInit(Context context) {
if (!sInit) {
TTMediationAdSdk.initialize(context, buildConfig(context));
sInit = true;
}
}
private static TTAdConfig buildConfig(Context context) {
UserInfoForSegment userInfo = new UserInfoForSegment();
Map<String, String> customInfos = new HashMap<>();
// customInfos.put("aaaa", "test111");
// customInfos.put("bbbb", "test222");
userInfo.setCustomInfos(customInfos);
return new TTAdConfig.Builder()
.appId(CsjGroMoreManager.TT_AD_APPID) //必填 ,不能为空
.appName(Constant.MINTS_APP_NAME) //必填,不能为空
.openAdnTest(false)//开启第三方ADN测试时需要设置为true,会每次重新拉去最新配置,release 包情况下必须关闭.默认false
.isPanglePaid(false)//是否为费用户
.setPublisherDid(getAndroidId(context)) //用户自定义device_id
.openDebugLog(BuildConfig.DEBUG) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
.usePangleTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
.setPangleTitleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK)
.allowPangleShowNotify(true) //是否允许sdk展示通知栏提示
.allowPangleShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页
.setPangleDirectDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合
.needPangleClearTaskReset()//特殊机型过滤,部分机型出现包解析失败问题(大部分是三星)。参数取android.os.Build.MODEL
.setUserInfoForSegment(userInfo) // 设置流量分组的信息
.build();
}
public static String getAndroidId(Context context) {
String androidId = null;
try {
androidId = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
} catch (Exception e) {
e.printStackTrace();
}
return androidId;
}
}
package com.mints.street.common
object Constant {
/**
* app名称
*/
const val MINTS_APP_NAME = "3D高清街景"
/**
* 应用包名
*/
const val MINTS_PKG_NAME = "com.mints.street"
}
This diff is collapsed.
package com.mints.street.manager
import com.mints.street.AppApplication
import com.mints.street.ad.TTGroMoreAdManagerHolder
/**
* 穿山甲GroMore
*/
object CsjGroMoreManager {
const val TT_AD_APPID = "12345"
var AD_UNIT_SPLASH_ID = "" // 开屏
// 穿山甲id
var AD_CSJ_SPLASH_ID = "" // 开屏
fun init(application: AppApplication) {
TTGroMoreAdManagerHolder.init(application)
}
}
\ No newline at end of file
package com.mints.street.manager
import com.umeng.analytics.MobclickAgent
import com.umeng.commonsdk.UMConfigure
import com.mints.street.BuildConfig
import com.mints.street.AppApplication
import com.mints.street.utils.CommonUtils
object UmengManager {
fun preInit(){
UMConfigure.preInit(AppApplication.getContext(), CommonUtils.getAppMetaData(AppApplication.getContext(), "UMENG_KEY"),
CommonUtils.getAppMetaData(AppApplication.getContext(), "CHANNEL_NAME"))
}
/**
* 友盟初始化
*/
fun initUm() {
try {
/*
* 参数4:设备类型,必须参数,传参数为UMConfigure.DEVICE_TYPE_PHONE则表示手机;传参数为UMConfigure.DEVICE_TYPE_BOX则表示盒子;默认为手机。
* 参数5:Push推送业务的secret,需要集成Push功能时必须传入Push的secret,否则传空。
*/
UMConfigure.init(
AppApplication.getContext(),
CommonUtils.getAppMetaData(AppApplication.getContext(), "UMENG_KEY"),
CommonUtils.getAppMetaData(AppApplication.getContext(), "CHANNEL_NAME"),
UMConfigure.DEVICE_TYPE_PHONE,
""
)
UMConfigure.setLogEnabled(BuildConfig.DEBUG)
MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.LEGACY_MANUAL)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
}
\ No newline at end of file
package com.mints.street.splash package com.mints.street.splash
import android.os.Bundle import android.os.Bundle
import android.widget.FrameLayout
import com.bytedance.msdk.adapter.pangle.PangleNetworkRequestInfo
import com.bytedance.msdk.api.AdError
import com.bytedance.msdk.api.AdSlot
import com.bytedance.msdk.api.TTNetworkRequestInfo
import com.bytedance.msdk.api.splash.TTSplashAd
import com.bytedance.msdk.api.splash.TTSplashAdListener
import com.bytedance.msdk.api.splash.TTSplashAdLoadCallback
import com.fry.base.base.BaseActivity import com.fry.base.base.BaseActivity
import com.mints.street.BR import com.mints.street.BR
import com.mints.street.R import com.mints.street.R
import com.mints.street.common.DeviceInfo
import com.mints.street.databinding.ActivitySplashBinding import com.mints.street.databinding.ActivitySplashBinding
import com.mints.street.main.MainActivity
import com.mints.street.manager.CsjGroMoreManager
/** /**
* Created by 冯瑞雨 on 2021/7/5. * 描述:gromore开屏页
* 优量汇开屏页 * 作者:孟崔广
* 时间:2021/7/9 13:39
*/ */
class SplashActivity:BaseActivity<ActivitySplashBinding,SplashViewModel>() { class SplashActivity:BaseActivity<ActivitySplashBinding,SplashViewModel>() {
private var mSplashContainer: FrameLayout? = null
private var mTTSplashAd: TTSplashAd? = null
private val AD_TIME_OUT = 3000
private var onPaused = false
//是否强制跳转到主页面
private var mForceGoMain = false
override fun initContentView(savedInstanceState: Bundle?) = R.layout.activity_splash override fun initContentView(savedInstanceState: Bundle?) = R.layout.activity_splash
override fun initVariableId() = BR.viewModel override fun initVariableId() = BR.viewModel
...@@ -27,10 +47,123 @@ class SplashActivity:BaseActivity<ActivitySplashBinding,SplashViewModel>() { ...@@ -27,10 +47,123 @@ class SplashActivity:BaseActivity<ActivitySplashBinding,SplashViewModel>() {
checkAppSign() checkAppSign()
} }
override fun onResume() {
//判断是否该跳转到主页面
if (mForceGoMain) {
goToMainActivity()
}
if (onPaused ) {
// 这种情况下,百度开屏广告不能在onAdDismiss中跳转,需要自己在onResume中跳转主页。
goToMainActivity()
}
super.onResume()
}
override fun onPause() {
super.onPause()
onPaused = true
}
override fun onStop() {
super.onStop()
mForceGoMain = true
}
override fun onDestroy() {
super.onDestroy()
mTTSplashAd?.destroy()
mTTSplashAd=null
mSplashContainer?.removeAllViews()
mSplashContainer=null
}
/** /**
* 校验App签名 * 校验App签名
*/ */
private fun checkAppSign() { private fun checkAppSign() {
val deviceInfo: DeviceInfo = DeviceInfo.instance
if (!deviceInfo.signInfo) {
finish()
} else {
try {
mSplashContainer = findViewById(R.id.splash_container)
//加载开屏广告
loadSplashAd()
} catch (e: Exception) {
goToMainActivity()
}
}
}
/**
* 加载开屏广告
*/
private fun loadSplashAd() {
/**
* 注:每次加载开屏广告的时候需要新建一个TTSplashAd,否则可能会出现广告填充问题
* ( 例如:mTTSplashAd = new TTSplashAd(this, mAdUnitId);)
*/
mTTSplashAd = TTSplashAd(this, CsjGroMoreManager.AD_UNIT_SPLASH_ID)
mTTSplashAd?.setTTAdSplashListener(mSplashAdListener)
//step3:创建开屏广告请求参数AdSlot,具体参数含义参考文档
val adSlot = AdSlot.Builder()
.setImageAdSize(1080, 1920) // 既适用于原生类型,也适用于模版类型。
.build()
//自定义兜底方案 选择使用
val ttNetworkRequestInfo: TTNetworkRequestInfo
//穿山甲兜底
ttNetworkRequestInfo = PangleNetworkRequestInfo(CsjGroMoreManager.TT_AD_APPID,CsjGroMoreManager.AD_CSJ_SPLASH_ID)
//step4:请求广告,调用开屏广告异步请求接口,对请求回调的广告作渲染处理
mTTSplashAd?.loadAd(adSlot, ttNetworkRequestInfo, object : TTSplashAdLoadCallback {
// mTTSplashAd.loadAd(adSlot, new TTSplashAdLoadCallback() {
override fun onSplashAdLoadFail(adError: AdError) {
goToMainActivity()
}
override fun onSplashAdLoadSuccess() {
if (mTTSplashAd != null) {
mTTSplashAd!!.showAd(mSplashContainer)
}
}
override fun onAdLoadTimeout() {
goToMainActivity()
}
}, AD_TIME_OUT)
}
var mSplashAdListener: TTSplashAdListener = object : TTSplashAdListener {
override fun onAdClicked() {
}
override fun onAdShow() {
}
override fun onAdSkip() {
goToMainActivity()
}
override fun onAdDismiss() {
if (onPaused) {
// 这种情况下,百度开屏广告不能在onAdDismiss中跳转,需要在onResume中跳转主页。
return
}
goToMainActivity()
}
}
/**
* 跳转到主页面
*/
private fun goToMainActivity() {
startActivityThenKill(MainActivity::class.java)
} }
} }
\ No newline at end of file
/*
* Copyright (c) 2015 [1076559197@qq.com | tchen0707@gmail.com]
*
* Licensed under the Apache License, Version 2.0 (the "License”);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mints.street.utils;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.res.TypedArray;
import android.text.InputFilter;
import android.text.Spanned;
import android.text.TextUtils;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 描述:CommonUtils
* 作者:孟崔广
* 时间:2018/1/10 17:51
* 邮箱:mengcga@163.com
*/
public class CommonUtils {
/**
* return if str is empty
*
* @param str
* @return
*/
public static boolean isEmpty(String str) {
if (str == null || str.length() == 0 || str.equalsIgnoreCase("null") || str.isEmpty() || str.equals("")) {
return true;
} else {
return false;
}
}
/**
* decode Unicode string
*
* @param s
* @return
*/
public static String decodeUnicodeStr(String s) {
StringBuilder sb = new StringBuilder(s.length());
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c == '\\' && chars[i + 1] == 'u') {
char cc = 0;
for (int j = 0; j < 4; j++) {
char ch = Character.toLowerCase(chars[i + 2 + j]);
if ('0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f') {
cc |= (Character.digit(ch, 16) << (3 - j) * 4);
} else {
cc = 0;
break;
}
}
if (cc > 0) {
i += 5;
sb.append(cc);
continue;
}
}
sb.append(c);
}
return sb.toString();
}
/**
* encode Unicode string
*
* @param s
* @return
*/
public static String encodeUnicodeStr(String s) {
StringBuilder sb = new StringBuilder(s.length() * 3);
for (char c : s.toCharArray()) {
if (c < 256) {
sb.append(c);
} else {
sb.append("\\u");
sb.append(Character.forDigit((c >>> 12) & 0xf, 16));
sb.append(Character.forDigit((c >>> 8) & 0xf, 16));
sb.append(Character.forDigit((c >>> 4) & 0xf, 16));
sb.append(Character.forDigit((c) & 0xf, 16));
}
}
return sb.toString();
}
/**
* convert time str
*
* @param time
* @return
*/
public static String convertTime(int time) {
time /= 1000;
int minute = time / 60;
int second = time % 60;
minute %= 60;
return String.format("%02d:%02d", minute, second);
}
/**
* url is usable
*
* @param url
* @return
*/
public static boolean isUrlUsable(String url) {
URL urlTemp = null;
HttpURLConnection connt = null;
try {
urlTemp = new URL(url);
connt = (HttpURLConnection) urlTemp.openConnection();
connt.setRequestMethod("HEAD");
int returnCode = connt.getResponseCode();
if (returnCode == HttpURLConnection.HTTP_OK) {
return true;
}
} catch (Exception e) {
return false;
} finally {
if (connt != null) {
connt.disconnect();
}
}
return false;
}
/**
* is url
*
* @param url
* @return
*/
public static boolean isUrl(String url) {
Pattern pattern = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~\\/])+$");
return pattern.matcher(url).matches();
}
/**
* get toolbar height
*
* @param context
* @return
*/
public static int getToolbarHeight(Context context) {
final TypedArray styledAttributes = context.getTheme().obtainStyledAttributes(
new int[]{android.R.attr.actionBarSize});
int toolbarHeight = (int) styledAttributes.getDimension(0, 0);
styledAttributes.recycle();
return toolbarHeight;
}
/**
* Using regular expressions
*
* @param regular
* @param value
* @return
*/
public static boolean getConformToRegular(String regular, String value) {
boolean flag = false;
if (!TextUtils.isEmpty(regular) && !TextUtils.isEmpty(value)) {
Pattern p = Pattern.compile(regular);
Matcher m = p.matcher(value);
flag = m.matches();
}
return flag;
}
/**
* 禁止输入emoji
*/
public static InputFilter emojiFilter = new InputFilter() {
Pattern emoji = Pattern.compile(
"[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]",
Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest,
int dstart,
int dend) {
Matcher emojiMatcher = emoji.matcher(source);
if (emojiMatcher.find()) {
return "";
}
return null;
}
};
/**
* 获取application中指定的meta-data
*
* @return 如果没有获取成功(没有对应值 , 或者异常),则返回值为空
*/
public static String getAppMetaData(Context ctx, String key) {
if (ctx == null || TextUtils.isEmpty(key)) {
return null;
}
String resultData = null;
try {
PackageManager packageManager = ctx.getPackageManager();
if (packageManager != null) {
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
if (applicationInfo != null) {
if (applicationInfo.metaData != null) {
resultData = applicationInfo.metaData.getString(key);
}
}
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
return "";
}
return resultData;
}
public static String formatString(String str) {
if (str.contains(".")) {
String[] array = str.split("\\.");
String str0 = array[0];
String str1 = array[1];
if (str0.length() <= 3) {
return str0 + "." + str1;
} else {
return formatString(str0.substring(0, str0.length() - 3)) + ',' + str0.substring(str0.length() - 3) + "." + str1;
}
} else {
if (str.length() <= 3) {
return str;
} else {
return formatString(str.substring(0, str.length() - 3)) + ',' + str.substring(str.length() - 3);
}
}
}
}
package com.mints.street.utils;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.core.app.ActivityCompat;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* Desction:授权工具类
* Author:孟崔广
*/
public class PermissionUtils {
public static final int CODE_PERMISSIONS = 123;
public interface PermissionGrant {
/**
* 处理结果
*
* @param requestCode 请求码
* @param permissions 本次授权权限列表
* @param grantResults 本次授权结果,0:授权成功 -1:拒绝授权
* @param requestPermissions 请求所有权限
*/
void onPermissionGranted(final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults, String[] requestPermissions);
}
private static void showMessageOKCancel(final Activity context, String message, DialogInterface.OnClickListener okListener, DialogInterface.OnClickListener cancelListener) {
new AlertDialog.Builder(context)
.setMessage(message)
.setPositiveButton("是", okListener)
.setNegativeButton("否", cancelListener)
.create()
.show();
}
/**
* 跳转到系统设置界面去开启权限
*
* @param activity
* @param message
*/
private static void openSettingActivity(final Activity activity, String message) {
showMessageOKCancel(activity, message, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", activity.getPackageName(), null);
intent.setData(uri);
activity.startActivity(intent);
}
}, null);
}
/////////////////////////////////执行授权/////////////////////////////////////
/**
* 一次申请多个权限
*
* @param activity
* @param grant
*/
public static void requestMultiPermissions(final Activity activity, final String[] requestPermissions, final PermissionGrant grant) {
//获取没有授权的权限
final List<String> permissionsList = getNoGrantedPermission(activity, requestPermissions, false);
//获取上次被拒权限列表
final List<String> shouldRationalePermissionsList = getNoGrantedPermission(activity, requestPermissions, true);
if (permissionsList == null || shouldRationalePermissionsList == null) {
return;
}
final int[] grantResults = new int[requestPermissions.length];
if (permissionsList.size() > 0) {//去授权
ActivityCompat.requestPermissions(activity, permissionsList.toArray(new String[permissionsList.size()]), CODE_PERMISSIONS);
} else if (shouldRationalePermissionsList.size() > 0) {
showMessageOKCancel(activity, "应用缺少权限,是否重新去授权?",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions(activity, shouldRationalePermissionsList.toArray(new String[shouldRationalePermissionsList.size()]),
CODE_PERMISSIONS);
}
}, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
grant.onPermissionGranted(CODE_PERMISSIONS, requestPermissions, grantResults, requestPermissions);
}
});
} else {
grant.onPermissionGranted(CODE_PERMISSIONS, requestPermissions, grantResults, requestPermissions);
}
}
private static ArrayList<String> getNoGrantedPermission(Activity activity, String[] requestPermissions, boolean isShouldRationale) {
ArrayList<String> permissions = new ArrayList<>();
for (int i = 0; i < requestPermissions.length; i++) {
String requestPermission = requestPermissions[i];
int checkSelfPermission = -1;
try {
checkSelfPermission = ActivityCompat.checkSelfPermission(activity, requestPermission);
} catch (RuntimeException e) {
return null;
}
if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, requestPermission)) {
if (isShouldRationale) {
permissions.add(requestPermission);
}
} else {
if (!isShouldRationale) {
permissions.add(requestPermission);
}
}
}
}
return permissions;
}
/////////////////////////////////处理授权结果/////////////////////////////////////
/**
* 处理授权
*
* @param requestCode Need consistent with requestPermission
* @param permissions
* @param grantResults
*/
public static void requestPermissionsResult(final int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults, String[] requestPermissions, PermissionGrant permissionGrant) {
if (requestCode == CODE_PERMISSIONS) {
permissionGrant.onPermissionGranted(requestCode, permissions, grantResults, requestPermissions);
return;
}
}
/////////////////////////////////处理授权结果/////////////////////////////////////
public static boolean checkPermission(Context paramContext, String paramString) {
boolean bool = false;
if (paramContext == null) {
return false;
} else {
if (Build.VERSION.SDK_INT >= 23) {
try {
Class localClass = Class.forName("android.content.Context");
Method localMethod = localClass.getMethod("checkSelfPermission", String.class);
int i = (Integer)localMethod.invoke(paramContext, paramString);
bool = i == 0;
} catch (Throwable var6) {
bool = false;
}
} else {
PackageManager localPackageManager = paramContext.getPackageManager();
if (localPackageManager.checkPermission(paramString, paramContext.getPackageName()) == 0) {
bool = true;
}
}
return bool;
}
}
}
This diff is collapsed.
This diff is collapsed.
package com.mints.street.utils
import android.app.ActivityManager
import android.content.Context
import android.os.Environment
import android.os.StatFs
import java.io.BufferedReader
import java.io.File
import java.io.FileReader
import java.io.IOException
import kotlin.math.ceil
object SystemUtils {
/**
* 该方法必须在Activity或Service类内调用,一般情况下,可以在Activity的onCreate()方法中调用。
* 由于应用每启动一个新的进程,就会调用一次Application的onCreate()方法,而个推SDK是一个独立的进程
* ,因此如果在Application的onCreate()中调用intialize接口,会导致SDK初始化在一个应用中多次调用,
* 所以不建议在Application继承类中调用个推SDK初始化接口。
* 解释一下,每个[Android](http://lib.csdn.net/base/android "Android知识库")应用都要运行在一个虚拟机上,
* ”个推“采用Service和后台服务器通信进行通信,于是和原本的Activity就形成了多进程。
* 一个前台的应用进程,一个service后台进程,每个进程对应一个application对象,所以当应用配置了多个进程的时候,
* application对象的onCreate方法就会执行多次,所以为了保证只初始化一次,
* 就必须做出区分的处理的(“个推”中提到的在Activity或Service中初始,这种做法个人认为也是存在多次初始化的风险的);
* 进程名是通过Manifest.xml中的"android:process"属性设置的,因此可以在application的onCreate方法中通过pid获取processName,
* 再做进一步的判断(跟android:process的值进行判断)使得相关初始化代码仅执行一次。
*/
fun getProcessName(cxt: Context, pid: Int): String? {
val am: ActivityManager = cxt.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningApps: List<ActivityManager.RunningAppProcessInfo> =
am.runningAppProcesses
?: return null
for (procInfo in runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName
}
}
return null
}
/**
* ram
*/
fun getTotalMemory(): String {
// 系统内存信息文件
val file = "/proc/meminfo"
val memInfo: String
val strs: Array<String>
var memory: Long = 0
try {
val fileReader = FileReader(file)
val bufferedReader = BufferedReader(
fileReader,
8192
)
// 读取meminfo第一行,系统内存大小
memInfo = bufferedReader.readLine()
strs = memInfo.split("\\s+".toRegex()).toTypedArray()
// 获得系统总内存,单位KB
memory = Integer.valueOf(strs[1]).toLong()
bufferedReader.close()
} catch (e: Exception) {
e.printStackTrace()
}
return "" + ceil((memory.toFloat() / (1024 * 1024).toDouble())).toInt() + "GB"
}
/**
* 获取手机内部空间总大小
*
* @return 大小,字节为单位
*/
fun getTotalInternalMemorySize(): String {
//获取内部存储根目录
val path: File = Environment.getExternalStorageDirectory()
//系统的空间描述类
val stat = StatFs(path.absolutePath)
//每个区块占字节数
val totalSize = stat.totalBytes
return "" + ceil((totalSize.toFloat() / (1024 * 1024 * 1024).toDouble())).toInt() + "GB"
}
/**
* 描述:获取内存占用率.
*/
fun getUsedPercentValue(context: Context?): Int {
val dir = "/proc/meminfo"
try {
val fr = FileReader(dir)
val br = BufferedReader(fr, 8192)
val memoryTotalLine = br.readLine()
val subMemoryLine = memoryTotalLine.substring(memoryTotalLine.indexOf("MemTotal:"))
/** KB 计量单位 */
br.close()
val totalMemorySize = subMemoryLine.replace("\\D+".toRegex(), "").toLong() * 1024
val availableSize: Long = getAvailMemory(context)
return (((totalMemorySize - availableSize) / totalMemorySize.toFloat()) * 100).toInt()
} catch (e: IOException) {
e.printStackTrace()
}
return -1
}
/**
* 描述:获取可用内存.
*/
fun getAvailMemory(context: Context?): Long {
// 获取android当前可用内存大小
val activityManager = context?.getSystemService(
Context.ACTIVITY_SERVICE
) as ActivityManager
val memoryInfo =
ActivityManager.MemoryInfo()
activityManager.getMemoryInfo(memoryInfo)
// 当前系统可用内存 ,将获得的内存大小规格化
return memoryInfo.availMem
}
}
\ No newline at end of file
package com.mints.street.utils.json;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* 描述:FooAnnotation
* 作者:孟崔广
* 时间:2018/1/10 17:51
* 邮箱:mengcga@163.com
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface FooAnnotation {
}
package com.mints.street.utils.json;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
/**
* 描述:FooAnnotationExclusionStrategy
* 作者:孟崔广
*/
public class FooAnnotationExclusionStrategy implements ExclusionStrategy {
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getAnnotation(FooAnnotation.class) != null;
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
// return clazz.getAnnotation(FooAnnotation.class) != null;
}
}
package com.mints.street.utils.json;
import android.util.Log;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import java.lang.reflect.Type;
public class JsonUtil {
private static Gson gson = new GsonBuilder()
.addSerializationExclusionStrategy(new FooAnnotationExclusionStrategy())
.create();
@SuppressWarnings("hiding")
public static <T> T parseJson(String response, Class<T> clazz) {
try {
return gson.fromJson(response, clazz);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static <T> T parseJson(JsonObject response, Class<T> clazz) {
try {
return gson.fromJson(response, clazz);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 把json字符串转换为JavaBean。如果json的根节点就是一个集合,则使用此方法<p>
* type参数的获取方式为:Type type = new TypeToken<集合泛型>(){}.getType();
*
* @param json json字符串
* @return type 指定要解析成的数据类型
*/
public static <T> T json2Bean(String json, Type type) {
T bean = null;
try {
bean = gson.fromJson(json, type);
} catch (Exception e) {
Log.i("JsonUtil", "解析json数据时出现异常\njson = " + json, e);
}
return bean;
}
/**
* 把JsonElement转换为JavaBean。如果json的根节点就是一个集合,则使用此方法<p>
* type参数的获取方式为:Type type = new TypeToken<集合泛型>(){}.getType();
*
* @param json json字符串
* @return type 指定要解析成的数据类型
*/
public static <T> T json2Bean(JsonElement json, Type type) {
T bean = null;
try {
bean = gson.fromJson(json, type);
} catch (Exception e) {
Log.i("JsonUtil", "解析json数据时出现异常\njson = " + json, e);
}
return bean;
}
public static String toJson(Object object) {
try {
return gson.toJson(object);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="@color/white" />
</shape>
</item>
<item >
<bitmap
android:src="@drawable/bg_splash" />
</item>
</layer-list>
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <layout xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout
android:id="@+id/splash_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:src="@drawable/bg_splash"
/>
<data> <data>
<variable <variable
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <layout xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout
android:id="@+id/splash_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:src="@drawable/bg_splash"
/>
<data> <data>
<variable <variable
name="ViewModel" name="ViewModel"
......
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"> <layout xmlns:android="http://schemas.android.com/apk/res/android">
<FrameLayout
android:id="@+id/fl_splash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<!--这里模拟一张oneshot单的焦点图展示-->
<ImageView
android:id="@+id/oneshot_image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="400px" />
<RelativeLayout
android:id="@+id/splash_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<!-- 广点通开屏广告支持“半屏/全屏”展示,开发者可以把Logo区域放在屏幕底部,然后在Logo上方提供一个容器来放置半开屏广告,请注意此容器高度不得小于400dp -->
<!-- 1.Logo区域:展示半开屏广告时使用,如果想展示全开屏广告,可以不需要这个Logo区域 -->
<!-- 注意:如需要这个Logo区域,建议开发者使用自己的Logo资源,而不是联盟的Logo资源@drawable/gdt_splash_logo,资源规格可参照@drawable/gdt_splash_logo -->
<FrameLayout <FrameLayout
android:id="@+id/splash_container" android:id="@+id/splash_container"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_above="@id/app_logo" /> android:background="@color/white"
android:src="@drawable/bg_splash"
<!-- 2.预设开屏图片区域: -->
<!-- 开发者可以把自家App设计开屏图片摆放在这里,本示例中放置了一张静态图片。!-->
<!-- 注意1:直接将此图放在广告容器的下面即可,始终不要将广告容器splash_container的设为invisible,否则将不会展示广告无法计费,返回错误码600。-->
<!-- 注意2:建议开发者使用自己的开屏图片资源,而不是联盟的@drawable/splash_holder,资源规格可参照@drawable/splash_holder -->
<ImageView
android:id="@+id/splash_holder"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/app_logo"
android:scaleType="fitXY" />
<!-- 3.开屏广告容器区域:-->
<!-- 注意:该区域高度不得小于400dp。在本示例中没有写死splash_container的高度值,是因为第1部分的app_logo区域是一个高度很小的图片。 -->
<ImageView
android:id="@+id/app_logo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginTop="10dp"
/> />
<!-- 4.自定义跳过按钮区域:开发者可以根据需要自己实现不同样式的跳过按钮 -->
<!-- 注意1:根据广告法规定,跳过按钮必须在屏幕当中出现。因此广告展示的时候,必须让将SkipView显示出来,即visible,否则将SDK将不展示广告,返回错误码608。。 -->
<!-- 注意2:SDK除了会检查跳过按钮的可见性,还将检测它的尺寸,其尺寸不得小于3dp*3dp,否则将SDK将不展示广告,返回错误码608。 -->
<TextView
android:id="@+id/skip_view"
android:layout_width="96dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentTop="true"
android:layout_marginBottom="16dp"
android:layout_marginEnd="16dp"
android:layout_marginTop="16dp"
android:background="@drawable/shape_bg_circle"
android:gravity="center"
android:text="点击跳过"
android:textColor="@android:color/white"
android:textSize="14sp"
android:visibility="gone" />
<!-- 本示例省略了自定义的倒计时,和跳过按钮放在一起实现了。开发者也可以实现自己的倒计时View,方法是在onADTick回调中获得广告剩余的展示时间,并自由决定倒计时View的样式,SDK对倒计时的View没有要求。 -->
<!-- 自定义wifi预加载按钮,需设置状态为不显示,当素材为视频且视频开始播放时,SDK内部会处理为显示状态-->
<TextView
android:id="@+id/preload_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_margin="16dp"
android:background="@drawable/shape_bg_circle"
android:gravity="center"
android:text="已Wi-Fi预加载"
android:textColor="@android:color/white"
android:textSize="14sp"
android:visibility="gone" />
</RelativeLayout>
</FrameLayout>
<data> <data>
<variable <variable
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
android:layout_marginTop="15dp" android:layout_marginTop="15dp"
android:layout_marginBottom="15dp"> android:layout_marginBottom="15dp">
<com.mints.street.widget.CircleImageView <ImageView
android:id="@+id/item_title_avatar" android:id="@+id/item_title_avatar"
android:layout_width="60dp" android:layout_width="60dp"
android:layout_height="60dp" android:layout_height="60dp"
......
...@@ -23,10 +23,10 @@ isBuildModule=false ...@@ -23,10 +23,10 @@ isBuildModule=false
DEBUG_URL="http://test.mints-id.com/camera-api/" DEBUG_URL="http://test.mints-id.com/camera-api/"
RELEASE_URL="https://api.mints-id.com/gc-api/" RELEASE_URL="https://api.mints-id.com/gc-api/"
RELEASE_KEY_PASSWORD=mints.goodnews RELEASE_KEY_PASSWORD=mints.street
RELEASE_KEY_ALIAS=mints_goodnews RELEASE_KEY_ALIAS=mints_street
RELEASE_STORE_PASSWORD=mints.goodnews RELEASE_STORE_PASSWORD=mints.street
RELEASE_STORE_FILE=mints_goodnews.jks RELEASE_STORE_FILE=mints_street.jks
#ShareSDK #ShareSDK
RELEASE_SHARESDK_KEY= RELEASE_SHARESDK_KEY=
...@@ -34,6 +34,3 @@ RELEASE_SHARESDK_SECRET= ...@@ -34,6 +34,3 @@ RELEASE_SHARESDK_SECRET=
#友盟 #友盟
RELEASE_UMENG_KEY= RELEASE_UMENG_KEY=
\ No newline at end of file
#JPush
RELEASE_JPUSH_KEY=
\ No newline at end of file
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<string name="bottom_name_task">任务中心</string> <string name="bottom_name_task">任务中心</string>
<string name="bottom_name_my">个人中心</string> <string name="bottom_name_my">个人中心</string>
<string name="app_sign">5932d26a</string> <string name="app_sign">61117d7a</string>
<string name="dot">--</string> <string name="dot">--</string>
......
...@@ -61,4 +61,24 @@ ...@@ -61,4 +61,24 @@
<style name="TabLayoutFavoriteTextStyle"> <style name="TabLayoutFavoriteTextStyle">
<item name="android:textSize">15sp</item> <item name="android:textSize">15sp</item>
</style> </style>
<style name="NormalSplash" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/splash_bg</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>
<style name="AppTheme.NoneTranslucent" parent="AppTheme.Base">
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowAnimationStyle">@null</item>
</style>
<style name="CustomerTransparentTheme" parent="AppTheme.Base">
<!-- 为窗体的Enter和Exit设置动画 -->
<item name="android:windowAnimationStyle">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@color/transparent</item>
</style>
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
</resources> </resources>
\ No newline at end of file
#Fri Jul 09 14:31:29 CST 2021 #Fri Jul 09 14:43:55 CST 2021
VERSION_BUILD=2603 VERSION_BUILD=2655
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
public *; public *;
} }
# for DexGuard only # for DexGuard only
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule #-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
#glide-transformations #glide-transformations
-keep class jp.wasabeef.glide.transformations.** {*;} -keep class jp.wasabeef.glide.transformations.** {*;}
......
...@@ -247,6 +247,17 @@ public abstract class HabitBaseActivity<V extends ViewDataBinding, VM extends Ba ...@@ -247,6 +247,17 @@ public abstract class HabitBaseActivity<V extends ViewDataBinding, VM extends Ba
startContainerActivity(canonicalName, null); startContainerActivity(canonicalName, null);
} }
/**
* startActivity then finish
*
* @param clazz
*/
protected void startActivityThenKill(Class<?> clazz) {
Intent intent = new Intent(this, clazz);
startActivity(intent);
finish();
}
/** /**
* 跳转容器页面 * 跳转容器页面
* *
......
...@@ -109,7 +109,7 @@ public class ViewAdapter { ...@@ -109,7 +109,7 @@ public class ViewAdapter {
}); });
} }
@BindingAdapter(value = {"viewZ",/*"outline",*/"shadowColor"},requireAll = false) @BindingAdapter(value = {"viewZ",/*"outline",*/"shadowColor2"},requireAll = false)
public static void setViewZ(View view,int z,int color){ public static void setViewZ(View view,int z,int color){
ViewCompat.setElevation(view,AppUtils.dp2Px(view.getContext(),z)); ViewCompat.setElevation(view,AppUtils.dp2Px(view.getContext(),z));
......
...@@ -37,7 +37,7 @@ ...@@ -37,7 +37,7 @@
<attr name="isThrottleFirst" /> <attr name="isThrottleFirst" />
<attr name="currentView" /> <attr name="currentView" />
<attr name="viewZ" format="integer" /> <attr name="viewZ" format="integer" />
<attr name="shadowColor" format="integer" /> <attr name="shadowColor2" format="integer" />
<attr name="selected" format="boolean" /> <attr name="selected" format="boolean" />
</declare-styleable> </declare-styleable>
......
...@@ -7,6 +7,4 @@ public final class BuildConfig { ...@@ -7,6 +7,4 @@ public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true"); public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String LIBRARY_PACKAGE_NAME = "cn.sharesdk.lib"; public static final String LIBRARY_PACKAGE_NAME = "cn.sharesdk.lib";
public static final String BUILD_TYPE = "debug"; public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = -1;
public static final String VERSION_NAME = "";
} }
{
"version": 2,
"artifactType": {
"type": "AAPT_FRIENDLY_MERGED_MANIFESTS",
"kind": "Directory"
},
"applicationId": "cn.sharesdk.lib",
"variantName": "debug",
"elements": [
{
"type": "SINGLE",
"filters": [],
"outputFile": "AndroidManifest.xml"
}
]
}
\ No newline at end of file
{
"version": 1,
"applicationId": "cn.sharesdk.lib",
"variantType": "LIBRARY",
"elements": [
{
"outputType": {
"type": "AAPT_FRIENDLY_MERGED_MANIFESTS"
},
"apkData": {
"type": "MAIN",
"splits": [],
"versionCode": -1,
"outputFile": "shareSdkLib-debug.aar",
"fullName": "debug",
"baseName": "debug",
"dirName": ""
},
"path": "AndroidManifest.xml",
"properties": {
"packageId": "cn.sharesdk.lib",
"split": ""
}
}
]
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment