package com.gh0u1l5.wechatmagician.frontend

import android.content.ContentProvider
import android.content.ContentValues
import android.content.Context.MODE_PRIVATE
import android.content.SharedPreferences
import android.database.Cursor
import android.database.MatrixCursor
import android.net.Uri
import com.gh0u1l5.wechatmagician.Global.PREFERENCE_NAME_DEVELOPER
import com.gh0u1l5.wechatmagician.Global.PREFERENCE_NAME_SETTINGS
import com.gh0u1l5.wechatmagician.util.IPCUtil.getProtectedSharedPreferences // PrefProvider shares the preferences using content provider model.
class PrefProvider : ContentProvider() { private val preferences: MutableMap<String, SharedPreferences> = mutableMapOf() private fun getPreferenceType(value: Any?): String {
return when (value) {
null -> "Null"
is Int -> "Int"
is Long -> "Long"
is Float -> "Float"
is Boolean -> "Boolean"
is String -> "String"
is Set<*> -> "StringSet"
else -> "${value::class.java}"
}
} override fun onCreate(): Boolean {
preferences[PREFERENCE_NAME_SETTINGS] =
context.getProtectedSharedPreferences(PREFERENCE_NAME_SETTINGS, MODE_PRIVATE)
preferences[PREFERENCE_NAME_DEVELOPER] =
context.getProtectedSharedPreferences(PREFERENCE_NAME_DEVELOPER, MODE_PRIVATE)
return true
} override fun getType(uri: Uri?): String? = null override fun insert(uri: Uri?, values: ContentValues?): Uri {
throw UnsupportedOperationException("Wechat Magician PrefProvider: Cannot modify read-only preferences!")
} override fun query(uri: Uri?, projection: Array<out String>?, selection: String?,
selectionArgs: Array<out String>?, sortOrder: String?): Cursor? {
if (uri == null) {
return null
}
val segments = uri.pathSegments
if (segments.size != 1) {
return null
}
val preference = preferences[segments[0]] ?: return null
return MatrixCursor(arrayOf("key", "value", "type")).apply {
preference.all.forEach { entry ->
val type = getPreferenceType(entry.value)
addRow(arrayOf(entry.key, entry.value, type))
}
}
} override fun update(uri: Uri?, values: ContentValues?, selection: String?,
selectionArgs: Array<out String>?): Int {
throw UnsupportedOperationException("Wechat Magician PrefProvider: Cannot modify read-only preferences!")
} override fun delete(uri: Uri?, selection: String?,
selectionArgs: Array<out String>?): Int {
throw UnsupportedOperationException("Wechat Magician PrefProvider: Cannot modify read-only preferences!")
}
}

prefProvider.kt的更多相关文章

  1. 项目总结笔记系列 Social Hub KT Session2

    KT Session2: 主要是代码的实现(KT is knowledge Transfer) 如图所示,在整个Social Hub项目中,我们的项目Data Feed Service处于承上启下的作 ...

  2. KT vs SKT [20160816]

    KT:索尔 SKT:茂凯,塔里克,卡西奥佩娅 普朗克+烬,大招开团. 塔里克保护,眩晕.

  3. KT板

    前言 好吧,我是学计算机的,现在的职位是网站美工,只是自己学了点PS.AI的,其实对材质什么的也不太了解.以下的一些信息,基本都是自己先网上查,最后找厂商确认的,不能保证完全精确,但求基本符合事实. ...

  4. 阿里开源 KT Connnect,轻量级云原生测试环境治理平台来啦!

    作者| 阿里云技术专家 郑云龙(砧木) 目前越来越多的开发者开始采纳 Kubernetes 管理基础设施环境,并通过 Kubernetes 完成日常的开发,测试以及生产发布活动,为了能够有效的帮助开发 ...

  5. 模型监控指标- 混淆矩阵、ROC曲线,AUC值,KS曲线以及KS值、PSI值,Lift图,Gain图,KT值,迁移矩阵

    1. 混淆矩阵 确定截断点后,评价学习器性能 假设训练之初以及预测后,一个样本是正例还是反例是已经确定的,这个时候,样本应该有两个类别值,一个是真实的0/1,一个是预测的0/1 TP(实际为正预测为正 ...

  6. 软件工程导论-目录-K-T+RJ大

    目录 10 第1章 软件工程学概述/1 19 1.1 软件危机/1 19 1.1.1 软件危机的介绍/1 19 1.1.2 产生软件危机的原因/3 21 1.1.3 消除软件危机的途径/4 22 1. ...

  7. Social Media POC KT Session

    地址: 1. http://c0048925.itcs.hp.com:8080/datamining/report/brandfocus.html Social Media POC是针对Social ...

  8. 项目总结笔记系列 wsTax KT Session1

     项目总结笔记 1.专有名词解释: SMO, Separate Management Office. UAT, User Accept Test. GSLB, Global Server Load B ...

  9. 项目总结笔记系列 Autonomy IDOL Server KT Session1

    在说上面这个图之前,先说一下背景知识. Autonomy地址: http://www.autonomy.com.cn http://www.autonomy.com.cn/content/home/i ...

随机推荐

  1. leetCode53. 最大子序和

    示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 进阶: /** * @param {number[]} nu ...

  2. VS 编译通过后 链接提示 无法使用的外部符号

    1. 检查是否已经链接了需要的.lib静态库,如果是自己定义的头文件,检查cpp文件是否添加到了VS工程里 2. 头文件尽量不要包含其他头文件,容易造成包含混乱,如头文件里使用了自定义的类名,最好只用 ...

  3. LeetCode 145. Binary Tree Postorder Traversal 二叉树的后序遍历 C++

    Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [,,] \ / O ...

  4. LeetCode 144. Binary Tree Preorder Traversal 二叉树的前序遍历 C++

    Given a binary tree, return the preorder traversal of its nodes' values. Example: Input: [,,] \ / Ou ...

  5. Timer与TimerTask

    Timer和TimerTask Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次.TimerTask一个抽象类,它的子类代表一个可以被Timer计划 ...

  6. Spark sql 在yarn-cluster模式下找不到表

    在hive里建一个数据库test,在数据库里建了一张表user,然后在Spark程序中使用Spark sql读取这张表 "select * form test.user" 当部署模 ...

  7. Vue note

    1.npm run build 时,font:xx/xx "xxxx" 这种样式打包后会无效,只能写成font-size:xxx; line-height:xxx; font-fa ...

  8. leetcode125. Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  9. Spring再接触 集合注入

    beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  10. 【C++】C++string类总结

    一.string的初始化 首先,为了在程序中使用string类型,必须包含头文件 <string>.如下: #include <string> 注意这里不是string.h,s ...