Commit 06ff406d by zhengnw@sobot.com

同步app代码

parent 6ac79ee6
......@@ -8,7 +8,7 @@ android {
defaultConfig {
applicationId "com.sobot.moduletest"
minSdkVersion 17
minSdkVersion 19
targetSdkVersion 34
versionCode 1
versionName "1.0"
......
......@@ -5,7 +5,6 @@ import static com.sobot.widget.ui.SobotBaseConstant.REQUEST_CODE_PICTURE;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.view.View;
import android.widget.ImageView;
......@@ -13,23 +12,13 @@ import android.widget.TextView;
import androidx.annotation.NonNull;
//import com.sobot.album.Action;
//import com.sobot.album.AlbumFile;
//import com.sobot.album.SobotAlbum;
//import com.sobot.album.api.widget.Widget;
//import com.sobot.album.app.preview.PreviewAlbumActivity;
import com.sobot.album.Action;
import com.sobot.album.AlbumFile;
import com.sobot.album.SobotAlbum;
import com.sobot.album.api.widget.Widget;
import com.sobot.chat.imageloader.SobotImageLoader;
import com.sobot.common.login.SobotLoginTools;
import com.sobot.common.login.callback.SobotResultBlock;
import com.sobot.common.login.callback.SobotResultCode;
import com.sobot.common.login.model.SobotServiceInfoModel;
import com.sobot.common.utils.SobotImageUtils;
import com.sobot.network.http.db.SobotDownloadManager;
import com.sobot.network.http.log.SobotNetLogUtils;
import com.sobot.pictureframe.SobotBitmapUtil;
import com.sobot.utils.SobotLogUtils;
import com.sobot.utils.SobotSDCardUtils;
......
......@@ -3,6 +3,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/sobot_white"
android:orientation="vertical"
tools:context=".MainActivity">
......@@ -11,13 +12,12 @@
<ImageView
android:id="@+id/img"
android:layout_width="60dp"
android:layout_height="60dp"
/>
android:layout_height="60dp" />
<com.sobot.widget.image.photoview.SobotPhotoView
android:id="@+id/img2"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
android:layout_height="wrap_content" />
<TextView
android:id="@+id/tv"
......
......@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 17
minSdkVersion 19
targetSdkVersion 34
versionCode 1
versionName "1.0"
......@@ -28,6 +28,5 @@ dependencies {
}
//添加发布到mavenCentral脚本
apply from: './sobot-album_publish-mavencentral.gradle'
\ No newline at end of file
......@@ -12,7 +12,7 @@ task androidSourcesJar(type: Jar) {
ext {
PUBLISH_GROUP_ID = "com.sobot.library" //项目包名
PUBLISH_ARTIFACT_ID = 'album' //项目名
PUBLISH_VERSION = '1.1.2' //版本号
PUBLISH_VERSION = '2.0.0' //版本号
}
......
......@@ -15,7 +15,7 @@
*/
package com.sobot.album;
import android.content.Context;
import android.app.Activity;
public interface ItemAction<T> {
......@@ -25,5 +25,5 @@ public interface ItemAction<T> {
* @param context context.
* @param item item.
*/
void onAction(Context context, T item);
void onAction(Activity context, T item);
}
......@@ -65,7 +65,7 @@ public class CameraActivity extends AppCompatActivity {
.onCancel(new Action<String>() {
@Override
public void onAction(@NonNull String result) {
Toast.makeText(CameraActivity.this, R.string.canceled, Toast.LENGTH_LONG).show();
Toast.makeText(CameraActivity.this, R.string.sobot_canceled, Toast.LENGTH_LONG).show();
}
})
.start();
......@@ -91,7 +91,7 @@ public class CameraActivity extends AppCompatActivity {
.onCancel(new Action<String>() {
@Override
public void onAction(@NonNull String result) {
Toast.makeText(CameraActivity.this, R.string.canceled, Toast.LENGTH_LONG).show();
Toast.makeText(CameraActivity.this, R.string.sobot_canceled, Toast.LENGTH_LONG).show();
}
})
.start();
......
......@@ -102,7 +102,7 @@ public class DefineStyleActivity extends AppCompatActivity {
.onCancel(new Action<String>() {
@Override
public void onAction(@NonNull String result) {
Toast.makeText(DefineStyleActivity.this, R.string.canceled, Toast.LENGTH_LONG).show();
Toast.makeText(DefineStyleActivity.this, R.string.sobot_canceled, Toast.LENGTH_LONG).show();
}
})
.start();
......
......@@ -113,7 +113,7 @@ public class SobotAlbumActivity extends SobotBaseActivity {
.onCancel(new Action<String>() {
@Override
public void onAction(@NonNull String result) {
Toast.makeText(SobotAlbumActivity.this, R.string.canceled, Toast.LENGTH_LONG).show();
Toast.makeText(SobotAlbumActivity.this, R.string.sobot_canceled, Toast.LENGTH_LONG).show();
}
})
.start();
......@@ -147,7 +147,7 @@ public class SobotAlbumActivity extends SobotBaseActivity {
.onCancel(new Action<String>() {
@Override
public void onAction(@NonNull String result) {
Toast.makeText(SobotAlbumActivity.this, R.string.canceled, Toast.LENGTH_LONG).show();
Toast.makeText(SobotAlbumActivity.this, R.string.sobot_canceled, Toast.LENGTH_LONG).show();
}
})
.start();
......@@ -234,7 +234,7 @@ public class SobotAlbumActivity extends SobotBaseActivity {
.onCancel(new Action<String>() {
@Override
public void onAction(@NonNull String result) {
Toast.makeText(SobotAlbumActivity.this, R.string.canceled, Toast.LENGTH_LONG).show();
Toast.makeText(SobotAlbumActivity.this, R.string.sobot_canceled, Toast.LENGTH_LONG).show();
}
})
.start();
......
......@@ -25,7 +25,6 @@ import com.sobot.album.SobotAlbum;
import com.sobot.album.api.widget.Widget;
import com.sobot.album.app.Contract;
import com.sobot.album.app.gallery.GalleryView;
import com.sobot.album.util.AlbumUtils;
import com.sobot.widget.ui.base.SobotBaseActivity;
import java.util.ArrayList;
......
......@@ -2,7 +2,6 @@ package com.sobot.album.app.fragment;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
......@@ -10,7 +9,6 @@ import android.view.SoundEffectConstants;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
......@@ -18,21 +16,17 @@ import androidx.fragment.app.Fragment;
import com.sobot.album.AlbumFile;
import com.sobot.album.R;
import com.sobot.album.SobotAlbum;
import com.sobot.album.widget.photoview.AttacherImageView;
import com.sobot.album.widget.photoview.PhotoViewAttacher;
import com.sobot.common.utils.SobotImageUtils;
import com.sobot.common.utils.SobotPathManager;
import com.sobot.network.http.HttpBaseUtils;
import com.sobot.pictureframe.SobotBitmapUtil;
import com.sobot.utils.SobotDensityUtil;
import com.sobot.utils.SobotLogUtils;
import com.sobot.utils.SobotMD5Util;
import com.sobot.utils.SobotStringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class ImageFragment extends Fragment implements PhotoViewAttacher.OnViewTapListener, View.OnLongClickListener {
private View mRootView;
......
......@@ -29,8 +29,6 @@ import com.sobot.album.R;
import com.sobot.album.SobotAlbum;
import com.sobot.utils.SobotStringUtils;
import java.io.IOException;
public class VideoFragment extends Fragment {
private View mRootView;
private VideoView mVideoView;
......
......@@ -25,7 +25,6 @@ import com.sobot.album.SobotAlbum;
import com.sobot.album.api.widget.Widget;
import com.sobot.album.app.Contract;
import com.sobot.album.mvp.SobotAlbumBaseActivity;
import com.sobot.album.util.AlbumUtils;
import java.util.ArrayList;
......
......@@ -15,7 +15,6 @@
*/
package com.sobot.album.app.preview;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.TextView;
......@@ -28,7 +27,6 @@ import com.sobot.album.AlbumFile;
import com.sobot.album.ItemAction;
import com.sobot.album.R;
import com.sobot.album.SobotAlbum;
import com.sobot.album.api.widget.Widget;
import com.sobot.album.app.Contract;
import com.sobot.album.mvp.SobotAlbumBaseActivity;
......@@ -46,7 +44,7 @@ public class PreviewAlbumActivity extends SobotAlbumBaseActivity implements Cont
public static ItemAction<AlbumFile> sClick;
public static ItemAction<AlbumFile> sLongClick;
private Widget mWidget;
// private Widget mWidget;
private Contract.GalleryView<AlbumFile> mView;
private ArrayList<AlbumFile> mAlbumFiles;//预览的图片和视频
......@@ -67,6 +65,7 @@ public class PreviewAlbumActivity extends SobotAlbumBaseActivity implements Cont
@Override
protected void initView() {
changeAppLanguage();
mView = new PreviewView<>(this, getSupportFragmentManager(), this);
this.fragmentManager = getSupportFragmentManager();
this.mViewPager = findViewById(R.id.view_pager);
......@@ -76,11 +75,11 @@ public class PreviewAlbumActivity extends SobotAlbumBaseActivity implements Cont
this.sobot_tv_page = findViewById(R.id.sobot_tv_page);
this.sobot_tv_download.setOnClickListener(this);
this.mLayoutLayer.setOnClickListener(this);
Bundle argument = getIntent().getExtras();
assert argument != null;
mWidget = argument.getParcelable(SobotAlbum.KEY_INPUT_WIDGET);
mAlbumFiles = argument.getParcelableArrayList(SobotAlbum.KEY_INPUT_CHECKED_LIST);
mCurrentPosition = argument.getInt(SobotAlbum.KEY_INPUT_CURRENT_POSITION, 0);
// mWidget = Widget.getDefaultWidget(this);
if(getIntent()!=null) {
mAlbumFiles = getIntent().getParcelableArrayListExtra(SobotAlbum.KEY_INPUT_CHECKED_LIST);
mCurrentPosition = getIntent().getIntExtra(SobotAlbum.KEY_INPUT_CURRENT_POSITION, 0);
}
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
......@@ -90,7 +89,6 @@ public class PreviewAlbumActivity extends SobotAlbumBaseActivity implements Cont
}
}
});
mView.setupViews(mWidget, true);
if (mCurrentPosition == 0) {
onCurrentChanged(mCurrentPosition);
} else {
......
......@@ -66,6 +66,7 @@ public abstract class SobotAlbumBaseActivity extends SobotBaseActivity implement
@Override
public final void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (isGrantedResult(grantResults)) onPermissionGranted(requestCode);
else onPermissionDenied(requestCode);
}
......
......@@ -88,7 +88,7 @@
<string name="btn_gallery_preview">Preview Network Image</string>
<string name="checkable">Checkable Options</string>
<string name="canceled">Canceled</string>
<string name="sobot_canceled">Canceled</string>
<string name="no_selected">Please select, first.</string>
<string name="hint_image_preview_click">Click on a item to preview them.</string>
......
......@@ -77,7 +77,7 @@
<string name="menu_preview">图库</string>
<string name="btn_gallery_preview">预览网络图像</string>
<string name="checkable">可检查选项</string>
<string name="canceled">已取消</string>
<string name="sobot_canceled">已取消</string>
<string name="no_selected">请先选择</string>
<string name="hint_image_preview_click">单击项目以预览它们</string>
<string name="hint_filter_after_visibility">是否显示了筛选的文件</string>
......
......@@ -97,6 +97,11 @@
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">90dp</item>
</style>
<style name="sobot_activity_def_theme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
<style name="Button">
......
......@@ -6,14 +6,14 @@ android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 14
minSdkVersion 19
//添加此行
multiDexEnabled true
}
//这里就是打jar包
task makeJar(type: Copy) {
//删除旧的jar包
delete 'build/libs/sobot_common_x_2.2.1.jar'
delete 'build/libs/sobot_common_x_2.3.0.jar'
//原地址
from('build/intermediates/packaged-classes/release/')
//导出jar包的地址
......@@ -21,7 +21,7 @@ android {
//包含的jar包
include('classes.jar')
//重命名jar包为mysdk
rename('classes.jar', 'sobot_common_x_2.2.1.jar')
rename('classes.jar', 'sobot_common_x_2.3.0.jar')
}
makeJar.dependsOn(build)
}
......@@ -34,6 +34,7 @@ dependencies {
// api project(':sobot_network')
// api project(':sobot_gson')
api 'org.greenrobot:eventbus:3.3.1'
api 'com.sobot.library:utils:1.1.3'
api 'com.sobot.library:picture_x:1.2.5'
......
......@@ -12,7 +12,7 @@ task androidSourcesJar(type: Jar) {
ext {
PUBLISH_GROUP_ID = "com.sobot.library" //项目包名
PUBLISH_ARTIFACT_ID = 'sobotcommon_x' //项目名
PUBLISH_VERSION = '2.2.2' //版本号
PUBLISH_VERSION = '2.3.0' //版本号
}
......
......@@ -3,6 +3,7 @@ package com.sobot.common.login;
import android.content.Context;
import android.text.TextUtils;
import com.sobot.common.login.model.SobotServiceInfoModel;
import com.sobot.network.http.SobotOkHttpUtils;
import com.sobot.network.http.builder.PostFormBuilder;
import com.sobot.network.http.builder.PostMultipartFormBuilder;
......@@ -13,6 +14,7 @@ import com.sobot.network.http.log.SobotNetLogUtils;
import com.sobot.network.http.request.RequestCall;
import com.sobot.network.http.upload.SobotUpload;
import com.sobot.network.http.upload.SobotUploadTask;
import com.sobot.utils.SobotSharedPreferencesUtil;
import com.sobot.utils.SobotStringUtils;
import org.json.JSONObject;
......@@ -42,6 +44,12 @@ public class SobotCommonHttpUtils {
}
private static String getTokenId(Context context) {
if (context != null && SobotLoginTools.getInstance().getServiceInfo() == null) {
SobotServiceInfoModel mServiceInfoModel = SobotSharedPreferencesUtil.getInstance(context).get(SobotLoginConstant.SOBOT_LOGIN_USER_INFO, SobotServiceInfoModel.class);
if (mServiceInfoModel != null) {
SobotLoginTools.getInstance().setServiceInfo(mServiceInfoModel);
}
}
String token = SobotLoginTools.getInstance().getToken();
return token;
}
......
......@@ -18,6 +18,10 @@ import com.sobot.common.login.model.SobotServiceInfoModel;
import com.sobot.common.login.model.TokenModel;
import com.sobot.common.login.permission.SobotPermissionApi;
import com.sobot.common.login.permission.SobotPermissionManager;
import com.sobot.common.model.SobotLanguageVersion;
import com.sobot.common.utils.SobotCommonSPUtil;
import com.sobot.common.utils.SobotGlobalContext;
import com.sobot.common.utils.SobotStringResource;
import com.sobot.network.apiUtils.SobotBaseCode;
import com.sobot.network.apiUtils.SobotHttpUtils;
import com.sobot.network.http.HttpBaseUtils;
......@@ -27,9 +31,16 @@ import com.sobot.utils.SobotSharedPreferencesUtil;
import com.sobot.utils.SobotStringUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
......@@ -61,6 +72,19 @@ public class SobotLoginTools {
return mServiceInfoModel;
}
public SobotServiceInfoModel getServiceInfo(Context context) {
if (mServiceInfoModel == null) {
mServiceInfoModel = ServiceInfoManager.getInstance().getInfo();
}
if (context != null && mServiceInfoModel == null) {
mServiceInfoModel = SobotSharedPreferencesUtil.getInstance(context).get(SobotLoginConstant.SOBOT_LOGIN_USER_INFO, SobotServiceInfoModel.class);
if (mServiceInfoModel != null) {
setServiceInfo(mServiceInfoModel);
}
}
return mServiceInfoModel;
}
public String getServicLang() {
if (lang != null && TextUtils.isEmpty(lang)) {
SobotServiceInfoModel infoModel = getServiceInfo();
......@@ -230,12 +254,14 @@ public class SobotLoginTools {
Map<String, String> headerMap = new HashMap<>();
headerMap.put("from", "2");
Map<String, Object> params = new HashMap<>();
params.put("version", paramsMap.get("version"));
params.put("loginUser", loginAcount);
params.put("loginPwd", loginPwd);
if (SobotStringUtils.isNoEmpty(factorVerifyCode)) {
params.put("factorVerifyCode", factorVerifyCode);
}
if (paramsMap != null) {
params.putAll(paramsMap);
}
SobotHttpUtils.doPost(cancelTag, host + "/basic-login/serviceAppLogin/4", 8000, params, headerMap, new HttpBaseUtils.StringCallBack() {
@Override
public void onResponse(String response) {
......@@ -243,7 +269,7 @@ public class SobotLoginTools {
if (result != null && !SobotStringUtils.isEmpty(result.getRetCode()) && "000000".equals(result.getRetCode()) && !SobotStringUtils.isEmpty(result.getItem())) {
final long login_time = System.currentTimeMillis();
final String token = (String) result.getItem();
requestLanguage(host, token, "");
getuserEntityInfo(cancelTag, mContext, host, token, "", new SobotResultBlock() {
@Override
public void resultBolok(SobotResultCode code, String msg, Object obj) {
......@@ -254,7 +280,7 @@ public class SobotLoginTools {
serviceInfoModel.setToken(token);
serviceInfoModel.setLoginAccount(loginAcount);
serviceInfoModel.setLoginPwd(loginPwd);
checkLanguageVersion(host, token, serviceInfoModel.getServiceWorkbenchLang(), "");
//判断是否有对话功能
if (SobotPermissionManager.checkPermission(SobotPermissionApi.USER_PERMISSION_TYPE_TALK) && isAppOrOnlineLogin) {
getAdminStatus(cancelTag, mContext, host, paramsMap, serviceInfoModel, resultBlock);
......@@ -357,7 +383,7 @@ public class SobotLoginTools {
if (result != null && !SobotStringUtils.isEmpty(result.getRetCode()) && "000000".equals(result.getRetCode()) && !SobotStringUtils.isEmpty(result.getItem())) {
final long login_time = System.currentTimeMillis();
final String token = (String) result.getItem();
requestLanguage(host, token, "");
getuserEntityInfo(cancelTag, mContext, host, token, "", new SobotResultBlock() {
@Override
public void resultBolok(SobotResultCode code, String msg, Object obj) {
......@@ -367,7 +393,7 @@ public class SobotLoginTools {
serviceInfoModel.setLogin_time(login_time);
serviceInfoModel.setToken(token);
serviceInfoModel.setLoginAccount(loginAcount);
checkLanguageVersion(host, token, serviceInfoModel.getServiceWorkbenchLang(), "");
//判断是否有对话功能
if (SobotPermissionManager.checkPermission(SobotPermissionApi.USER_PERMISSION_TYPE_TALK) && isAppOrOnlineLogin) {
getAdminStatus(cancelTag, mContext, host, paramsMap, serviceInfoModel, resultBlock);
......@@ -431,13 +457,93 @@ public class SobotLoginTools {
});
}
public void requestLanguage(String host, String token, String language) {
/**
* 检查是否需要下载语言
*
* @param host 域名
* @param token token
* @param language 语言
* @param version 接口
*/
public void checkLanguageVersion(final String host, final String token, final String language, String version) {
//清空缓存
SobotStringResource.map.clear();
Map<String, Object> tokebMap = new HashMap<>();
tokebMap.put("projectCode", "android");
tokebMap.put("sceneCode", "page");
tokebMap.put("langType", language);
tokebMap.put("catalogCodes", "app,common,call,crm,order,album,widget");
tokebMap.put("from", "2");
String url = host.replace("/text", "").replace("api-c-", "") + "/basic-public/newMultiLang/getMultiLanguageVersion";
Map<String, String> headerMap = new HashMap<>();
if (!SobotStringUtils.isEmpty(token)) {
headerMap.put("temp-id", token);
headerMap.put("authorization", "Bearer " + token);
}
if (!SobotStringUtils.isEmpty(language)) {
headerMap.put("language", language);
}
headerMap.put("from", "2");
SobotHttpUtils.doGet(host, url, 8000, tokebMap, headerMap, new HttpBaseUtils.StringCallBack() {
@Override
public void onResponse(String response) {
SobotCallBaseCode<SobotLanguageVersion> result = SobotGsonUtil.jsonToBeans(response, new TypeToken<SobotCallBaseCode<SobotLanguageVersion>>() {
}.getType());
if (result != null && !TextUtils.isEmpty(result.getRetCode()) && (SobotCommonConstant.RESULT_SUCCESS_CODE_SECOND.equals(result.getRetCode()) || SobotCommonConstant.RESULT_SUCCESS_CODE.equals(result.getRetCode()))) {
if (result.getItem() != null) {
//判断是否需要下载数据
long languageVersion = SobotCommonSPUtil.getLongData(SobotGlobalContext.getAppContext(), SobotStringResource.SOBOT_LANGUAGE_VERSION + language);
String languageCode = SobotCommonSPUtil.getStringData(SobotGlobalContext.getAppContext(), SobotStringResource.SOBOT_LANGUAGE_CODE + language);
if (languageVersion == 0) {
// //只保存版本号,不下载,使用本地的
SobotCommonSPUtil.saveLongData(SobotGlobalContext.getAppContext(), SobotStringResource.SOBOT_LANGUAGE_VERSION + language, result.getItem().getVersion());
SobotCommonSPUtil.saveStringData(SobotGlobalContext.getAppContext(), SobotStringResource.SOBOT_LANGUAGE_CODE + language, result.getItem().getLangType());
//清空缓存,使用本地
SobotStringResource.map.clear();
} else {
if (!languageCode.equals(result.getItem().getLangType()) || languageVersion < result.getItem().getVersion()) {
//下载语言到缓存
requestLanguage(host, token, language);
} else {
//读取本地文件到缓存
JSONObject page = readPageFromFile(language);
if (page != null) {
stringByObj(page);
}
}
}
}
} else {
//下载语言到缓存
requestLanguage(host, token, language);
}
}
@Override
public void onError(Exception e, String s, int i) {
}
@Override
public void inProgress(int i) {
}
});
}
/**
* 下载多语言数据
*
* @param host 域名
* @param token token
* @param language 语言
*/
public void requestLanguage(String host, String token, final String language) {
Map<String, Object> tokebMap = new HashMap<>();
String nowMills = System.currentTimeMillis() + "";
tokebMap.put("create_time", nowMills);
tokebMap.put("projectCode", "Android");
tokebMap.put("langType", "zh");
tokebMap.put("catalogCodes", "app");
tokebMap.put("projectCode", "android");
tokebMap.put("langType", language);
tokebMap.put("catalogCodes", "app,common,call,crm,order,album,widget");
tokebMap.put("from", "2");
String url = host.replace("/text", "").replace("api-c-", "") + "/basic-system/newMultiLang/getSimpleMultiLanguage";
Map<String, String> headerMap = new HashMap<>();
......@@ -449,11 +555,29 @@ public class SobotLoginTools {
headerMap.put("language", language);
}
headerMap.put("from", "2");
//获取 公司token
SobotHttpUtils.doGet(host, url, 8000, tokebMap, headerMap, new HttpBaseUtils.StringCallBack() {
@Override
public void onResponse(String response) {
SobotCallBaseCode<SobotLanguageVersion> result = SobotGsonUtil.jsonToBeans(response, new TypeToken<SobotCallBaseCode<SobotLanguageVersion>>() {
}.getType());
if (result != null && !TextUtils.isEmpty(result.getRetCode()) && (SobotCommonConstant.RESULT_SUCCESS_CODE_SECOND.equals(result.getRetCode()) || SobotCommonConstant.RESULT_SUCCESS_CODE.equals(result.getRetCode()))) {
if (result.getItem() != null) {
SobotCommonSPUtil.saveLongData(SobotGlobalContext.getAppContext(), SobotStringResource.SOBOT_LANGUAGE_VERSION + language, result.getItem().getVersion());
SobotCommonSPUtil.saveStringData(SobotGlobalContext.getAppContext(), SobotStringResource.SOBOT_LANGUAGE_CODE + language, result.getItem().getLangType());
try {
JSONObject responseObj = new JSONObject(response);
JSONObject itemObj = responseObj.optJSONObject("item");
if (itemObj != null && itemObj.has("page")) {
JSONObject object = itemObj.getJSONObject("page");
savePageToFile(object, language);
stringByObj(object);
}
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
} else {
}
}
@Override
......@@ -469,6 +593,151 @@ public class SobotLoginTools {
}
/**
* 根据json 转成 map 缓存到 SobotStringResource
*
* @param object
*/
private void stringByObj(JSONObject object) {
try {
HashMap<String, String> map = new HashMap<>();
if (object.has("widget")) {
JSONObject obj = object.getJSONObject("widget");
HashMap<String, String> cusMap = new HashMap<>();
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
String jsonStr = obj.getString(key);
cusMap.put(key, jsonStr.replaceAll("\\\\", ""));
}
map.putAll(cusMap);
}
if (object.has("common")) {
JSONObject obj = object.getJSONObject("common");
HashMap<String, String> cusMap = new HashMap<>();
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
String jsonStr = obj.getString(key);
cusMap.put(key, jsonStr.replaceAll("\\\\", ""));
}
map.putAll(cusMap);
}
if (object.has("album")) {
JSONObject obj = object.getJSONObject("album");
HashMap<String, String> cusMap = new HashMap<>();
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
String jsonStr = obj.getString(key);
cusMap.put(key, jsonStr.replaceAll("\\\\", ""));
}
map.putAll(cusMap);
}
if (object.has("order")) {
JSONObject obj = object.getJSONObject("order");
HashMap<String, String> cusMap = new HashMap<>();
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
String jsonStr = obj.getString(key);
cusMap.put(key, jsonStr.replaceAll("\\\\", ""));
}
map.putAll(cusMap);
}
if (object.has("crm")) {
JSONObject obj = object.getJSONObject("crm");
HashMap<String, String> cusMap = new HashMap<>();
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
String jsonStr = obj.getString(key);
cusMap.put(key, jsonStr.replaceAll("\\\\", ""));
}
map.putAll(cusMap);
}
if (object.has("call")) {
JSONObject obj = object.getJSONObject("call");
HashMap<String, String> cusMap = new HashMap<>();
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
String jsonStr = obj.getString(key);
cusMap.put(key, jsonStr.replaceAll("\\\\", ""));
}
map.putAll(cusMap);
}
if (object.has("app")) {
JSONObject obj = object.getJSONObject("app");
HashMap<String, String> cusMap = new HashMap<>();
for (Iterator<String> it = obj.keys(); it.hasNext(); ) {
String key = it.next();
String jsonStr = obj.getString(key);
//去掉转义
cusMap.put(key, jsonStr.replaceAll("\\\\", ""));
}
map.putAll(cusMap);
}
SobotStringResource.setMap(map);
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
/**
* 保存到文件
*
* @param page
* @param language
*/
private void savePageToFile(JSONObject page, String language) {
try {
// 创建文件路径
File file = new File(SobotGlobalContext.getAppContext().getFilesDir(), "language_" + language + ".json");
if (file.exists()) {
file.delete();
}
FileWriter fileWriter = new FileWriter(file);
// // 将 JSONObject 写入文件
fileWriter.write(page.toString(4)); // 4 表示缩进,便于阅读
fileWriter.flush();
fileWriter.close();
SobotLogUtils.i("Language file saved: " + file.getAbsolutePath());
} catch (IOException e) {
SobotLogUtils.e("Failed to save language file: " + e.getMessage());
} catch (JSONException e) {
throw new RuntimeException(e);
}
}
/**
* 从文件中读取
*
* @param language
* @return
*/
private JSONObject readPageFromFile(String language) {
try {
// 创建文件路径
File file = new File(SobotGlobalContext.getAppContext().getFilesDir(), "language_" + language + ".json");
if (!file.exists()) {
SobotLogUtils.e("Language file does not exist: " + file.getAbsolutePath());
return null;
}
// 读取文件内容
StringBuilder text = new StringBuilder();
try (FileReader fileReader = new FileReader(file)) {
char[] buffer = new char[1024];
int length;
while ((length = fileReader.read(buffer)) != -1) {
text.append(buffer, 0, length);
}
}
// 解析 JSON 字符串
return new JSONObject(text.toString());
} catch (IOException | JSONException e) {
SobotLogUtils.e("Failed to read language file: " + e.getMessage());
return null;
}
}
/**
* 执行登录操作
* 1、通过账号密码登录获取token;2、根据token获取客服角色权限等信息;3、如果是呼叫V6或者电销,先获取AccessToken;4、再根据客服app或者客服SDK登录同时又买了在线产品判断是否执行在线操作逻辑
*
......@@ -642,7 +911,7 @@ public class SobotLoginTools {
public void onResponse(String result) {
if (!SobotStringUtils.isEmpty(result)) {
try {
org.json.JSONObject resonseObj = new org.json.JSONObject(result);
JSONObject resonseObj = new JSONObject(result);
String retCode = resonseObj.optString("retCode");
String retMsg = resonseObj.optString("retMsg");
if ("000000".equals(retCode)) {
......@@ -708,7 +977,7 @@ public class SobotLoginTools {
try {
if (null != items) {
for (int i = 0; i < items.length(); i++) {
org.json.JSONObject o = items.getJSONObject(i);
JSONObject o = items.getJSONObject(i);
ServiceFunctionVoModel functionVoModel = SobotGsonUtil.jsonToBean(o.toString(), ServiceFunctionVoModel.class);
if (functionVoModel != null) {
list.add(functionVoModel);
......
package com.sobot.common.model;
public class SobotLanguageVersion {
/**
* "projectCode": "android",
* "langType": "zh",
* "timestamp": 1744006915549,
* "version": 1742985785852,
*/
private String projectCode;
//语言类型 zh
private String langType;
//请求的时间戳
private long timestamp;
//版本号,比较是否更新本地资源
private long version;
public String getProjectCode() {
return projectCode;
}
public void setProjectCode(String projectCode) {
this.projectCode = projectCode;
}
public String getLangType() {
return langType;
}
public void setLangType(String langType) {
this.langType = langType;
}
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public long getVersion() {
return version;
}
public void setVersion(long version) {
this.version = version;
}
}
package com.sobot.common.utils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class SobotCommonBase64 {
private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.toCharArray();
public static String encode(byte[] data) {
int start = 0;
int len = data.length;
StringBuffer buf = new StringBuffer(data.length * 3 / 2);
int end = len - 3;
int i = start;
int n = 0;
while (i <= end) {
int d = ((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 0x0ff) << 8)
| (((int) data[i + 2]) & 0x0ff);
buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append(legalChars[(d >> 6) & 63]);
buf.append(legalChars[d & 63]);
i += 3;
if (n++ >= 14) {
n = 0;
buf.append(" ");
}
}
if (i == start + len - 2) {
int d = ((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 255) << 8);
buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append(legalChars[(d >> 6) & 63]);
buf.append("=");
} else if (i == start + len - 1) {
int d = (((int) data[i]) & 0x0ff) << 16;
buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append("==");
}
return buf.toString();
}
private static int decode(char c) {
if (c >= 'A' && c <= 'Z')
return ((int) c) - 65;
else if (c >= 'a' && c <= 'z')
return ((int) c) - 97 + 26;
else if (c >= '0' && c <= '9')
return ((int) c) - 48 + 26 + 26;
else
switch (c) {
case '+' :
return 62;
case '/' :
return 63;
case '=' :
return 0;
default :
throw new RuntimeException("unexpected code: " + c);
}
}
public static byte[] decode(String s) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
decode(s, bos);
} catch (IOException e) {
throw new RuntimeException();
}
byte[] decodedBytes = bos.toByteArray();
try {
bos.close();
bos = null;
} catch (IOException ex) {
System.err.println("Error while decoding BASE64: " + ex.toString());
}
return decodedBytes;
}
private static void decode(String s, OutputStream os) throws IOException {
int i = 0;
int len = s.length();
while (true) {
while (i < len && s.charAt(i) <= ' ')
i++;
if (i == len)
break;
int tri = (decode(s.charAt(i)) << 18)
+ (decode(s.charAt(i + 1)) << 12)
+ (decode(s.charAt(i + 2)) << 6)
+ (decode(s.charAt(i + 3)));
os.write((tri >> 16) & 255);
if (s.charAt(i + 2) == '=')
break;
os.write((tri >> 8) & 255);
if (s.charAt(i + 3) == '=')
break;
os.write(tri & 255);
i += 4;
}
}
}
\ No newline at end of file
package com.sobot.common.utils;
import android.content.Context;
import android.content.SharedPreferences;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
public class SobotCommonSPUtil {
private static SharedPreferences sharedPreferences;
private static String CONFIG = "sobot_common";
public static void saveStringData(Context context, String key, String value) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG,
Context.MODE_PRIVATE);
}
sharedPreferences.edit().putString(key, value).commit();
}
public static String getStringData(Context context, String key) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG,
Context.MODE_PRIVATE);
}
return sharedPreferences.getString(key, "");
}
public static void saveLongData(Context context, String key, long value) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG,
Context.MODE_PRIVATE);
}
sharedPreferences.edit().putLong(key, value).commit();
}
public static long getLongData(Context context, String key) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG,
Context.MODE_PRIVATE);
}
return sharedPreferences.getLong(key,0);
}
public static void saveBooleanData(Context context, String key, boolean value) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG,
Context.MODE_PRIVATE);
}
sharedPreferences.edit().putBoolean(key, value).commit();
}
public static Boolean getBooleanData(Context context, String key,
Boolean defValue) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG,
Context.MODE_PRIVATE);
}
return sharedPreferences.getBoolean(key, defValue);
}
//save object
public static void saveObject(Context context, String key ,Object obj){
SharedPreferences preferences = context.getSharedPreferences("base64",
Context.MODE_PRIVATE);
//创建字节输出流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
//创建对象输出流,并封装字节流
ObjectOutputStream oos = new ObjectOutputStream(baos);
//将对象写入字节流
oos.writeObject(obj);
//将字节流编码成base64的字符窜
String productBase64 = new String(SobotCommonBase64.encode(baos
.toByteArray()));
SharedPreferences.Editor editor = preferences.edit();
editor.putString(key, productBase64);
editor.commit();
} catch (IOException e) {
// Auto-generated catch block
e.printStackTrace();
}
}
public static Object getObjectByKey(Context context, String key){
SharedPreferences preferences = context.getSharedPreferences("base64",
Context.MODE_PRIVATE);
String productBase64 = preferences.getString(key, null);
if (productBase64 == null) {
return null;
}
//读取字节
byte[] base64 = SobotCommonBase64.decode(productBase64);
//封装到字节流
ByteArrayInputStream bais = new ByteArrayInputStream(base64);
try {
//再次封装
ObjectInputStream bis = new ObjectInputStream(bais);
try {
//读取对象
return bis.readObject();
} catch (ClassNotFoundException e) {
// Auto-generated catch block
e.printStackTrace();
}
} catch (StreamCorruptedException e) {
// Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void saveIntData(Context context, String key, int value) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG, Context.MODE_PRIVATE);
}
sharedPreferences.edit().putInt(key, value).commit();
}
public static int getIntData(Context context, String key, int defValue) {
if (sharedPreferences == null) {
sharedPreferences = context.getSharedPreferences(CONFIG, Context.MODE_PRIVATE);
}
return sharedPreferences.getInt(key, defValue);
}
public static void removeKey(Context context,String key){
if(sharedPreferences == null){
sharedPreferences = context.getSharedPreferences(CONFIG, Context.MODE_PRIVATE);
}
sharedPreferences.edit().remove(key).commit();
}
}
\ No newline at end of file
package com.sobot.common.utils;
import org.greenrobot.eventbus.EventBus;
public class SobotEventBusUtils {
private SobotEventBusUtils() {
// 私有构造防止实例化
}
/**
* 注册事件
*/
public static void register(Object subscriber) {
if (!EventBus.getDefault().isRegistered(subscriber)) {
EventBus.getDefault().register(subscriber);
}
}
/**
* 解注册事件
*/
public static void unregister(Object subscriber) {
if (EventBus.getDefault().isRegistered(subscriber)) {
EventBus.getDefault().unregister(subscriber);
}
}
/**
* 发送普通事件
*/
public static void post(Object event) {
EventBus.getDefault().post(event);
}
/**
* 发送粘滞事件(Sticky Event)
*/
public static void postSticky(Object event) {
EventBus.getDefault().postSticky(event);
}
/**
* 获取粘滞事件(用于获取已发送的 Sticky Event)
*/
public static <T> T getStickyEvent(Class<T> eventType) {
return EventBus.getDefault().getStickyEvent(eventType);
}
/**
* 移除指定类型的粘滞事件
*/
public static <T> void removeStickyEvent(Class<T> eventType) {
EventBus.getDefault().removeStickyEvent(eventType);
}
/**
* 移除所有粘滞事件
*/
public static void removeAllStickyEvents() {
EventBus.getDefault().removeAllStickyEvents();
}
}
......@@ -4,12 +4,26 @@ import android.content.Context;
import android.graphics.Color;
import android.os.Environment;
import com.sobot.utils.SobotStringUtils;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
public class SobotResourceUtils {
public static Map<String,String> resource;
public static void setResource(Map<String, String> resource) {
SobotResourceUtils.resource = resource;
}
public static Map<String, String> getResource() {
return resource;
}
public static int getIdByName(Context context, String className,
String resName) {
......@@ -37,7 +51,14 @@ public class SobotResourceUtils {
}
public static String getResString(Context context, String name) {
return context.getResources().getString(getResStrId(context, name));
String value ="";
if(resource!=null){
value = resource.get(name);
}
if(SobotStringUtils.isEmpty(value)){
value = context.getResources().getString(getResStrId(context, name));
}
return value;
}
public static int getResId(Context context, String name) {
......@@ -103,4 +124,48 @@ public class SobotResourceUtils {
}
return stringBuffer.toString();
}
/**
* 写入content到fileName
*
* @param fileName 文件路径
* @param content 写入的内容
* @param append 是否为append
*/
public static void writeStringToFile(String fileName, String content, boolean append) {
try {
checkFilePath(fileName);
//使用true,即进行append file
FileWriter fileWritter = new FileWriter(fileName, append);
fileWritter.write(content);
fileWritter.close();
System.out.println("finish");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void checkFilePath(String fileName) {
File file = new File(fileName.substring(0, fileName.lastIndexOf("/") + 1));
if (!file.isDirectory()) {
file.mkdirs();
}
file = new File(fileName);
if (!file.isFile()) {
try {
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
\ No newline at end of file
package com.sobot.common.utils;
import android.content.Context;
import com.sobot.utils.SobotStringUtils;
import java.util.HashMap;
import java.util.Map;
/**
* 下载的String 资源
*/
public class SobotStringResource {
public static Map<String,String> map = new HashMap<>();
public static String SOBOT_LANGUAGE_VERSION="sobot_language_version_";
public static String SOBOT_LANGUAGE_CODE="sobot_language_code_";
public static String getString(String str) {
if(map==null || map.isEmpty()){
return "";
}
String strValue = map.get(str);
if(SobotStringUtils.isEmpty(strValue)){
strValue = "";
}
return strValue;
}
public static String getString(Context context,String str) {
String strValue = map.get(str);
if(SobotStringUtils.isEmpty(strValue)){
strValue = context.getResources().getString(getIdByName(context,str));
}
return strValue;
}
public static int getIdByName(Context context, String resName) {
context = context.getApplicationContext();
String packageName = context.getPackageName();
int indentify = context.getResources().getIdentifier(resName,
"string", packageName);
return indentify;
}
public static void setMap(Map<String, String> map) {
SobotStringResource.map = map;
}
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.sobot.network">
<manifest package="com.sobot.network">
</manifest>
\ No newline at end of file
......@@ -4,13 +4,12 @@ import android.content.Context;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.AsyncTask;
import android.text.TextUtils;
import android.widget.ImageView;
import androidx.annotation.DrawableRes;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.widget.ImageView;
import com.facebook.common.executors.UiThreadImmediateExecutorService;
import com.facebook.common.references.CloseableReference;
import com.facebook.datasource.DataSource;
......
......@@ -2,13 +2,12 @@ package com.sobot.pictureframe;
import android.content.Context;
import android.graphics.Bitmap;
import androidx.annotation.DrawableRes;
import android.net.Uri;
import android.text.TextUtils;
import android.widget.ImageView;
import androidx.annotation.DrawableRes;
import com.bumptech.glide.BitmapRequestBuilder;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestListener;
......
......@@ -2,14 +2,13 @@ package com.sobot.pictureframe;
import android.content.Context;
import android.graphics.Bitmap;
import androidx.annotation.DrawableRes;
import android.net.Uri;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.DrawableRes;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
......
......@@ -4,7 +4,7 @@ android {
compileSdkVersion 34
defaultConfig {
minSdkVersion 17
minSdkVersion 19
//添加此行
multiDexEnabled true
}
......
......@@ -12,7 +12,7 @@ task androidSourcesJar(type: Jar) {
ext {
PUBLISH_GROUP_ID = "com.sobot.library" //项目包名
PUBLISH_ARTIFACT_ID = 'widget_x' //项目名
PUBLISH_VERSION = '1.3.2' //版本号
PUBLISH_VERSION = '2.0.0' //版本号
}
......
package androidx.lifecycle;
import static androidx.lifecycle.Lifecycle.State.CREATED;
import static androidx.lifecycle.Lifecycle.State.DESTROYED;
import androidx.annotation.NonNull;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import static androidx.lifecycle.Lifecycle.State.CREATED;
import static androidx.lifecycle.Lifecycle.State.DESTROYED;
/**
* Created by liaohailiang on 2019/3/7.
*/
......
package com.sobot.widget.livedatabus.core;
import android.content.Context;
import androidx.annotation.NonNull;
import com.sobot.widget.livedatabus.logger.Logger;
......
......@@ -4,14 +4,6 @@ import static android.content.Context.RECEIVER_EXPORTED;
import android.annotation.SuppressLint;
import android.app.Application;
import androidx.lifecycle.ExternalLiveData;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
......@@ -21,6 +13,11 @@ import android.os.Looper;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.ExternalLiveData;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.Observer;
import com.sobot.widget.livedatabus.ipc.consts.IpcConst;
import com.sobot.widget.livedatabus.ipc.core.ProcessorManager;
......@@ -541,7 +538,7 @@ public final class LiveEventBusCore {
preventNextEvent = false;
return;
}
logger.log(Level.INFO, "message received: " + t);
logger.log(Level.INFO, "live_eventbus message received: " + t);
try {
observer.onChanged(t);
} catch (ClassCastException e) {
......
package com.sobot.widget.livedatabus.core;
import androidx.annotation.NonNull;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.Observer;
import androidx.annotation.NonNull;
public interface Observable<T> {
......
......@@ -7,10 +7,11 @@ import android.app.Application;
import android.app.Application.ActivityLifecycleCallbacks;
import android.content.Context;
import android.os.Bundle;
import androidx.core.content.FileProvider;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import androidx.core.content.FileProvider;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
......
......@@ -21,8 +21,6 @@ import android.app.Fragment;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import androidx.annotation.DrawableRes;
import androidx.annotation.LayoutRes;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.LayoutInflater;
......@@ -32,6 +30,9 @@ import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.DrawableRes;
import androidx.annotation.LayoutRes;
import com.sobot.widget.R;
import java.util.HashMap;
......
......@@ -24,15 +24,6 @@ import android.graphics.Paint;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.view.NestedScrollingChildHelper;
import androidx.core.view.NestedScrollingParent;
import androidx.core.view.NestedScrollingParentHelper;
import androidx.core.view.ViewCompat;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
......@@ -48,6 +39,16 @@ import android.widget.Scroller;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.core.view.NestedScrollingChildHelper;
import androidx.core.view.NestedScrollingParent;
import androidx.core.view.NestedScrollingParentHelper;
import androidx.core.view.ViewCompat;
import com.sobot.widget.R;
import com.sobot.widget.refresh.layout.api.RefreshComponent;
import com.sobot.widget.refresh.layout.api.RefreshContent;
......
......@@ -4,10 +4,11 @@ import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import static androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP;
import static androidx.annotation.RestrictTo.Scope.SUBCLASSES;
import android.view.View;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import android.view.View;
import com.sobot.widget.refresh.layout.constant.SpinnerStyle;
import com.sobot.widget.refresh.layout.listener.OnStateChangedListener;
......
package com.sobot.widget.refresh.layout.api;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import androidx.annotation.NonNull;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.NonNull;
import com.sobot.widget.refresh.layout.listener.ScrollBoundaryDecider;
/**
......
package com.sobot.widget.refresh.layout.api;
import android.animation.ValueAnimator;
import androidx.annotation.NonNull;
import androidx.annotation.NonNull;
import com.sobot.widget.refresh.layout.constant.RefreshState;
......
package com.sobot.widget.refresh.layout.api;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.FloatRange;
import androidx.annotation.IdRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import com.sobot.widget.refresh.layout.constant.RefreshState;
import com.sobot.widget.refresh.layout.listener.OnLoadMoreListener;
......
......@@ -7,6 +7,7 @@ import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
/**
......
......@@ -4,6 +4,7 @@ import android.graphics.Canvas;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import com.sobot.widget.refresh.layout.drawable.PaintDrawable;
......
......@@ -7,17 +7,18 @@ import android.graphics.Bitmap;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import com.sobot.widget.R;
import com.sobot.widget.refresh.layout.api.RefreshComponent;
import com.sobot.widget.refresh.layout.api.RefreshKernel;
......
......@@ -2,13 +2,14 @@ package com.sobot.widget.refresh.layout.footer;
import android.content.Context;
import android.content.res.TypedArray;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.widget.RelativeLayout;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import com.sobot.widget.R;
import com.sobot.widget.refresh.layout.api.RefreshFooter;
import com.sobot.widget.refresh.layout.api.RefreshLayout;
......
......@@ -6,11 +6,6 @@ import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.TypedArray;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
......@@ -19,6 +14,12 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import com.sobot.widget.R;
import com.sobot.widget.refresh.layout.api.RefreshHeader;
import com.sobot.widget.refresh.layout.api.RefreshLayout;
......@@ -33,7 +34,6 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/**
* 经典下拉头部
......
package com.sobot.widget.refresh.layout.listener;
import android.content.Context;
import androidx.annotation.NonNull;
import com.sobot.widget.refresh.layout.api.RefreshFooter;
......
package com.sobot.widget.refresh.layout.listener;
import android.content.Context;
import androidx.annotation.NonNull;
import com.sobot.widget.refresh.layout.api.RefreshHeader;
......
package com.sobot.widget.refresh.layout.listener;
import android.content.Context;
import androidx.annotation.NonNull;
import com.sobot.widget.refresh.layout.api.RefreshLayout;
......
......@@ -4,14 +4,15 @@ import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import androidx.annotation.ColorInt;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.sobot.widget.refresh.layout.SobotRefreshLayout;
import com.sobot.widget.refresh.layout.api.RefreshComponent;
import com.sobot.widget.refresh.layout.api.RefreshFooter;
......
......@@ -6,13 +6,6 @@ import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
import android.content.res.Resources;
import android.graphics.PointF;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.core.view.NestedScrollingChild;
import androidx.core.view.NestedScrollingParent;
import androidx.core.view.ScrollingView;
import androidx.viewpager.widget.ViewPager;
import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
......@@ -21,6 +14,14 @@ import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.ScrollView;
import androidx.annotation.NonNull;
import androidx.core.view.NestedScrollingChild;
import androidx.core.view.NestedScrollingParent;
import androidx.core.view.ScrollingView;
import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.RecyclerView;
import androidx.viewpager.widget.ViewPager;
import com.sobot.widget.R;
import com.sobot.widget.refresh.layout.api.RefreshComponent;
......
......@@ -9,10 +9,6 @@ import static com.sobot.widget.refresh.layout.util.SmartUtil.scrollListBy;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.graphics.PointF;
import androidx.annotation.NonNull;
import androidx.core.view.NestedScrollingChild;
import androidx.core.view.NestedScrollingParent;
import androidx.viewpager.widget.ViewPager;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
......@@ -21,6 +17,11 @@ import android.widget.AbsListView;
import android.widget.FrameLayout;
import android.widget.Space;
import androidx.annotation.NonNull;
import androidx.core.view.NestedScrollingChild;
import androidx.core.view.NestedScrollingParent;
import androidx.viewpager.widget.ViewPager;
import com.sobot.widget.R;
import com.sobot.widget.refresh.layout.api.RefreshContent;
import com.sobot.widget.refresh.layout.api.RefreshKernel;
......
......@@ -16,12 +16,13 @@
package com.sobot.widget.ui.calenderview;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
......
......@@ -19,12 +19,13 @@ package com.sobot.widget.ui.calenderview;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Paint;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import androidx.annotation.Nullable;
import java.util.List;
/**
......
......@@ -26,8 +26,6 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Parcelable;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
......@@ -38,6 +36,9 @@ import android.view.animation.LinearInterpolator;
import android.widget.AbsListView;
import android.widget.LinearLayout;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;
import com.sobot.widget.R;
......
......@@ -20,9 +20,6 @@ import android.animation.AnimatorListenerAdapter;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
......@@ -30,6 +27,10 @@ import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.FrameLayout;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.ViewPager;
import com.sobot.widget.R;
import java.lang.reflect.Constructor;
......
......@@ -18,10 +18,10 @@ package com.sobot.widget.ui.calenderview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Color;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import com.sobot.widget.R;
......
......@@ -17,14 +17,15 @@ package com.sobot.widget.ui.calenderview;
import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import java.lang.reflect.Constructor;
import java.util.List;
......
......@@ -15,10 +15,6 @@
*/
package com.sobot.widget.ui.calenderview;
import android.content.Context;
import com.sobot.widget.R;
/**
* http://www.cnblogs.com/moodlxs/archive/2010/12/18/2345392.html
* 24节气计算公式,参考该博客实现
......
......@@ -17,14 +17,15 @@ package com.sobot.widget.ui.calenderview;
import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import java.lang.reflect.Constructor;
import java.util.List;
......
......@@ -16,10 +16,11 @@
package com.sobot.widget.ui.calenderview;
import android.content.Context;
import android.util.AttributeSet;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.AttributeSet;
/**
......
......@@ -20,11 +20,12 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import java.util.List;
/**
......
......@@ -16,11 +16,12 @@
package com.sobot.widget.ui.calenderview;
import android.content.Context;
import androidx.recyclerview.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.RecyclerView;
import java.lang.reflect.Constructor;
final class YearViewAdapter extends BaseRecyclerAdapter<Month> {
......
......@@ -17,9 +17,6 @@ package com.sobot.widget.ui.calenderview;
import android.annotation.SuppressLint;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.util.AttributeSet;
import android.view.Display;
import android.view.MotionEvent;
......@@ -27,6 +24,10 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
/**
......
......@@ -2,11 +2,12 @@ package com.sobot.widget.ui.rich;
import android.app.Activity;
import android.content.Context;
import androidx.core.app.ShareCompat;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.view.View;
import androidx.core.app.ShareCompat;
public class EmailSpan extends ClickableSpan {
......
......@@ -5,13 +5,14 @@ import android.app.Activity;
import android.graphics.Color;
import android.os.Build;
import android.os.Environment;
import androidx.annotation.ColorInt;
import androidx.annotation.IdRes;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import androidx.annotation.ColorInt;
import androidx.annotation.IdRes;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
......
......@@ -2,10 +2,11 @@ package com.sobot.widget.ui.statusbar;
import android.content.Context;
import android.os.Build;
import androidx.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
/**
* @author 黄浩杭 (huanghaohang@parkingwang.com)
* @version 2017-11-21 0.7
......
......@@ -3,6 +3,7 @@ package com.sobot.widget.ui.utils;
import android.content.Context;
import android.graphics.Color;
import android.os.Environment;
import androidx.core.content.ContextCompat;
import java.io.BufferedReader;
......
......@@ -10,8 +10,9 @@ import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.provider.MediaStore;
import androidx.fragment.app.Fragment;
import androidx.core.content.FileProvider;
import androidx.fragment.app.Fragment;
import com.sobot.utils.SobotIOUtils;
import com.sobot.widget.ui.SobotBaseConstant;
......
......@@ -16,7 +16,7 @@
<string name="sobot_srl_header_loading">Wait For Loading…</string>
<string name="sobot_srl_header_finish">Refresh Success</string>
<string name="sobot_srl_header_failed">Refresh Failed</string>
<string name="sobot_srl_header_update">\'Last Update\' %s</string>
<string name="sobot_srl_header_update">Last Update %s</string>
<string name="sobot_srl_header_secondary">Release To Second Floor</string>
<string name="sobot_no_data_string">No data</string>
......
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<resources>
<string name="sobot_sun">Sun</string>
<string name="sobot_mon">Mon</string>
......
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<resources>
<string name="sobot_sun"></string>
<string name="sobot_mon"></string>
......
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