commit 42a5885e5732ef869d246faa1d11a38de2e07ea4
Author: rjh <1409667648@qq.com>
Date: Sat Sep 19 23:13:07 2020 +0800
前期文件与源码
diff --git a/doc/XPrivacy Analysis.pdf b/doc/XPrivacy Analysis.pdf
new file mode 100644
index 0000000..dfbe04a
Binary files /dev/null and b/doc/XPrivacy Analysis.pdf differ
diff --git a/resources/XposedBridgeApi-82.jar b/resources/XposedBridgeApi-82.jar
new file mode 100644
index 0000000..eec212f
Binary files /dev/null and b/resources/XposedBridgeApi-82.jar differ
diff --git a/src/FakeLocation-master/FakeLocation-master/.gitignore b/src/FakeLocation-master/FakeLocation-master/.gitignore
new file mode 100644
index 0000000..09b993d
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/.gitignore
@@ -0,0 +1,8 @@
+*.iml
+.gradle
+/local.properties
+/.idea
+.DS_Store
+/build
+/captures
+.externalNativeBuild
diff --git a/src/FakeLocation-master/FakeLocation-master/.project b/src/FakeLocation-master/FakeLocation-master/.project
new file mode 100644
index 0000000..908a7af
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/.project
@@ -0,0 +1,17 @@
+
+
+ FakeLocation-master
+ Project FakeLocation-master created by Buildship.
+
+
+
+
+ org.eclipse.buildship.core.gradleprojectbuilder
+
+
+
+
+
+ org.eclipse.buildship.core.gradleprojectnature
+
+
diff --git a/src/FakeLocation-master/FakeLocation-master/.settings/org.eclipse.buildship.core.prefs b/src/FakeLocation-master/FakeLocation-master/.settings/org.eclipse.buildship.core.prefs
new file mode 100644
index 0000000..6b905d3
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/.settings/org.eclipse.buildship.core.prefs
@@ -0,0 +1,13 @@
+arguments=
+auto.sync=false
+build.scans.enabled=false
+connection.gradle.distribution=GRADLE_DISTRIBUTION(WRAPPER)
+connection.project.dir=
+eclipse.preferences.version=1
+gradle.user.home=
+java.home=C\:/Program Files/Java/jdk-13.0.1
+jvm.arguments=
+offline.mode=false
+override.workspace.settings=true
+show.console.view=true
+show.executions.view=true
diff --git a/src/FakeLocation-master/FakeLocation-master/app/.gitignore b/src/FakeLocation-master/FakeLocation-master/app/.gitignore
new file mode 100644
index 0000000..796b96d
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/src/FakeLocation-master/FakeLocation-master/app/build.gradle b/src/FakeLocation-master/FakeLocation-master/app/build.gradle
new file mode 100644
index 0000000..c1c61f0
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/build.gradle
@@ -0,0 +1,40 @@
+apply plugin: 'com.android.application'
+
+def releaseAppName() {
+ return "FakeLocation"
+}
+
+android {
+ compileSdkVersion 28
+ defaultConfig {
+ applicationId "com.xposed.hook"
+ minSdkVersion 15
+ targetSdkVersion 23
+ versionCode 3
+ versionName "1.0.3"
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ applicationVariants.all {
+ variant ->
+ variant.outputs.each {
+ output -> output.outputFileName = "${releaseAppName()}_v${defaultConfig.versionName}.apk"
+ }
+ }
+ }
+ }
+ lintOptions {
+ checkReleaseBuilds false
+ }
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+}
+
+dependencies {
+ implementation 'com.android.support:appcompat-v7:28.0.0'
+ implementation 'com.android.support:design:28.0.0'
+ compileOnly 'de.robv.android.xposed:api:82'
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/proguard-rules.pro b/src/FakeLocation-master/FakeLocation-master/app/proguard-rules.pro
new file mode 100644
index 0000000..9786e21
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/proguard-rules.pro
@@ -0,0 +1,25 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in D:\Android\sdk/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/AndroidManifest.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..d18a28c
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/AndroidManifest.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/assets/xposed_init b/src/FakeLocation-master/FakeLocation-master/app/src/main/assets/xposed_init
new file mode 100644
index 0000000..f358a50
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/assets/xposed_init
@@ -0,0 +1 @@
+com.xposed.hook.Main
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/LuckMoneySetting.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/LuckMoneySetting.java
new file mode 100644
index 0000000..bf48b9b
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/LuckMoneySetting.java
@@ -0,0 +1,101 @@
+package com.xposed.hook;
+
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.view.View;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+
+import com.xposed.hook.wechat.LuckyMoneyHook;
+
+/**
+ * Created by lin on 2018/2/4.
+ */
+
+public class LuckMoneySetting extends AppCompatActivity {
+
+ private CompoundButton cb;
+ private CompoundButton cb2;
+ private CompoundButton cb3;
+ private CompoundButton cb4;
+ private EditText et_lucky_money_delay;
+
+ private SharedPreferences sp;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_lucky_money_setting);
+ setTitle(R.string.wechat_hook);
+ cb = (CompoundButton) findViewById(R.id.cb);
+ cb2 = (CompoundButton) findViewById(R.id.cb2);
+ cb3 = (CompoundButton) findViewById(R.id.cb3);
+ cb4 = (CompoundButton) findViewById(R.id.cb4);
+ et_lucky_money_delay = findViewById(R.id.et_lucky_money_delay);
+ sp = getSharedPreferences("lucky_money", MODE_WORLD_READABLE);
+ cb.setChecked(sp.getBoolean("quick_open", true));
+ cb2.setChecked(sp.getBoolean("auto_receive", true));
+ cb3.setChecked(sp.getBoolean("recalled", true));
+ cb4.setChecked(sp.getBoolean("3_days_Moments", false));
+ et_lucky_money_delay.setText(String.valueOf(sp.getInt("lucky_money_delay", 0)));
+ cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ sp.edit().putBoolean("quick_open", isChecked).commit();
+ }
+ });
+ cb2.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ sp.edit().putBoolean("auto_receive", isChecked).commit();
+ }
+ });
+ cb3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ sp.edit().putBoolean("recalled", isChecked).commit();
+ }
+ });
+ cb4.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ sp.edit().putBoolean("3_days_Moments", isChecked).commit();
+ }
+ });
+ findViewById(R.id.btn_reboot_app).setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ saveLuckyMoneyDelay();
+ try {
+ Intent intent = new Intent();
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ intent.setData(Uri.fromParts("package", LuckyMoneyHook.WECHAT_PACKAGE_NAME, null));
+ startActivity(intent);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ });
+ }
+
+ @Override
+ public void finish() {
+ super.finish();
+ saveLuckyMoneyDelay();
+ }
+
+ private void saveLuckyMoneyDelay() {
+ try {
+ int delay = Integer.parseInt(et_lucky_money_delay.getText().toString());
+ sp.edit().putInt("lucky_money_delay", delay).commit();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/Main.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/Main.java
new file mode 100644
index 0000000..1d02ffa
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/Main.java
@@ -0,0 +1,46 @@
+package com.xposed.hook;
+
+import android.util.Log;
+
+import com.xposed.hook.config.Constants;
+import com.xposed.hook.config.PkgConfig;
+import com.xposed.hook.location.LocationHook;
+import com.xposed.hook.wechat.LuckyMoneyHook;
+
+import de.robv.android.xposed.IXposedHookLoadPackage;
+import de.robv.android.xposed.XSharedPreferences;
+import de.robv.android.xposed.callbacks.XC_LoadPackage;
+
+/**
+ * Created by lin on 2017/7/22.
+ */
+
+public class Main implements IXposedHookLoadPackage {
+
+ @Override
+ public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
+ Log.e("***********************", loadPackageParam.packageName);
+ LuckyMoneyHook.hook(loadPackageParam);
+ XSharedPreferences preferences = new XSharedPreferences("com.xposed.hook", Constants.PREF_FILE_NAME);
+ if (preferences.getBoolean(loadPackageParam.packageName, false)) {
+ String defaultLatitude = Constants.DEFAULT_LATITUDE;
+ String defaultLongitude = Constants.DEFAULT_LONGITUDE;
+ if (PkgConfig.pkg_dingtalk.equals(loadPackageParam.packageName)) {
+ defaultLatitude = "0";
+ defaultLongitude = "0";
+ }
+ String prefix = loadPackageParam.packageName + "_";
+ double latitude = 0;
+ double longitude = 0;
+ try {
+ latitude = Double.parseDouble(preferences.getString(prefix + "latitude", defaultLatitude));
+ longitude = Double.parseDouble(preferences.getString(prefix + "longitude", defaultLongitude));
+ } catch (NumberFormatException e) {
+ e.printStackTrace();
+ }
+ int lac = preferences.getInt(prefix + "lac", Constants.DEFAULT_LAC);
+ int cid = preferences.getInt(prefix + "cid", Constants.DEFAULT_CID);
+ LocationHook.hookAndChange(loadPackageParam, latitude, longitude, lac, cid);
+ }
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/MainActivity.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/MainActivity.java
new file mode 100644
index 0000000..cfeb432
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/MainActivity.java
@@ -0,0 +1,96 @@
+package com.xposed.hook;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.v7.app.AppCompatActivity;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.TextView;
+
+import com.xposed.hook.entity.AppInfo;
+import com.xposed.hook.utils.AppUtil;
+import com.xposed.hook.utils.ViewHolder;
+
+import java.io.Serializable;
+import java.util.List;
+
+public class MainActivity extends AppCompatActivity {
+
+ private ListView lv;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_main);
+ lv = (ListView) findViewById(R.id.lv);
+ lv.setAdapter(new MyAdapter(getApplicationContext()));
+ lv.setOnItemClickListener((parent, view, position, id) -> {
+ startActivity(new Intent(this, RimetActivity.class)
+ .putExtra("appInfo", (Serializable) lv.getAdapter().getItem(position)));
+ });
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ inflater.inflate(R.menu.menu_main, menu);
+ return super.onCreateOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int id = item.getItemId();
+ if (id == R.id.item_luck_money) {
+ startActivity(new Intent(this, LuckMoneySetting.class));
+ return true;
+ } else {
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private static class MyAdapter extends BaseAdapter {
+
+ private List list;
+
+ public MyAdapter(Context context) {
+ list = AppUtil.getAppList(context);
+ }
+
+ @Override
+ public int getCount() {
+ return list.size();
+ }
+
+ @Override
+ public AppInfo getItem(int position) {
+ return list.get(position);
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ @Override
+ public View getView(int position, View convertView, ViewGroup parent) {
+ if (convertView == null)
+ convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_package, parent, false);
+ ImageView iv_icon = ViewHolder.get(convertView, R.id.iv_icon);
+ TextView tv_title = ViewHolder.get(convertView, R.id.tv_title);
+ TextView tv_package = ViewHolder.get(convertView, R.id.tv_package);
+ AppInfo pkg = list.get(position);
+ iv_icon.setImageDrawable(pkg.icon);
+ tv_title.setText(pkg.title);
+ tv_package.setText(pkg.packageName);
+ return convertView;
+ }
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/RimetActivity.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/RimetActivity.java
new file mode 100644
index 0000000..18d033b
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/RimetActivity.java
@@ -0,0 +1,269 @@
+package com.xposed.hook;
+
+import android.Manifest;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.location.Location;
+import android.location.LocationListener;
+import android.location.LocationManager;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.annotation.NonNull;
+import android.support.design.widget.TabLayout;
+import android.support.v4.app.ActivityCompat;
+import android.support.v7.app.AppCompatActivity;
+import android.telephony.CellLocation;
+import android.telephony.PhoneStateListener;
+import android.telephony.TelephonyManager;
+import android.telephony.gsm.GsmCellLocation;
+import android.view.View;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.xposed.hook.config.Constants;
+import com.xposed.hook.config.PkgConfig;
+import com.xposed.hook.entity.AppInfo;
+
+public class RimetActivity extends AppCompatActivity implements View.OnClickListener {
+
+ private SharedPreferences sp;
+
+ private TabLayout tabLayout;
+ private TabLayout.Tab gpsTab;
+ private TabLayout.Tab cellTab;
+
+ private View ll_gps;
+ private EditText etLatitude;
+ private EditText etLongitude;
+ private TextView tvLatitude;
+ private TextView tvLongitude;
+ private Button btnAutoFillGps;
+
+ private View ll_cell;
+ private EditText etLac;
+ private EditText etCid;
+ private TextView tvLac;
+ private TextView tvCid;
+ private Button btnAutoFillCell;
+
+ private CompoundButton cb;
+
+ private AppInfo appInfo;
+ private boolean isDingTalk;
+
+ TelephonyManager tm;
+ GsmCellLocation l;
+ LocationManager lm;
+ Location gpsL;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ appInfo = (AppInfo) getIntent().getSerializableExtra("appInfo");
+ if (appInfo == null)
+ return;
+ setContentView(R.layout.activity_rimet);
+ setTitle(appInfo.title);
+ isDingTalk = PkgConfig.pkg_dingtalk.equals(appInfo.packageName);
+ tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
+ lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
+
+ String prefix = appInfo.packageName + "_";
+ sp = getSharedPreferences(Constants.PREF_FILE_NAME, MODE_WORLD_READABLE);
+ String defaultLatitude = Constants.DEFAULT_LATITUDE;
+ String defaultLongitude = Constants.DEFAULT_LONGITUDE;
+ if (isDingTalk) {
+ defaultLatitude = "";
+ defaultLongitude = "";
+ }
+
+ ll_gps = findViewById(R.id.ll_gps);
+ etLatitude = (EditText) findViewById(R.id.et_latitude);
+ etLongitude = (EditText) findViewById(R.id.et_longitude);
+ tvLatitude = (TextView) findViewById(R.id.tv_latitude);
+ tvLongitude = (TextView) findViewById(R.id.tv_longitude);
+ btnAutoFillGps = (Button) findViewById(R.id.btn_auto_fill_gps);
+ etLatitude.setText(sp.getString(prefix + "latitude", defaultLatitude));
+ etLongitude.setText(sp.getString(prefix + "longitude", defaultLongitude));
+ btnAutoFillGps.setOnClickListener(this);
+
+ ll_cell = findViewById(R.id.ll_cell);
+ etLac = (EditText) findViewById(R.id.et_lac);
+ etCid = (EditText) findViewById(R.id.et_cid);
+ tvLac = (TextView) findViewById(R.id.tv_lac);
+ tvCid = (TextView) findViewById(R.id.tv_cid);
+ btnAutoFillCell = (Button) findViewById(R.id.btn_auto_fill_cell);
+ int lac = sp.getInt(prefix + "lac", Constants.DEFAULT_LAC);
+ int cid = sp.getInt(prefix + "cid", Constants.DEFAULT_CID);
+ if (lac != Constants.DEFAULT_LAC)
+ etLac.setText(String.valueOf(lac));
+ if (cid != Constants.DEFAULT_CID)
+ etCid.setText(String.valueOf(cid));
+ btnAutoFillCell.setOnClickListener(this);
+
+ initTabLayout();
+ cb = (CompoundButton) findViewById(R.id.cb);
+ cb.setChecked(sp.getBoolean(appInfo.packageName, false));
+ findViewById(R.id.btn_save).setOnClickListener(this);
+ findViewById(R.id.btn_reboot_app).setOnClickListener(this);
+
+ requestPermissions();
+ }
+
+ private void initTabLayout() {
+ tabLayout = (TabLayout) findViewById(R.id.tab_layout);
+ gpsTab = tabLayout.newTab().setText(R.string.gps_location);
+ cellTab = tabLayout.newTab().setText(R.string.cell_location);
+ if (isDingTalk) {
+ tabLayout.addTab(cellTab);
+ tabLayout.addTab(gpsTab);
+ ll_gps.setVisibility(View.GONE);
+ } else {
+ tabLayout.addTab(gpsTab);
+ tabLayout.addTab(cellTab);
+ ll_cell.setVisibility(View.GONE);
+ }
+ tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
+ @Override
+ public void onTabSelected(TabLayout.Tab tab) {
+ ll_gps.setVisibility(tab == gpsTab ? View.VISIBLE : View.GONE);
+ ll_cell.setVisibility(tab == gpsTab ? View.GONE : View.VISIBLE);
+ }
+
+ @Override
+ public void onTabUnselected(TabLayout.Tab tab) {
+
+ }
+
+ @Override
+ public void onTabReselected(TabLayout.Tab tab) {
+
+ }
+ });
+ }
+
+ @Override
+ public void onClick(View v) {
+ int id = v.getId();
+ switch (id) {
+ case R.id.btn_auto_fill_cell:
+ etLac.setText(String.valueOf(l.getLac()));
+ etCid.setText(String.valueOf(l.getCid()));
+ break;
+ case R.id.btn_auto_fill_gps:
+ etLatitude.setText(String.valueOf(gpsL.getLatitude()));
+ etLongitude.setText(String.valueOf(gpsL.getLongitude()));
+ break;
+ case R.id.btn_save:
+ String prefix = appInfo.packageName + "_";
+ sp.edit().putString(prefix + "latitude", etLatitude.getText().toString())
+ .putString(prefix + "longitude", etLongitude.getText().toString())
+ .putInt(prefix + "lac", parseInt(etLac.getText().toString()))
+ .putInt(prefix + "cid", parseInt(etCid.getText().toString()))
+ .putBoolean(appInfo.packageName, cb.isChecked())
+ .commit();
+ Toast.makeText(getApplicationContext(), R.string.save_success, Toast.LENGTH_SHORT).show();
+ break;
+ case R.id.btn_reboot_app:
+ try {
+ Intent intent = new Intent();
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ intent.setData(Uri.fromParts("package", appInfo.packageName, null));
+ startActivity(intent);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ break;
+ }
+ }
+
+ private int parseInt(String str) {
+ try {
+ return Integer.parseInt(str);
+ } catch (Exception e) {
+ return -1;
+ }
+ }
+
+ @Override
+ public void finish() {
+ stopLocation();
+ super.finish();
+ }
+
+ PhoneStateListener listener = new PhoneStateListener() {
+
+ @Override
+ public void onCellLocationChanged(CellLocation location) {
+ if (location instanceof GsmCellLocation) {
+ l = (GsmCellLocation) location;
+ tvLac.setText(getString(R.string.current_lac, String.valueOf(l.getLac())));
+ tvCid.setText(getString(R.string.current_cid, String.valueOf(l.getCid())));
+ btnAutoFillCell.setVisibility(View.VISIBLE);
+ }
+ }
+ };
+
+ LocationListener gpsListener = new LocationListener() {
+ @Override
+ public void onLocationChanged(Location location) {
+ gpsL = location;
+ tvLatitude.setText(getString(R.string.current_latitude, String.valueOf(location.getLatitude())));
+ tvLongitude.setText(getString(R.string.current_longitude, String.valueOf(location.getLongitude())));
+ btnAutoFillGps.setVisibility(View.VISIBLE);
+ }
+
+ @Override
+ public void onStatusChanged(String provider, int status, Bundle extras) {
+
+ }
+
+ @Override
+ public void onProviderEnabled(String provider) {
+
+ }
+
+ @Override
+ public void onProviderDisabled(String provider) {
+
+ }
+ };
+
+ private void requestPermissions() {
+ if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION,
+ Manifest.permission.ACCESS_FINE_LOCATION}, 101);
+ return;
+ }
+ startLocation();
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ if (requestCode == 101 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ startLocation();
+ }
+ }
+
+ private void startLocation() {
+ tm.listen(listener, PhoneStateListener.LISTEN_CELL_LOCATION);
+ if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
+ && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
+ lm.requestSingleUpdate(LocationManager.GPS_PROVIDER, gpsListener, null);
+ }
+
+ private void stopLocation() {
+ tm.listen(listener, PhoneStateListener.LISTEN_NONE);
+ lm.removeUpdates(gpsListener);
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/config/Constants.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/config/Constants.java
new file mode 100644
index 0000000..6aaacd0
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/config/Constants.java
@@ -0,0 +1,11 @@
+package com.xposed.hook.config;
+
+public class Constants {
+
+ public static final String PREF_FILE_NAME = "location";
+
+ public static final String DEFAULT_LATITUDE = "34.752600";
+ public static final String DEFAULT_LONGITUDE = "113.662000";
+ public static final int DEFAULT_LAC = -1;
+ public static final int DEFAULT_CID = -1;
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/config/PkgConfig.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/config/PkgConfig.java
new file mode 100644
index 0000000..3ab5c8e
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/config/PkgConfig.java
@@ -0,0 +1,23 @@
+package com.xposed.hook.config;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by lin on 2018/1/24.
+ */
+
+public class PkgConfig {
+
+ public static final List packages = new ArrayList<>();
+ public static final String pkg_dingtalk = "com.alibaba.android.rimet";
+
+ static {
+ packages.add("com.autonavi.minimap");
+ packages.add("com.team.club");
+ packages.add("com.baidu.BaiduMap");
+ packages.add("com.tencent.mm");
+ packages.add("com.tencent.mobileqq");
+ packages.add("com.sina.weibo");
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/entity/AppInfo.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/entity/AppInfo.java
new file mode 100644
index 0000000..c1e4f0b
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/entity/AppInfo.java
@@ -0,0 +1,12 @@
+package com.xposed.hook.entity;
+
+import android.graphics.drawable.Drawable;
+
+import java.io.Serializable;
+
+public class AppInfo implements Serializable {
+
+ public String title;
+ public String packageName;
+ public transient Drawable icon;
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/GPSStateline.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/GPSStateline.java
new file mode 100644
index 0000000..8f44b44
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/GPSStateline.java
@@ -0,0 +1,79 @@
+package com.xposed.hook.location;
+
+
+class GPSStateline {
+ private double mAzimuth;
+ private double mElevation;
+ private boolean mHasAlmanac;
+ private boolean mHasEphemeris;
+ private int mPnr;
+ private double mSnr;
+ private boolean mUseInFix;
+
+
+ public double getAzimuth() {
+ return this.mAzimuth;
+ }
+
+ public double getElevation() {
+ return this.mElevation;
+ }
+
+ public int getPnr() {
+ return this.mPnr;
+ }
+
+ public double getSnr() {
+ return this.mSnr;
+ }
+
+ public boolean isHasAlmanac() {
+ return this.mHasAlmanac;
+ }
+
+ public boolean isHasEphemeris() {
+ return this.mHasEphemeris;
+ }
+
+ public boolean isUseInFix() {
+ return this.mUseInFix;
+ }
+
+ public void setAzimuth(double azimuth) {
+ this.mAzimuth = azimuth;
+ }
+
+ public void setElevation(double elevation) {
+ this.mElevation = elevation;
+ }
+
+ public void setHasAlmanac(boolean hasAlmanac) {
+ this.mHasAlmanac = hasAlmanac;
+ }
+
+ public void setHasEphemeris(boolean hasEphemeris) {
+ this.mHasEphemeris = hasEphemeris;
+ }
+
+ public void setPnr(int pnr) {
+ this.mPnr = pnr;
+ }
+
+ public void setSnr(double snr) {
+ this.mSnr = snr;
+ }
+
+ public void setUseInFix(boolean useInFix) {
+ this.mUseInFix = useInFix;
+ }
+
+ public GPSStateline(int pnr, double snr, double elevation, double azimuth, boolean useInFix, boolean hasAlmanac, boolean hasEphemeris) {
+ this.mPnr = pnr;
+ this.mSnr = snr;
+ this.mElevation = elevation;
+ this.mAzimuth = azimuth;
+ this.mUseInFix = useInFix;
+ this.mHasAlmanac = hasAlmanac;
+ this.mHasEphemeris = hasEphemeris;
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationHandler.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationHandler.java
new file mode 100644
index 0000000..c3ed656
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationHandler.java
@@ -0,0 +1,154 @@
+package com.xposed.hook.location;
+
+import android.content.Context;
+import android.location.Location;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.os.SystemClock;
+import android.util.Log;
+
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Created by lin on 2017/8/6.
+ */
+
+public class LocationHandler extends Handler {
+
+ private static LocationHandler instance;
+ public static double latitude, longitude;
+
+ public static LocationHandler getInstance() {
+ if (instance == null) {
+ synchronized (LocationHandler.class) {
+ if (instance == null)
+ instance = new LocationHandler();
+ }
+ }
+ return instance;
+ }
+
+ private Context context;
+
+ private LocationHandler() {
+ super(Looper.getMainLooper());
+ }
+
+ public void attach(Context context) {
+ this.context = context;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ try {
+ Object transport = context.getSystemService(Context.LOCATION_SERVICE);
+ try {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ notifyGPSStatus(LocationManager.mGnssStatusListeners.get(transport));
+ notifyMNmeaListener(LocationManager.mGnssNmeaListeners.get(transport));
+ notifyGPSStatus(LocationManager.mGpsStatusListeners.get(transport));
+ notifyMNmeaListener(LocationManager.mGpsNmeaListeners.get(transport));
+ } else {
+ notifyGPSStatus(LocationManager.mGpsStatusListeners.get(transport));
+ notifyMNmeaListener(LocationManager.mNmeaListeners.get(transport));
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ notifyLocation(LocationManager.mListeners.get(transport));
+ sendEmptyMessageDelayed(0, 10000);
+ Log.e(LocationHook.TAG, "Avalon Hook Location Success");
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static Location createLocation(double latitude, double longitude) {
+ Location l = new Location(android.location.LocationManager.GPS_PROVIDER);
+ l.setLatitude(latitude);
+ l.setLongitude(longitude);
+ l.setAccuracy(8f);
+ l.setTime(System.currentTimeMillis());
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ l.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
+ }
+ Bundle extraBundle = new Bundle();
+ l.setExtras(extraBundle);
+ int svCount = VirtualGPSSatalines.get().getSvCount();
+ extraBundle.putInt("satellites", svCount);
+ extraBundle.putInt("satellitesvalue", svCount);
+ return l;
+ }
+
+ public static void updateLocation(Location location, double latitude, double longitude) {
+ location.setLatitude(latitude);
+ location.setLongitude(longitude);
+ location.setTime(System.currentTimeMillis());
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+ location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
+ }
+ }
+
+ public void start() {
+ removeMessages(0);
+ sendEmptyMessageDelayed(0, 1000);
+ }
+
+ private void notifyGPSStatus(Map listeners) {
+ if (listeners != null && !listeners.isEmpty()) {
+ //noinspection unchecked
+ Set entries = listeners.entrySet();
+ for (Map.Entry entry : entries) {
+ try {
+ Object value = entry.getValue();
+ if (value != null) {
+ MockLocationHelper.invokeSvStatusChanged(value);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+ private void notifyLocation(Map listeners) {
+ if (listeners != null && !listeners.isEmpty()) {
+ Location location = createLocation(latitude, longitude);
+ //noinspection unchecked
+ Set entries = listeners.entrySet();
+ for (Map.Entry entry : entries) {
+ Object value = entry.getValue();
+ if (value != null) {
+ try {
+ Log.e(LocationHook.TAG, value.toString());
+ LocationManager.ListenerTransport.onLocationChanged.call(value, location);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ }
+
+ private void notifyMNmeaListener(Map listeners) {
+ if (listeners != null && !listeners.isEmpty()) {
+ //noinspection unchecked
+ Set entries = listeners.entrySet();
+ for (Map.Entry entry : entries) {
+ try {
+ Object value = entry.getValue();
+ if (value != null) {
+ MockLocationHelper.invokeNmeaReceived(value);
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationHook.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationHook.java
new file mode 100644
index 0000000..ee87f39
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationHook.java
@@ -0,0 +1,234 @@
+package com.xposed.hook.location;
+
+import android.content.Context;
+import android.location.Location;
+import android.location.LocationListener;
+import android.os.Build;
+import android.telephony.PhoneStateListener;
+import android.util.Log;
+
+import com.xposed.hook.location.LocationHandler;
+import com.xposed.hook.location.PhoneStateListenerDelegate;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+import de.robv.android.xposed.XC_MethodHook;
+import de.robv.android.xposed.XposedBridge;
+import de.robv.android.xposed.XposedHelpers;
+import de.robv.android.xposed.callbacks.XC_LoadPackage;
+
+/**
+ * Created by lin on 2017/7/23.
+ */
+
+public class LocationHook {
+
+ public static String TAG = "LocationHook";
+
+ public static void hookAndChange(XC_LoadPackage.LoadPackageParam mLpp, final double latitude, final double longitude, final int lac, final int cid) {
+
+ Log.e(TAG, "Avalon Hook Location Test: " + mLpp.packageName);
+ LocationHandler.latitude = latitude;
+ LocationHandler.longitude = longitude;
+
+ hookMethod("android.content.ContextWrapper", mLpp.classLoader, "getApplicationContext", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ LocationHandler.getInstance().attach((Context) param.getResult());
+ }
+ });
+
+ hookMethod("android.net.wifi.WifiManager", mLpp.classLoader, "getScanResults",
+ new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param)
+ throws Throwable {
+ param.setResult(null);
+ }
+ });
+
+ hookMethod("android.telephony.TelephonyManager", mLpp.classLoader, "getCellLocation",
+ new XC_MethodHook() {
+ /**
+ * android.telephony.TelephonyManager的getCellLocation方法
+ * Returns the current location of the device.
+ * Return null if current location is not available.
+ */
+ @Override
+ protected void afterHookedMethod(MethodHookParam param)
+ throws Throwable {
+ param.setResult(null);
+ }
+ });
+
+ hookMethod("android.telephony.TelephonyManager", mLpp.classLoader, "getNeighboringCellInfo",
+ new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param)
+ throws Throwable {
+ param.setResult(null);
+ }
+ });
+
+ hookMethods("android.location.LocationManager", "requestLocationUpdates",
+ new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+
+ if (param.args[3] instanceof LocationListener) {
+ //位置监听器,当位置改变时会触发onLocationChanged方法
+ LocationListener ll = (LocationListener) param.args[3];
+ Log.e(TAG, "requestLocationUpdates::: args0: " + param.args[0] + "; arg1: " + param.args[1] + "; arg2: " + param.args[2]);
+ LocationHandler.getInstance().start();
+ }
+ }
+ });
+
+ hookMethod("android.location.LocationManager", mLpp.classLoader, "getLastLocation", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Location l = (Location) param.getResult();
+ if (l != null) {
+ LocationHandler.updateLocation(l, latitude, longitude);
+ param.setResult(l);
+ } else
+ param.setResult(LocationHandler.createLocation(latitude, longitude));
+ }
+ });
+
+ hookMethods("android.location.LocationManager", "getLastKnownLocation", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Location l = (Location) param.getResult();
+ if (l != null) {
+ LocationHandler.updateLocation(l, latitude, longitude);
+ param.setResult(l);
+ } else
+ param.setResult(LocationHandler.createLocation(latitude, longitude));
+ }
+ });
+
+ hookMethod("android.location.Location", mLpp.classLoader, "getLatitude", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ param.setResult(latitude);
+ }
+ });
+
+ hookMethod("android.location.Location", mLpp.classLoader, "getLongitude", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ param.setResult(longitude);
+ }
+ });
+
+ hookMethod("android.net.wifi.WifiInfo", mLpp.classLoader, "getMacAddress", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ param.setResult("00-00-00-00-00-00-00-E0");
+ }
+ });
+
+ hookMethod("android.net.wifi.WifiInfo", mLpp.classLoader, "getSSID", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ param.setResult(null);
+ }
+ });
+
+ hookMethod("android.net.wifi.WifiInfo", mLpp.classLoader, "getBSSID", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ param.setResult("00:00:00:00:00:00");
+ }
+ });
+
+ hookMethods("android.telephony.TelephonyManager", "getSimState", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Log.e(TAG, "getSimState");
+ param.setResult(0);
+ }
+ });
+
+ hookMethods("android.location.LocationManager", "getBestProvider", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Log.e(TAG, "getBestProvider");
+ param.setResult("gps");
+ }
+ });
+
+ hookMethods("android.location.LocationManager", "getProviders", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Log.e(TAG, "getProviders");
+ }
+ });
+
+ hookMethods("android.location.LocationManager", "isProviderEnabled", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Log.e(TAG, "isProviderEnabled: " + param.args[0]);
+ if ("gps".equals(param.args[0]))
+ param.setResult(true);
+ }
+ });
+
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
+ hookMethod("android.telephony.TelephonyManager", mLpp.classLoader,
+ "getAllCellInfo", new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Log.e(TAG, "getAllCellInfo");
+ param.setResult(null);
+ }
+ });
+ }
+
+ hookMethods("android.telephony.TelephonyManager", "listen", new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ Log.e(TAG, "TelephonyManager listen");
+ param.args[0] = new PhoneStateListenerDelegate((PhoneStateListener) param.args[0], lac, cid);
+ }
+ });
+ }
+
+ //不带参数的方法拦截
+ private static void hookMethod(Class> clazz, String methodName, Object... parameterTypesAndCallback) {
+ try {
+ XposedHelpers.findAndHookMethod(clazz, methodName, parameterTypesAndCallback);
+ } catch (Throwable e) {
+ Log.e(TAG, e.toString());
+ }
+ }
+
+ //不带参数的方法拦截
+ private static void hookMethod(String className, ClassLoader classLoader, String methodName,
+ Object... parameterTypesAndCallback) {
+ try {
+ XposedHelpers.findAndHookMethod(className, classLoader, methodName, parameterTypesAndCallback);
+ } catch (Throwable e) {
+ Log.e(TAG, e.toString());
+ }
+ }
+
+ //带参数的方法拦截
+ private static void hookMethods(String className, String methodName, XC_MethodHook xmh) {
+ try {
+ Class> clazz = Class.forName(className);
+
+ for (Method method : clazz.getDeclaredMethods())
+ if (method.getName().equals(methodName)
+ && !Modifier.isAbstract(method.getModifiers())
+ && Modifier.isPublic(method.getModifiers())) {
+ XposedBridge.hookMethod(method, xmh);
+ }
+ } catch (Throwable e) {
+ Log.e(TAG, e.toString());
+ }
+ }
+
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationManager.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationManager.java
new file mode 100644
index 0000000..586d51e
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/LocationManager.java
@@ -0,0 +1,82 @@
+package com.xposed.hook.location;
+
+import android.location.Location;
+import android.location.LocationListener;
+import android.os.Bundle;
+
+import java.util.HashMap;
+
+import mirror.MethodParams;
+import mirror.RefClass;
+import mirror.RefMethod;
+import mirror.RefObject;
+
+public class LocationManager {
+ public static Class> TYPE = RefClass.load(LocationManager.class, "android.location.LocationManager");
+ public static RefObject mGnssNmeaListeners;
+ public static RefObject mGnssStatusListeners;
+ public static RefObject mGpsNmeaListeners;
+ public static RefObject mGpsStatusListeners;
+ public static RefObject mListeners;
+ public static RefObject mNmeaListeners;
+
+ public static class GnssStatusListenerTransport {
+ public static Class> TYPE = RefClass.load(GnssStatusListenerTransport.class, "android.location.LocationManager$GnssStatusListenerTransport");
+ public static RefObject mGpsListener;
+ public static RefObject mGpsNmeaListener;
+ @MethodParams({int.class})
+ public static RefMethod onFirstFix;
+ public static RefMethod onGnssStarted;
+ @MethodParams({long.class, String.class})
+ public static RefMethod onNmeaReceived;
+ @MethodParams({int.class, int[].class, float[].class, float[].class, float[].class})
+ public static RefMethod onSvStatusChanged;
+ public static RefObject this$0;
+ }
+
+ public static class GpsStatusListenerTransport {
+ public static Class> TYPE = RefClass.load(GpsStatusListenerTransport.class, "android.location.LocationManager$GpsStatusListenerTransport");
+ public static RefObject mListener;
+ public static RefObject mNmeaListener;
+ @MethodParams({int.class})
+ public static RefMethod onFirstFix;
+ public static RefMethod onGpsStarted;
+ @MethodParams({long.class, String.class})
+ public static RefMethod onNmeaReceived;
+ @MethodParams({int.class, int[].class, float[].class, float[].class, float[].class, int.class, int.class, int.class})
+ public static RefMethod onSvStatusChanged;
+ public static RefObject this$0;
+ }
+
+ public static class GpsStatusListenerTransportOPPO_R815T {
+ public static Class> TYPE = RefClass.load(GpsStatusListenerTransportOPPO_R815T.class, "android.location.LocationManager$GpsStatusListenerTransport");
+ @MethodParams({int.class, int[].class, float[].class, float[].class, float[].class, int[].class, int[].class, int[].class, int.class})
+ public static RefMethod onSvStatusChanged;
+ }
+
+ public static class GpsStatusListenerTransportSumsungS5 {
+ public static Class> TYPE = RefClass.load(GpsStatusListenerTransportSumsungS5.class, "android.location.LocationManager$GpsStatusListenerTransport");
+ @MethodParams({int.class, int[].class, float[].class, float[].class, float[].class, int.class, int.class, int.class, int[].class})
+ public static RefMethod onSvStatusChanged;
+ }
+
+ public static class GpsStatusListenerTransportVIVO {
+ public static Class> TYPE = RefClass.load(GpsStatusListenerTransportVIVO.class, "android.location.LocationManager$GpsStatusListenerTransport");
+ @MethodParams({int.class, int[].class, float[].class, float[].class, float[].class, int.class, int.class, int.class, long[].class})
+ public static RefMethod onSvStatusChanged;
+ }
+
+ public static class ListenerTransport {
+ public static Class> TYPE = RefClass.load(ListenerTransport.class, "android.location.LocationManager$ListenerTransport");
+ public static RefObject mListener;
+ @MethodParams({Location.class})
+ public static RefMethod onLocationChanged;
+ @MethodParams({String.class})
+ public static RefMethod onProviderDisabled;
+ @MethodParams({String.class})
+ public static RefMethod onProviderEnabled;
+ @MethodParams({String.class, int.class, Bundle.class})
+ public static RefMethod onStatusChanged;
+ public static RefObject this$0;
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/MockLocationHelper.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/MockLocationHelper.java
new file mode 100644
index 0000000..f276606
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/MockLocationHelper.java
@@ -0,0 +1,152 @@
+package com.xposed.hook.location;
+
+import android.location.Location;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * @author Lody
+ */
+public class MockLocationHelper {
+
+ public static void invokeNmeaReceived(Object listener) {
+ if (listener != null) {
+ VirtualGPSSatalines satalines = VirtualGPSSatalines.get();
+ try {
+ Location location = LocationHandler.createLocation(LocationHandler.latitude, LocationHandler.longitude);
+ if (location != null) {
+ String date = new SimpleDateFormat("HHmmss:SS", Locale.US).format(new Date());
+ String lat = getGPSLat(LocationHandler.latitude);
+ String lon = getGPSLat(LocationHandler.longitude);
+ String latNW = getNorthWest(LocationHandler.latitude);
+ String lonSE = getSouthEast(LocationHandler.longitude);
+ String $GPGGA = checksum(String.format("$GPGGA,%s,%s,%s,%s,%s,1,%s,692,.00,M,.00,M,,,", date, lat, latNW, lon, lonSE, satalines.getSvCount()));
+ String $GPRMC = checksum(String.format("$GPRMC,%s,A,%s,%s,%s,%s,0,0,260717,,,A,", date, lat, latNW, lon, lonSE));
+ if (LocationManager.GnssStatusListenerTransport.onNmeaReceived != null) {
+ LocationManager.GnssStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), "$GPGSV,1,1,04,12,05,159,36,15,41,087,15,19,38,262,30,31,56,146,19,*73");
+ LocationManager.GnssStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), $GPGGA);
+ LocationManager.GnssStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), "$GPVTG,0,T,0,M,0,N,0,K,A,*25");
+ LocationManager.GnssStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), $GPRMC);
+ LocationManager.GnssStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), "$GPGSA,A,2,12,15,19,31,,,,,,,,,604,712,986,*27");
+ } else if (LocationManager.GpsStatusListenerTransport.onNmeaReceived != null) {
+ LocationManager.GpsStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), "$GPGSV,1,1,04,12,05,159,36,15,41,087,15,19,38,262,30,31,56,146,19,*73");
+ LocationManager.GpsStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), $GPGGA);
+ LocationManager.GpsStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), "$GPVTG,0,T,0,M,0,N,0,K,A,*25");
+ LocationManager.GpsStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), $GPRMC);
+ LocationManager.GpsStatusListenerTransport.onNmeaReceived.call(listener, System.currentTimeMillis(), "$GPGSA,A,2,12,15,19,31,,,,,,,,,604,712,986,*27");
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ public static void invokeSvStatusChanged(Object transport) {
+ if (transport != null) {
+ VirtualGPSSatalines satalines = VirtualGPSSatalines.get();
+ try {
+ Class> aClass = transport.getClass();
+ int svCount;
+ float[] snrs;
+ float[] elevations;
+ float[] azimuths;
+ if (aClass == LocationManager.GnssStatusListenerTransport.TYPE) {
+ svCount = satalines.getSvCount();
+ int[] prnWithFlags = satalines.getPrnWithFlags();
+ snrs = satalines.getSnrs();
+ elevations = satalines.getElevations();
+ azimuths = satalines.getAzimuths();
+ LocationManager.GnssStatusListenerTransport.onSvStatusChanged.call(transport, svCount, prnWithFlags, snrs, elevations, azimuths);
+ } else if (aClass == LocationManager.GpsStatusListenerTransport.TYPE) {
+ svCount = satalines.getSvCount();
+ int[] prns = satalines.getPrns();
+ snrs = satalines.getSnrs();
+ elevations = satalines.getElevations();
+ azimuths = satalines.getAzimuths();
+ int ephemerisMask = satalines.getEphemerisMask();
+ int almanacMask = satalines.getAlmanacMask();
+ int usedInFixMask = satalines.getUsedInFixMask();
+ if (LocationManager.GpsStatusListenerTransport.onSvStatusChanged != null) {
+ LocationManager.GpsStatusListenerTransport.onSvStatusChanged.call(transport, svCount, prns, snrs, elevations, azimuths, ephemerisMask, almanacMask, usedInFixMask);
+ } else if (LocationManager.GpsStatusListenerTransportVIVO.onSvStatusChanged != null) {
+ LocationManager.GpsStatusListenerTransportVIVO.onSvStatusChanged.call(transport, svCount, prns, snrs, elevations, azimuths, ephemerisMask, almanacMask, usedInFixMask, new long[svCount]);
+ } else if (LocationManager.GpsStatusListenerTransportSumsungS5.onSvStatusChanged != null) {
+ LocationManager.GpsStatusListenerTransportSumsungS5.onSvStatusChanged.call(transport, svCount, prns, snrs, elevations, azimuths, ephemerisMask, almanacMask, usedInFixMask, new int[svCount]);
+ } else if (LocationManager.GpsStatusListenerTransportOPPO_R815T.onSvStatusChanged != null) {
+ int len = prns.length;
+ int[] ephemerisMasks = new int[len];
+ for (int i = 0; i < len; i++) {
+ ephemerisMasks[i] = satalines.getEphemerisMask();
+ }
+ int[] almanacMasks = new int[len];
+ for (int i = 0; i < len; i++) {
+ almanacMasks[i] = satalines.getAlmanacMask();
+ }
+ int[] usedInFixMasks = new int[len];
+ for (int i = 0; i < len; i++) {
+ usedInFixMasks[i] = satalines.getUsedInFixMask();
+ }
+ LocationManager.GpsStatusListenerTransportOPPO_R815T.onSvStatusChanged.call(transport, svCount, prns, snrs, elevations, azimuths, ephemerisMasks, almanacMasks, usedInFixMasks, svCount);
+ }
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private static String getSouthEast(double longitude) {
+ if (longitude > 0.0d) {
+ return "E";
+ }
+ return "W";
+ }
+
+ private static String getNorthWest(double latitude) {
+ if (latitude > 0.0d) {
+ return "N";
+ }
+ return "S";
+ }
+
+ public static String getGPSLat(double v) {
+ int du = (int) v;
+ double fen = (v - (double) du) * 60.0d;
+ return du + leftZeroPad((int) fen, 2) + ":" + String.valueOf(fen).substring(2);
+ }
+
+ private static String leftZeroPad(int num, int size) {
+ return leftZeroPad(String.valueOf(num), size);
+ }
+
+ private static String leftZeroPad(String num, int size) {
+ StringBuilder sb = new StringBuilder(size);
+ int i;
+ if (num == null) {
+ for (i = 0; i < size; i++) {
+ sb.append('0');
+ }
+ } else {
+ for (i = 0; i < size - num.length(); i++) {
+ sb.append('0');
+ }
+ sb.append(num);
+ }
+ return sb.toString();
+ }
+
+ public static String checksum(String nema) {
+ String checkStr = nema;
+ if (nema.startsWith("$")) {
+ checkStr = nema.substring(1);
+ }
+ int sum = 0;
+ for (int i = 0; i < checkStr.length(); i++) {
+ sum ^= (byte) checkStr.charAt(i);
+ }
+ return nema + "*" + String.format("%02X", sum).toLowerCase();
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/PhoneStateListenerDelegate.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/PhoneStateListenerDelegate.java
new file mode 100644
index 0000000..b599a19
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/PhoneStateListenerDelegate.java
@@ -0,0 +1,30 @@
+package com.xposed.hook.location;
+
+import android.telephony.CellLocation;
+import android.telephony.PhoneStateListener;
+import android.telephony.gsm.GsmCellLocation;
+
+/**
+ * Created by lin on 2018/1/25.
+ */
+
+public class PhoneStateListenerDelegate extends PhoneStateListener {
+
+ private PhoneStateListener delegate;
+ private int lac;
+ private int cid;
+
+ public PhoneStateListenerDelegate(PhoneStateListener delegate, int lac, int cid) {
+ this.delegate = delegate;
+ this.lac = lac;
+ this.cid = cid;
+ }
+
+ @Override
+ public void onCellLocationChanged(CellLocation location) {
+ if(location instanceof GsmCellLocation) {
+ ((GsmCellLocation) location).setLacAndCid(lac, cid);
+ delegate.onCellLocationChanged(location);
+ }
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/VirtualGPSSatalines.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/VirtualGPSSatalines.java
new file mode 100644
index 0000000..de216c8
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/location/VirtualGPSSatalines.java
@@ -0,0 +1,133 @@
+package com.xposed.hook.location;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class VirtualGPSSatalines {
+ private static VirtualGPSSatalines INSTANCE;
+ private int mAlmanacMask;
+ private float[] mAzimuths;
+ private float[] mElevations;
+ private int mEphemerisMask;
+ private float[] mSnrs;
+ private int mUsedInFixMask;
+ private int[] pnrs;
+ private int[] prnWithFlags;
+ private int svCount;
+
+ static {
+ INSTANCE = new VirtualGPSSatalines();
+ }
+
+ public int getAlmanacMask() {
+ return this.mAlmanacMask;
+ }
+
+ public float[] getAzimuths() {
+ return this.mAzimuths;
+ }
+
+ public float[] getElevations() {
+ return this.mElevations;
+ }
+
+ public int getEphemerisMask() {
+ return this.mEphemerisMask;
+ }
+
+ public int[] getPrns() {
+ return this.pnrs;
+ }
+
+ public float[] getSnrs() {
+ return this.mSnrs;
+ }
+
+ public int getUsedInFixMask() {
+ return this.mUsedInFixMask;
+ }
+
+ public static VirtualGPSSatalines get() {
+ return INSTANCE;
+ }
+
+ private VirtualGPSSatalines() {
+ List statelines = new ArrayList<>();
+ statelines.add(new GPSStateline(5, 1.0d, 5.0d, 112.0d, false, true, true));
+ statelines.add(new GPSStateline(13, 13.5d, 23.0d, 53.0d, true, true, true));
+ statelines.add(new GPSStateline(14, 19.1d, 6.0d, 247.0d, true, true, true));
+ statelines.add(new GPSStateline(15, 31.0d, 58.0d, 45.0d, true, true, true));
+ statelines.add(new GPSStateline(18, 0.0d, 52.0d, 309.0d, false, true, true));
+ statelines.add(new GPSStateline(20, 30.1d, 54.0d, 105.0d, true, true, true));
+ statelines.add(new GPSStateline(21, 33.2d, 56.0d, 251.0d, true, true, true));
+ statelines.add(new GPSStateline(22, 0.0d, 14.0d, 299.0d, false, true, true));
+ statelines.add(new GPSStateline(24, 25.9d, 57.0d, 157.0d, true, true, true));
+ statelines.add(new GPSStateline(27, 18.0d, 3.0d, 309.0d, true, true, true));
+ statelines.add(new GPSStateline(28, 18.2d, 3.0d, 42.0d, true, true, true));
+ statelines.add(new GPSStateline(41, 28.8d, 0.0d, 0.0d, false, false, false));
+ statelines.add(new GPSStateline(50, 29.2d, 0.0d, 0.0d, false, true, true));
+ statelines.add(new GPSStateline(67, 14.4d, 2.0d, 92.0d, false, false, false));
+ statelines.add(new GPSStateline(68, 21.2d, 45.0d, 60.0d, false, false, false));
+ statelines.add(new GPSStateline(69, 17.5d, 50.0d, 330.0d, false, true, true));
+ statelines.add(new GPSStateline(70, 22.4d, 7.0d, 291.0d, false, false, false));
+ statelines.add(new GPSStateline(77, 23.8d, 10.0d, 23.0d, true, true, true));
+ statelines.add(new GPSStateline(78, 18.0d, 47.0d, 70.0d, true, true, true));
+ statelines.add(new GPSStateline(79, 22.8d, 41.0d, 142.0d, true, true, true));
+ statelines.add(new GPSStateline(83, 0.2d, 9.0d, 212.0d, false, false, false));
+ statelines.add(new GPSStateline(84, 16.7d, 30.0d, 264.0d, true, true, true));
+ statelines.add(new GPSStateline(85, 12.1d, 20.0d, 317.0d, true, true, true));
+ this.svCount = statelines.size();
+ this.pnrs = new int[statelines.size()];
+ for (int i = 0; i < statelines.size(); i++) {
+ this.pnrs[i] = statelines.get(i).getPnr();
+ }
+ this.mSnrs = new float[statelines.size()];
+ for (int i = 0; i < statelines.size(); i++) {
+ this.mSnrs[i] = (float) statelines.get(i).getSnr();
+ }
+ this.mElevations = new float[statelines.size()];
+ for (int i = 0; i < statelines.size(); i++) {
+ this.mElevations[i] = (float) statelines.get(i).getElevation();
+ }
+ this.mAzimuths = new float[statelines.size()];
+ for (int i = 0; i < statelines.size(); i++) {
+ this.mAzimuths[i] = (float) statelines.get(i).getAzimuth();
+ }
+ this.mEphemerisMask = 0;
+ for (int i = 0; i < statelines.size(); i++) {
+ if (statelines.get(i).isHasEphemeris()) {
+ this.mEphemerisMask |= 1 << (statelines.get(i).getPnr() - 1);
+ }
+ }
+ this.mAlmanacMask = 0;
+ for (int i = 0; i < statelines.size(); i++) {
+ if (statelines.get(i).isHasAlmanac()) {
+ this.mAlmanacMask |= 1 << (statelines.get(i).getPnr() - 1);
+ }
+ }
+ this.mUsedInFixMask = 0;
+ for (int i = 0; statelines.size() > i; i++) {
+ if (statelines.get(i).isUseInFix()) {
+ this.mUsedInFixMask |= 1 << (statelines.get(i).getPnr() - 1);
+ }
+ }
+ this.prnWithFlags = new int[statelines.size()];
+ for (int i = 0; i < statelines.size(); i++) {
+ GPSStateline gpsStateline = statelines.get(i);
+ this.prnWithFlags[i] =
+ (gpsStateline.isHasEphemeris() ? 1 : 0)
+ | (gpsStateline.isHasAlmanac() ? 1 : 0) << 1
+ | (gpsStateline.isUseInFix() ? 1 : 0) << 2
+ | 8
+ | (gpsStateline.getPnr() << 7);
+ }
+ }
+
+ public int getSvCount() {
+ return this.svCount;
+ }
+
+ public int[] getPrnWithFlags() {
+ return this.prnWithFlags;
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/AppUtil.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/AppUtil.java
new file mode 100644
index 0000000..b8b2a49
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/AppUtil.java
@@ -0,0 +1,33 @@
+package com.xposed.hook.utils;
+
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+
+import com.xposed.hook.config.PkgConfig;
+import com.xposed.hook.entity.AppInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class AppUtil {
+
+ public static ArrayList getAppList(Context context) {
+ ArrayList apps = new ArrayList<>();
+ List installedPackages = context.getPackageManager().getInstalledPackages(0);
+ for (PackageInfo installedPackage : installedPackages) {
+ if ((installedPackage.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+ AppInfo app = new AppInfo();
+ app.packageName = installedPackage.packageName;
+ app.title = installedPackage.applicationInfo.loadLabel(context.getPackageManager()).toString();
+ app.icon = installedPackage.applicationInfo.loadIcon(context.getPackageManager());
+ if (PkgConfig.pkg_dingtalk.equals(app.packageName))
+ apps.add(0, app);
+ else
+ apps.add(app);
+ }
+ }
+
+ return apps;
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/Tag.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/Tag.java
new file mode 100644
index 0000000..4db490e
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/Tag.java
@@ -0,0 +1,90 @@
+package com.xposed.hook.utils;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+/**
+ * Created by lin on 2018/9/18.
+ */
+public class Tag {
+
+ private String mPath;
+ private String mName;
+ private ArrayList mChildren = new ArrayList<>();
+ private String mContent;
+
+ Tag(String path, String name) {
+ mPath = path;
+ mName = name;
+ }
+
+ void addChild(Tag tag) {
+ mChildren.add(tag);
+ }
+
+ void setContent(String content) {
+ boolean hasContent = false;
+ if (content != null) {
+ for (int i = 0; i < content.length(); ++i) {
+ char c = content.charAt(i);
+ if ((c != ' ') && (c != '\n')) {
+ hasContent = true;
+ break;
+ }
+ }
+ }
+ if (hasContent) {
+ mContent = content;
+ }
+ }
+
+ String getName() {
+ return mName;
+ }
+
+ String getContent() {
+ return mContent;
+ }
+
+ ArrayList getChildren() {
+ return mChildren;
+ }
+
+ boolean hasChildren() {
+ return (mChildren.size() > 0);
+ }
+
+ int getChildrenCount() {
+ return mChildren.size();
+ }
+
+ Tag getChild(int index) {
+ if ((index >= 0) && (index < mChildren.size())) {
+ return mChildren.get(index);
+ }
+ return null;
+ }
+
+ HashMap> getGroupedElements() {
+ HashMap> groups = new HashMap<>();
+ for (Tag child : mChildren) {
+ String key = child.getName();
+ ArrayList group = groups.get(key);
+ if (group == null) {
+ group = new ArrayList<>();
+ groups.put(key, group);
+ }
+ group.add(child);
+ }
+ return groups;
+ }
+
+ String getPath() {
+ return mPath;
+ }
+
+ @Override
+ public String toString() {
+ return "Tag: " + mName + ", " + mChildren.size() + " children, Content: " + mContent;
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/ViewHolder.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/ViewHolder.java
new file mode 100644
index 0000000..fa3b2a2
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/ViewHolder.java
@@ -0,0 +1,25 @@
+package com.xposed.hook.utils;
+
+import android.util.SparseArray;
+import android.view.View;
+
+/**
+ * Created by lin on 2018/1/24.
+ */
+
+public class ViewHolder {
+
+ public static T get(View view, int id) {
+ SparseArray viewHolder = (SparseArray) view.getTag();
+ if (viewHolder == null) {
+ viewHolder = new SparseArray();
+ view.setTag(viewHolder);
+ }
+ View childView = viewHolder.get(id);
+ if (childView == null) {
+ childView = view.findViewById(id);
+ viewHolder.put(id, childView);
+ }
+ return (T) childView;
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/XmlToJson.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/XmlToJson.java
new file mode 100644
index 0000000..41f75cf
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/utils/XmlToJson.java
@@ -0,0 +1,433 @@
+package com.xposed.hook.utils;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Log;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.regex.Matcher;
+
+/**
+ * Created by lin on 2018/9/18.
+ */
+public class XmlToJson {
+
+ private static final String TAG = "XmlToJson";
+ private static final String DEFAULT_CONTENT_NAME = "content";
+ private static final String DEFAULT_ENCODING = "utf-8";
+ private static final String DEFAULT_INDENTATION = " ";
+ private String mIndentationPattern = DEFAULT_INDENTATION;
+
+ // default values when a Tag is empty
+ private static final String DEFAULT_EMPTY_STRING = "";
+ private static final int DEFAULT_EMPTY_INTEGER = 0;
+ private static final long DEFAULT_EMPTY_LONG = 0;
+ private static final double DEFAULT_EMPTY_DOUBLE = 0;
+ private static final boolean DEFAULT_EMPTY_BOOLEAN = false;
+
+
+ public static class Builder {
+
+ private StringReader mStringSource;
+ private String mInputEncoding = DEFAULT_ENCODING;
+ private HashSet mForceListPaths = new HashSet<>();
+ private HashMap mAttributeNameReplacements = new HashMap<>();
+ private HashMap mContentNameReplacements = new HashMap<>();
+ private HashMap mForceClassForPath = new HashMap<>(); // Integer, Long, Double, Boolean
+ private HashSet mSkippedAttributes = new HashSet<>();
+ private HashSet mSkippedTags = new HashSet<>();
+
+ /**
+ * Constructor
+ *
+ * @param xmlSource XML source
+ */
+ public Builder(@NonNull String xmlSource) {
+ mStringSource = new StringReader(xmlSource);
+ }
+
+ /**
+ * Creates the XmlToJson object
+ */
+ public JSONObject build() {
+ try {
+ return new JSONObject(new XmlToJson(this).toString());
+ } catch (JSONException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+ }
+
+ private StringReader mStringSource;
+ private InputStream mInputStreamSource;
+ private String mInputEncoding;
+ private HashSet mForceListPaths;
+ private HashMap mAttributeNameReplacements;
+ private HashMap mContentNameReplacements;
+ private HashMap mForceClassForPath;
+ private HashSet mSkippedAttributes = new HashSet<>();
+ private HashSet mSkippedTags = new HashSet<>();
+ private JSONObject mJsonObject; // Used for caching the result
+
+ private XmlToJson(Builder builder) {
+ mStringSource = builder.mStringSource;
+ mInputEncoding = builder.mInputEncoding;
+ mForceListPaths = builder.mForceListPaths;
+ mAttributeNameReplacements = builder.mAttributeNameReplacements;
+ mContentNameReplacements = builder.mContentNameReplacements;
+ mForceClassForPath = builder.mForceClassForPath;
+ mSkippedAttributes = builder.mSkippedAttributes;
+ mSkippedTags = builder.mSkippedTags;
+
+ mJsonObject = convertToJSONObject(); // Build now so that the InputStream can be closed just after
+ }
+
+
+ private
+ @Nullable
+ JSONObject convertToJSONObject() {
+ try {
+ Tag parentTag = new Tag("", "xml");
+
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ factory.setNamespaceAware(false); // tags with namespace are taken as-is ("namespace:tagname")
+ XmlPullParser xpp = factory.newPullParser();
+
+ setInput(xpp);
+
+ int eventType = xpp.getEventType();
+ while (eventType != XmlPullParser.START_DOCUMENT) {
+ eventType = xpp.next();
+ }
+ readTags(parentTag, xpp);
+
+ unsetInput();
+
+ return convertTagToJson(parentTag, false);
+ } catch (XmlPullParserException | IOException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private void setInput(XmlPullParser xpp) {
+ if (mStringSource != null) {
+ try {
+ xpp.setInput(mStringSource);
+ } catch (XmlPullParserException e) {
+ e.printStackTrace();
+ }
+ } else {
+ try {
+ xpp.setInput(mInputStreamSource, mInputEncoding);
+ } catch (XmlPullParserException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ private void unsetInput() {
+ if (mStringSource != null) {
+ mStringSource.close();
+ }
+ // else the InputStream has been given by the user, it is not our role to close it
+ }
+
+ private void readTags(Tag parent, XmlPullParser xpp) {
+ try {
+ int eventType;
+ do {
+ eventType = xpp.next();
+ if (eventType == XmlPullParser.START_TAG) {
+ String tagName = xpp.getName();
+ String path = parent.getPath() + "/" + tagName;
+
+ boolean skipTag = mSkippedTags.contains(path);
+
+ Tag child = new Tag(path, tagName);
+ if (!skipTag) {
+ parent.addChild(child);
+ }
+
+ // Attributes are taken into account as key/values in the child
+ int attrCount = xpp.getAttributeCount();
+ for (int i = 0; i < attrCount; ++i) {
+ String attrName = xpp.getAttributeName(i);
+ String attrValue = xpp.getAttributeValue(i);
+ String attrPath = parent.getPath() + "/" + child.getName() + "/" + attrName;
+
+ // Skip Attributes
+ if (mSkippedAttributes.contains(attrPath)) {
+ continue;
+ }
+
+ attrName = getAttributeNameReplacement(attrPath, attrName);
+ Tag attribute = new Tag(attrPath, attrName);
+ attribute.setContent(attrValue);
+ child.addChild(attribute);
+ }
+
+ readTags(child, xpp);
+ } else if (eventType == XmlPullParser.TEXT) {
+ String text = xpp.getText();
+ parent.setContent(text);
+ } else if (eventType == XmlPullParser.END_TAG) {
+ return;
+ } else {
+ Log.i(TAG, "unknown xml eventType " + eventType);
+ }
+ } while (eventType != XmlPullParser.END_DOCUMENT);
+ } catch (XmlPullParserException | IOException | NullPointerException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private JSONObject convertTagToJson(Tag tag, boolean isListElement) {
+ JSONObject json = new JSONObject();
+
+ // Content is injected as a key/value
+ if (tag.getContent() != null) {
+ String path = tag.getPath();
+ String name = getContentNameReplacement(path, DEFAULT_CONTENT_NAME);
+ putContent(path, json, name, tag.getContent());
+ }
+
+ try {
+
+ HashMap> groups = tag.getGroupedElements(); // groups by tag names so that we can detect lists or single elements
+ for (ArrayList group : groups.values()) {
+
+ if (group.size() == 1) { // element, or list of 1
+ Tag child = group.get(0);
+ if (isForcedList(child)) { // list of 1
+ JSONArray list = new JSONArray();
+ list.put(convertTagToJson(child, true));
+ String childrenNames = child.getName();
+ json.put(childrenNames, list);
+ } else { // stand alone element
+ if (child.hasChildren()) {
+ JSONObject jsonChild = convertTagToJson(child, false);
+ json.put(child.getName(), jsonChild);
+ } else {
+ String path = child.getPath();
+ putContent(path, json, child.getName(), child.getContent());
+ }
+ }
+ } else { // list
+ JSONArray list = new JSONArray();
+ for (Tag child : group) {
+ list.put(convertTagToJson(child, true));
+ }
+ String childrenNames = group.get(0).getName();
+ json.put(childrenNames, list);
+ }
+ }
+ return json;
+
+ } catch (JSONException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private void putContent(String path, JSONObject json, String tag, String content) {
+ try {
+ // checks if the user wants to force a class (Int, Double... for a given path)
+ Class forcedClass = mForceClassForPath.get(path);
+ if (forcedClass == null) { // default behaviour, put it as a String
+ if (content == null) {
+ content = DEFAULT_EMPTY_STRING;
+ }
+ json.put(tag, content);
+ } else {
+ if (forcedClass == Integer.class) {
+ try {
+ Integer number = Integer.parseInt(content);
+ json.put(tag, number);
+ } catch (NumberFormatException exception) {
+ json.put(tag, DEFAULT_EMPTY_INTEGER);
+ }
+ } else if (forcedClass == Long.class) {
+ try {
+ Long number = Long.parseLong(content);
+ json.put(tag, number);
+ } catch (NumberFormatException exception) {
+ json.put(tag, DEFAULT_EMPTY_LONG);
+ }
+ } else if (forcedClass == Double.class) {
+ try {
+ Double number = Double.parseDouble(content);
+ json.put(tag, number);
+ } catch (NumberFormatException exception) {
+ json.put(tag, DEFAULT_EMPTY_DOUBLE);
+ }
+ } else if (forcedClass == Boolean.class) {
+ if (content == null) {
+ json.put(tag, DEFAULT_EMPTY_BOOLEAN);
+ } else if (content.equalsIgnoreCase("true")) {
+ json.put(tag, true);
+ } else if (content.equalsIgnoreCase("false")) {
+ json.put(tag, false);
+ } else {
+ json.put(tag, DEFAULT_EMPTY_BOOLEAN);
+ }
+ }
+ }
+
+ } catch (JSONException exception) {
+ // keep continue in case of error
+ }
+ }
+
+ private boolean isForcedList(Tag tag) {
+ String path = tag.getPath();
+ return mForceListPaths.contains(path);
+ }
+
+ private String getAttributeNameReplacement(String path, String defaultValue) {
+ String result = mAttributeNameReplacements.get(path);
+ if (result != null) {
+ return result;
+ }
+ return defaultValue;
+ }
+
+ private String getContentNameReplacement(String path, String defaultValue) {
+ String result = mContentNameReplacements.get(path);
+ if (result != null) {
+ return result;
+ }
+ return defaultValue;
+ }
+
+ @Override
+ public String toString() {
+ if (mJsonObject != null) {
+ return mJsonObject.toString();
+ }
+ return null;
+ }
+
+ /**
+ * Format the Json with indentation and line breaks.
+ * Uses the last intendation pattern used, or the default one (3 spaces)
+ *
+ * @return the Builder
+ */
+ public String toFormattedString() {
+ if (mJsonObject != null) {
+ String indent = "";
+ StringBuilder builder = new StringBuilder();
+ builder.append("{\n");
+ format(mJsonObject, builder, indent);
+ builder.append("}\n");
+ return builder.toString();
+ }
+ return null;
+ }
+
+ private void format(JSONObject jsonObject, StringBuilder builder, String indent) {
+ Iterator keys = jsonObject.keys();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ builder.append(indent);
+ builder.append(mIndentationPattern);
+ builder.append("\"");
+ builder.append(key);
+ builder.append("\": ");
+ Object value = jsonObject.opt(key);
+ if (value instanceof JSONObject) {
+ JSONObject child = (JSONObject) value;
+ builder.append(indent);
+ builder.append("{\n");
+ format(child, builder, indent + mIndentationPattern);
+ builder.append(indent);
+ builder.append(mIndentationPattern);
+ builder.append("}");
+ } else if (value instanceof JSONArray) {
+ JSONArray array = (JSONArray) value;
+ formatArray(array, builder, indent + mIndentationPattern);
+ } else {
+ formatValue(value, builder);
+ }
+ if (keys.hasNext()) {
+ builder.append(",\n");
+ } else {
+ builder.append("\n");
+ }
+ }
+ }
+
+ private void formatArray(JSONArray array, StringBuilder builder, String indent) {
+ builder.append("[\n");
+
+ for (int i = 0; i < array.length(); ++i) {
+ Object element = array.opt(i);
+ if (element instanceof JSONObject) {
+ JSONObject child = (JSONObject) element;
+ builder.append(indent);
+ builder.append(mIndentationPattern);
+ builder.append("{\n");
+ format(child, builder, indent + mIndentationPattern);
+ builder.append(indent);
+ builder.append(mIndentationPattern);
+ builder.append("}");
+ } else if (element instanceof JSONArray) {
+ JSONArray child = (JSONArray) element;
+ formatArray(child, builder, indent + mIndentationPattern);
+ } else {
+ formatValue(element, builder);
+ }
+ if (i < array.length() - 1) {
+ builder.append(",");
+ }
+ builder.append("\n");
+ }
+ builder.append(indent);
+ builder.append("]");
+ }
+
+ private void formatValue(Object value, StringBuilder builder) {
+ if (value instanceof String) {
+ String string = (String) value;
+
+ // Escape special characters
+ string = string.replaceAll("\\\\", "\\\\\\\\"); // escape backslash
+ string = string.replaceAll("\"", Matcher.quoteReplacement("\\\"")); // escape double quotes
+ string = string.replaceAll("/", "\\\\/"); // escape slash
+ string = string.replaceAll("\n", "\\\\n").replaceAll("\t", "\\\\t"); // escape \n and \t
+
+ builder.append("\"");
+ builder.append(string);
+ builder.append("\"");
+ } else if (value instanceof Long) {
+ Long longValue = (Long) value;
+ builder.append(longValue);
+ } else if (value instanceof Integer) {
+ Integer intValue = (Integer) value;
+ builder.append(intValue);
+ } else if (value instanceof Boolean) {
+ Boolean bool = (Boolean) value;
+ builder.append(bool);
+ } else if (value instanceof Double) {
+ Double db = (Double) value;
+ builder.append(db);
+ } else {
+ builder.append(value.toString());
+ }
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/LuckyMoneyHook.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/LuckyMoneyHook.java
new file mode 100644
index 0000000..cfe4a0b
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/LuckyMoneyHook.java
@@ -0,0 +1,206 @@
+package com.xposed.hook.wechat;
+
+import android.app.Activity;
+import android.content.ContentValues;
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Log;
+import android.widget.Button;
+import android.widget.Toast;
+
+import com.xposed.hook.location.LocationHook;
+import com.xposed.hook.utils.XmlToJson;
+
+import org.json.JSONObject;
+
+import java.lang.ref.WeakReference;
+import java.util.HashSet;
+
+import de.robv.android.xposed.XC_MethodHook;
+import de.robv.android.xposed.XSharedPreferences;
+import de.robv.android.xposed.XposedBridge;
+import de.robv.android.xposed.XposedHelpers;
+import de.robv.android.xposed.callbacks.XC_LoadPackage;
+
+/**
+ * Created by lin on 2018/2/2.
+ */
+
+public class LuckyMoneyHook {
+
+ public static final String WECHAT_PACKAGE_NAME = "com.tencent.mm";
+
+ private static final String tinkerEnableClass = "com.tencent.tinker.loader.shareutil.ShareTinkerInternals";
+ private static final String tinkerEnableMethodName = "abV";
+
+ private static final String luckyMoneyReceiveUI = WECHAT_PACKAGE_NAME + ".plugin.luckymoney.ui.LuckyMoneyNotHookReceiveUI";
+ private static final String receiveUIFunctionName = "onSceneEnd";
+ private static final String receiveUIParamName = WECHAT_PACKAGE_NAME + ".al.n";
+
+ private static final String chatRoomInfoUI = WECHAT_PACKAGE_NAME + ".chatroom.ui.ChatroomInfoUI";
+ private static final String launcherUI = WECHAT_PACKAGE_NAME + ".ui.LauncherUI";
+ private static final String openUIClass = WECHAT_PACKAGE_NAME + ".bs.d";//MicroMsg.PluginHelper
+ private static final String openUIMethodName = "b";
+
+ private static HashSet autoReceiveIds = new HashSet<>();
+ private static WeakReference launcherUiActivity;
+
+ private static ToastHandler handler;
+
+ private static long msgId;
+ private static int delay;
+
+ public static void hook(final XC_LoadPackage.LoadPackageParam mLpp) {
+ if (WECHAT_PACKAGE_NAME.equals(mLpp.packageName)) {
+ disableTinker(mLpp);
+ XSharedPreferences preferences = new XSharedPreferences("com.xposed.hook", "lucky_money");
+ delay = preferences.getInt("lucky_money_delay", 0);
+ try {
+ XposedHelpers.findAndHookMethod("android.app.Application", mLpp.classLoader, "attach", Context.class, new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ Context context = (Context) param.args[0];
+ handler = new ToastHandler(context);
+ }
+ });
+ if (preferences.getBoolean("quick_open", true))
+ XposedHelpers.findAndHookMethod(luckyMoneyReceiveUI, mLpp.classLoader, receiveUIFunctionName, int.class, int.class, String.class, receiveUIParamName, new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ try {
+ Button button = (Button) XposedHelpers.findFirstFieldByExactType(param.thisObject.getClass(), Button.class).get(param.thisObject);
+ if (button.isShown() && button.isClickable()) {
+ button.performClick();
+ }
+ } catch (Throwable e) {
+ Log.e(LocationHook.TAG, e.toString());
+ }
+ }
+ });
+ if (preferences.getBoolean("auto_receive", true)) {
+ XposedHelpers.findAndHookMethod(WechatUnrecalledHook.SQLiteDatabaseClass, mLpp.classLoader, "insert", String.class, String.class, ContentValues.class, new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ ContentValues contentValues = (ContentValues) param.args[2];
+ String tableName = (String) param.args[0];
+ if (TextUtils.isEmpty(tableName) || !tableName.equals("message")) {
+ return;
+ }
+ Integer type = contentValues.getAsInteger("type");
+ if (null == type) {
+ return;
+ }
+ Long id = contentValues.getAsLong("msgId");
+ if (id != null) {
+ if (id == msgId)
+ XposedBridge.log("wechat msg:" + contentValues.getAsString("content"));
+ msgId = id;
+ }
+ if (handler != null && (type == 436207665 || type == 469762097)) {
+ handler.obtainMessage(0, "Lucky Money is Coming").sendToTarget();
+ openLuckyMoneyReceiveUI(contentValues, mLpp);
+ }
+ }
+ });
+ XposedHelpers.findAndHookMethod(chatRoomInfoUI, mLpp.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ if (handler != null) {
+ Activity activity = (Activity) param.thisObject;
+ String wechatId = activity.getIntent().getStringExtra("RoomInfo_Id");
+ String status = "Opened";
+ if (autoReceiveIds.contains(wechatId)) {
+ autoReceiveIds.remove(wechatId);
+ status = "Closed";
+ } else
+ autoReceiveIds.add(wechatId);
+ handler.obtainMessage(0, "Group Chat ID:" + wechatId + ",Auto Open LuckyMoneyReceiveUI " + status).sendToTarget();
+ }
+ }
+ });
+ XposedHelpers.findAndHookMethod(launcherUI, mLpp.classLoader, "onCreate", Bundle.class, new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ launcherUiActivity = new WeakReference<>((Activity) param.thisObject);
+ }
+ });
+ }
+ } catch (Throwable e) {
+ XposedBridge.log(e);
+ }
+ if (preferences.getBoolean("recalled", true))
+ new WechatUnrecalledHook(WECHAT_PACKAGE_NAME).hook(mLpp.classLoader);
+ if (preferences.getBoolean("3_days_Moments", false))
+ WechatUnrecalledHook.hook3DaysMoments(mLpp.classLoader);
+ }
+ }
+
+ private static void openLuckyMoneyReceiveUI(ContentValues contentValues, XC_LoadPackage.LoadPackageParam lpparam) {
+ int status = contentValues.getAsInteger("status");
+ if (status == 4)
+ return;
+
+ String talker = contentValues.getAsString("talker");
+ if (!autoReceiveIds.contains(talker))
+ return;
+
+ String content = contentValues.getAsString("content");
+ if (!content.startsWith(" {
+ try {
+ Intent param = new Intent();
+ param.putExtra("key_way", 1);
+ param.putExtra("key_native_url", nativeUrlString);
+ param.putExtra("key_username", talker);
+ XposedHelpers.callStaticMethod(XposedHelpers.findClass(openUIClass, lpparam.classLoader),
+ openUIMethodName, launcherUiActivity.get(), "luckymoney", ".ui.LuckyMoneyNotHookReceiveUI", param);
+ } catch (Throwable e) {
+ XposedBridge.log(e);
+ }
+ }, delay);
+ }
+ } catch (Throwable e) {
+ XposedBridge.log(e);
+ }
+ }
+
+ private static void disableTinker(XC_LoadPackage.LoadPackageParam lpparam) {
+ try {
+ XposedHelpers.findAndHookMethod(tinkerEnableClass, lpparam.classLoader, tinkerEnableMethodName, int.class, new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ param.setResult(false);
+ }
+ });
+ } catch (Throwable e) {
+ XposedBridge.log(e);
+ }
+ }
+
+ private static class ToastHandler extends Handler {
+
+ private Context context;
+
+ ToastHandler(Context context) {
+ super(Looper.getMainLooper());
+ this.context = context;
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ Toast.makeText(context, (String) msg.obj, Toast.LENGTH_SHORT).show();
+ }
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/WechatMainDBHelper.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/WechatMainDBHelper.java
new file mode 100644
index 0000000..2ad76a1
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/WechatMainDBHelper.java
@@ -0,0 +1,194 @@
+package com.xposed.hook.wechat;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.text.TextUtils;
+
+import java.util.HashMap;
+import java.util.Random;
+
+import static de.robv.android.xposed.XposedHelpers.callMethod;
+
+/**
+ * Created by lin on 2018/2/6.
+ */
+
+public class WechatMainDBHelper {
+ private Object SQLDB;
+ private HashMap mNicknameCache;
+ private HashMap mChatroomMemberMap;
+
+ public WechatMainDBHelper(Object dbObject) {
+ SQLDB = dbObject;
+ mNicknameCache = new HashMap<>();
+ }
+
+ public void insertSQL(String table, String selection, ContentValues contentValues) {
+ callMethod(SQLDB, "insert", table, selection, contentValues);
+ }
+
+ public Cursor rawQuery(String query) {
+ return rawQuery(query, null);
+ }
+
+ public Cursor rawQuery(String query, String[] args) {
+ return (Cursor) callMethod(SQLDB, "rawQuery", query, args);
+ }
+
+ public void SQLUpdate(String table, ContentValues contentValues, String selection, String[] args) {
+ callMethod(SQLDB, "update", table, contentValues, selection, args);
+ }
+
+ public Cursor getMessageBySvrId(String msgSrvId) {
+ String sql = "select * from message where msgsvrid=?";
+ String[] sqlArgs = {msgSrvId};
+
+ return rawQuery(sql, sqlArgs);
+ }
+
+ public void insertMessage(String talker, int talkerId, String msg) {
+ insertMessage(talker, talkerId, msg, 1, System.currentTimeMillis());
+ }
+
+ public void insertSystemMessage(String talker, int talkerId, String msg) {
+ insertMessage(talker, talkerId, msg, 10000, System.currentTimeMillis());
+ }
+
+ public void insertSystemMessage(String talker, int talkerId, String msg, long createTime) {
+ insertMessage(talker, talkerId, msg, 10000, createTime);
+ }
+
+ public void insertMessage(String talker, int talkerId, String msg, int type, long createTime) {
+ int status = 3;
+ long msgSvrId = createTime + (new Random().nextInt());
+ long msgId = getNextMsgId();
+ ContentValues v = new ContentValues();
+ v.put("msgId", msgId);
+ v.put("msgSvrid", msgSvrId);
+ v.put("type", type);
+ v.put("status", status);
+ v.put("createTime", createTime);
+ v.put("talker", talker);
+ v.put("content", msg);
+ if (talkerId != -1) {
+ v.put("talkerid", talkerId);
+ }
+ insertSQL("message", "", v);
+ }
+
+ public long getNextMsgId() {
+ Cursor cursor = rawQuery("SELECT max(msgId) FROM message");
+ if (cursor == null || !cursor.moveToFirst())
+ return -1;
+
+ long id = cursor.getInt(0) + 1;
+ cursor.close();
+ return id;
+ }
+
+ public Cursor getLastMsg(String username) {
+ String query = "SELECT * FROM message WHERE msgId = (SELECT max(msgId) FROM message WHERE talker='" +
+ username + "')";
+ return rawQuery(query);
+ }
+
+ public int getUnreadCount(String username) {
+ Cursor cursor = rawQuery("select unReadCount from rconversation where " +
+ "username = '" + username
+ + "' and ( parentref is null or parentref = '' ) ");
+
+ if (cursor == null || !cursor.moveToFirst())
+ return 0;
+
+ int cnt = cursor.getInt(cursor.getColumnIndex("unReadCount"));
+ cursor.close();
+ return cnt;
+ }
+
+ public String getNickname(String username) {
+ if (mNicknameCache.containsKey(username)) {
+ return mNicknameCache.get(username);
+ }
+
+ Cursor cursor = getContact(username);
+ if (cursor == null || !cursor.moveToFirst())
+ return username;
+
+ String name = cursor.getString(cursor.getColumnIndex("conRemark"));
+ if (TextUtils.isEmpty(name)) {
+ name = cursor.getString(cursor.getColumnIndex("nickname"));
+ }
+ name = name.trim();
+ cursor.close();
+ mNicknameCache.put(username, name);
+ return name;
+ }
+
+ public HashMap getChatRoomMembers() {
+ String query = "SELECT * FROM chatroom";
+ Cursor cursor = rawQuery(query);
+
+ HashMap map = new HashMap<>();
+
+ if (cursor == null || !cursor.moveToFirst())
+ return map;
+
+ do {
+ String memberlist = cursor.getString(cursor.getColumnIndex("memberlist"));
+ String displayname = cursor.getString(cursor.getColumnIndex("displayname"));
+
+ String[] members = memberlist.split(";");
+ String[] names;
+ if (displayname.contains("、")) {
+ names = displayname.split("、");
+ } else {
+ names = displayname.split(",");
+ }
+
+ for (int i = 0; i < members.length; i++) {
+ map.put(members[i].trim(), names[i].trim());
+ }
+
+ } while (cursor.moveToNext());
+ cursor.close();
+
+ return map;
+ }
+
+ public String getChatroomName(String username) {
+ String name = getNickname(username);
+ if (!TextUtils.isEmpty(name))
+ return name;
+
+ String query = "SELECT * FROM chatroom WHERE chatroomname = ?";
+ Cursor cursor = rawQuery(query, new String[]{username});
+ if (cursor == null || !cursor.moveToFirst())
+ return null;
+
+ name = cursor.getString(cursor.getColumnIndex("displayname"));
+ cursor.close();
+ return name;
+ }
+
+ public String getChatroomMemberName(String username) {
+ if (mChatroomMemberMap == null) {
+ mChatroomMemberMap = getChatRoomMembers();
+ }
+
+ if (mChatroomMemberMap.containsKey(username)) {
+ return mChatroomMemberMap.get(username);
+ }
+
+ // reload
+ mChatroomMemberMap = getChatRoomMembers();
+ if (mChatroomMemberMap.containsKey(username)) {
+ return mChatroomMemberMap.get(username);
+ }
+ return null;
+ }
+
+ public Cursor getContact(String username) {
+ String query = "SELECT * FROM rcontact WHERE username = ?";
+ return rawQuery(query, new String[]{username});
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/WechatUnrecalledHook.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/WechatUnrecalledHook.java
new file mode 100644
index 0000000..8c5cbc8
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/com/xposed/hook/wechat/WechatUnrecalledHook.java
@@ -0,0 +1,286 @@
+package com.xposed.hook.wechat;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.lang.reflect.Constructor;
+import java.util.HashMap;
+import java.util.Map;
+
+import de.robv.android.xposed.XC_MethodHook;
+import de.robv.android.xposed.XposedBridge;
+import de.robv.android.xposed.XposedHelpers;
+
+import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
+import static de.robv.android.xposed.XposedHelpers.findClass;
+
+/**
+ * Created by lin on 2018/2/6.
+ */
+
+public class WechatUnrecalledHook {
+
+ private static final int EXEC_SUC = 1;
+
+ static final String SQLiteDatabaseClass = "com.tencent.wcdb.database.SQLiteDatabase";
+
+ private static final String recallClass = LuckyMoneyHook.WECHAT_PACKAGE_NAME + ".sdk.platformtools.bw";
+ private static final String recallMethod = "S";
+ private static final String storageClass = LuckyMoneyHook.WECHAT_PACKAGE_NAME + ".storage.w";
+ private static final String storageMethodParam = LuckyMoneyHook.WECHAT_PACKAGE_NAME + ".sdk.e.e";
+ private static final String incMsgLocalIdClass = LuckyMoneyHook.WECHAT_PACKAGE_NAME + ".storage.bl";
+ private static final String incMsgLocalIdMethod = "aHd";
+ private static final String updateMsgLocalIdMethod = "ao";
+ private static final String updateMsgLocalIdMethodParam = LuckyMoneyHook.WECHAT_PACKAGE_NAME + ".storage.bk";
+
+ private static final boolean mDebug = true;
+ private WechatMainDBHelper mDb;
+ private Object mObject;
+ private Object updateMsgLocalIdMethodParamObj;
+
+ private Map mSettings = new HashMap<>();
+
+ WechatUnrecalledHook(String packageName) {
+ mSettings.put("prevent_moments_recall", true);
+ mSettings.put("prevent_comments_recall", true);
+ }
+
+ private static void findAndHookConstructor(String className, ClassLoader classLoader, Object... parameters) {
+ Class> cls = findClass(className, classLoader);
+ Class>[] parameterTypes = new Class[parameters.length - 1];
+ for (int i = 0; i < parameters.length - 1; i++) {
+ if (parameters[i] instanceof String) {
+ parameterTypes[i] = findClass((String) parameters[i], classLoader);
+ } else if (parameters[i] instanceof Class) {
+ parameterTypes[i] = (Class>) parameters[i];
+ }
+ }
+ try {
+ Constructor> constructor = cls.getDeclaredConstructor(parameterTypes);
+ constructor.setAccessible(true);
+ XC_MethodHook callback = (XC_MethodHook) parameters[parameters.length - 1];
+ XposedBridge.hookMethod(constructor, callback);
+ } catch (Throwable t) {
+ XposedBridge.log(t);
+ }
+ }
+
+ public void hook(final ClassLoader loader) {
+ try {
+ hookRecall(loader);
+ } catch (Throwable e) {
+ XposedBridge.log(e);
+ }
+ try {
+ hookDatabase(loader);
+ } catch (Throwable e) {
+ XposedBridge.log(e);
+ }
+ try {
+ hookDbObject(loader);
+ } catch (Throwable t) {
+ XposedBridge.log(t);
+ }
+ try {
+ hookMsgLocalId(loader);
+ } catch (Throwable t) {
+ XposedBridge.log(t);
+ }
+ }
+
+ private void hookRecall(final ClassLoader loader) {
+ findAndHookMethod(recallClass, loader,
+ recallMethod, String.class, String.class,
+ new XC_MethodHook() {
+ @SuppressWarnings("unchecked")
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ preventMsgRecall(param);
+ }
+ });
+ }
+
+ private void hookDatabase(ClassLoader loader) {
+ findAndHookMethod(SQLiteDatabaseClass, loader,
+ "updateWithOnConflict", String.class, ContentValues.class, String.class,
+ String[].class, int.class,
+ new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ preventCommentRecall(param);
+ preventMomentRecall(param);
+ }
+ });
+
+ findAndHookMethod(SQLiteDatabaseClass, loader,
+ "executeSql", String.class, Object[].class, "com.tencent.wcdb.support.CancellationSignal", new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ String query = (String) param.args[0];
+ if (mSettings.get("prevent_moments_recall") &&
+ query.toLowerCase().contains("snsinfo set sourcetype")) {
+ XposedBridge.log("preventMomentRecall executeSql");
+ param.setResult(EXEC_SUC);
+ }
+ }
+ });
+
+ }
+
+ static void hook3DaysMoments(ClassLoader loader) {
+ findAndHookMethod(SQLiteDatabaseClass, loader, "rawQueryWithFactory",
+ SQLiteDatabaseClass + ".CursorFactory", String.class, Object[].class, String.class, "com.tencent.wcdb.support.CancellationSignal",
+ new XC_MethodHook() {
+ @Override
+ protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
+ Log.e("rawQueryWithFactory", param.args[1] + ":" + param.args[3]);
+ String sourceType = "sourceType in (8,72,10,74,12,76,14,78,24,88,26,90,28,92,30,94)";
+ String type = "type in ( 1,2 , 3 , 4 , 18 , 5 , 12 , 9 , 14 , 15 , 13 , 21 , 25 , 26,28,29,30)";
+ if (param.args[1] != null && param.args[1].toString().contains("from SnsInfo") &&
+ param.args[1].toString().contains(sourceType) &&
+ param.args[1].toString().contains(type)) {
+ param.args[1] = param.args[1].toString().replace(sourceType, "1=1")
+ .replace(type, "1=1")
+ .replace("snsId >=", "0 !=");
+ }
+ }
+
+ });
+ }
+
+ private void hookDbObject(final ClassLoader loader) {
+ // get database object
+ findAndHookConstructor(storageClass, loader,
+ storageMethodParam, new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ // look for: LinkedBlockingQueue
+ if (mDb == null) {
+ try {
+ mDb = new WechatMainDBHelper(param.args[0]);
+ } catch (Throwable t) {
+ log(t);
+ }
+ }
+ }
+ });
+ }
+
+ private void hookMsgLocalId(ClassLoader loader) {
+ findAndHookMethod(incMsgLocalIdClass, loader, incMsgLocalIdMethod, String.class, new XC_MethodHook() {
+ @Override
+ protected void afterHookedMethod(MethodHookParam param) throws Throwable {
+ if ("message".equals(param.args[0]))
+ mObject = param.getResult();
+ }
+ });
+ try {
+ Class cls = XposedHelpers.findClass(updateMsgLocalIdMethodParam, loader);
+ updateMsgLocalIdMethodParamObj = cls.newInstance();
+ } catch (Throwable e) {
+ XposedBridge.log(e);
+ }
+ }
+
+ private void preventMsgRecall(XC_MethodHook.MethodHookParam param) {
+ String xml = (String) param.args[0];
+ String tag = (String) param.args[1];
+ if (TextUtils.isEmpty(xml) || TextUtils.isEmpty(tag) ||
+ !tag.equals("sysmsg") || !xml.contains("revokemsg")) {
+ return;
+ }
+
+ @SuppressWarnings("unchecked") Map map =
+ (Map) param.getResult();
+ if (map == null)
+ return;
+
+ String key = ".sysmsg.$type";
+ if (!map.containsKey(key))
+ return;
+
+ String type = map.get(key);
+ if (type == null || !type.equals("revokemsg"))
+ return;
+
+ final String talker = map.get(".sysmsg.revokemsg.session");
+ String replacemsg = map.get(".sysmsg.revokemsg.replacemsg");
+ String msgsvrid = map.get(".sysmsg.revokemsg.newmsgid");
+
+ if (replacemsg.startsWith("你") || replacemsg.toLowerCase().startsWith("you")) {
+ return;
+ }
+
+ String[] strings = replacemsg.split("\"");
+ replacemsg = "\"" + strings[1] + "\" " + "尝试撤回上一条消息 (已阻止)";
+
+ map.put(key, null);
+ param.setResult(map);
+
+ try {
+ Cursor cursor = mDb.getMessageBySvrId(msgsvrid);
+ if (cursor == null || !cursor.moveToFirst())
+ return;
+
+ long createTime = cursor.getLong(cursor.getColumnIndex("createTime"));
+ int idx = cursor.getColumnIndex("talkerId");
+ int talkerId = -1;
+ if (idx != -1) {
+ talkerId = cursor.getInt(cursor.getColumnIndex("talkerId"));
+ }
+ cursor.close();
+ mDb.insertSystemMessage(talker, talkerId, replacemsg, createTime + 1);
+ updateMessageCount();
+ } catch (Throwable t) {
+ XposedBridge.log(t);
+ }
+
+ }
+
+ private void updateMessageCount() {
+ if (mObject != null) {
+ XposedHelpers.callMethod(mObject, updateMsgLocalIdMethod, updateMsgLocalIdMethodParamObj);
+ XposedBridge.log("updateMessageCount");
+ }
+ }
+
+ private void preventCommentRecall(XC_MethodHook.MethodHookParam param) {
+ String table = (String) param.args[0];
+ if (!table.equalsIgnoreCase("snscomment"))
+ return;
+
+ ContentValues v = (ContentValues) param.args[1];
+ if (v.containsKey("commentflag") && v.getAsInteger("commentflag") == 1 &&
+ mSettings.get("prevent_comments_recall")) {
+ XposedBridge.log("preventCommentRecall");
+ param.setResult(EXEC_SUC); // prevent call
+ }
+ }
+
+ private void preventMomentRecall(XC_MethodHook.MethodHookParam param) {
+ String table = (String) param.args[0];
+ if (!table.equalsIgnoreCase("snsinfo"))
+ return;
+
+ ContentValues v = (ContentValues) param.args[1];
+ if (mSettings.get("prevent_moments_recall") &&
+ v.containsKey("sourceType") && v.containsKey("type")) {
+ int sourceType = v.getAsInteger("sourceType");
+ int type = v.getAsInteger("type");
+ //type: 2: text, 21 luckymoneyphoto,
+ if (sourceType == 0 || (type != 2 && sourceType == 8/*set to private*/)) {
+ XposedBridge.log("preventMomentRecall");
+ param.setResult(EXEC_SUC); // prevent call
+ }
+ }
+ }
+
+ private void log(Throwable t) {
+ if (mDebug) {
+ XposedBridge.log(t);
+ }
+ }
+
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/MethodParams.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/MethodParams.java
new file mode 100644
index 0000000..4b8b8cb
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/MethodParams.java
@@ -0,0 +1,12 @@
+package mirror;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MethodParams {
+ Class>[] value();
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/MethodReflectParams.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/MethodReflectParams.java
new file mode 100644
index 0000000..d2f9b5a
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/MethodReflectParams.java
@@ -0,0 +1,12 @@
+package mirror;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Target({ElementType.FIELD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface MethodReflectParams {
+ String[] value();
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefBoolean.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefBoolean.java
new file mode 100644
index 0000000..995af1d
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefBoolean.java
@@ -0,0 +1,28 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+public class RefBoolean {
+ private Field field;
+
+ public RefBoolean(Class> cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public boolean get(Object object) {
+ try {
+ return this.field.getBoolean(object);
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ public void set(Object obj, boolean value) {
+ try {
+ this.field.setBoolean(obj, value);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefClass.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefClass.java
new file mode 100644
index 0000000..0d7dca6
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefClass.java
@@ -0,0 +1,57 @@
+package mirror;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+
+public final class RefClass {
+
+ private static HashMap,Constructor>> REF_TYPES = new HashMap, Constructor>>();
+ static {
+ try {
+ REF_TYPES.put(RefObject.class, RefObject.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefMethod.class, RefMethod.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefInt.class, RefInt.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefLong.class, RefLong.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefFloat.class, RefFloat.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefDouble.class, RefDouble.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefBoolean.class, RefBoolean.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefStaticObject.class, RefStaticObject.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefStaticInt.class, RefStaticInt.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefStaticMethod.class, RefStaticMethod.class.getConstructor(Class.class, Field.class));
+ REF_TYPES.put(RefConstructor.class, RefConstructor.class.getConstructor(Class.class, Field.class));
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static Class> load(Class> mappingClass, String className) {
+ try {
+ return load(mappingClass, Class.forName(className));
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+
+ public static Class load(Class mappingClass, Class> realClass) {
+ Field[] fields = mappingClass.getDeclaredFields();
+ for (Field field : fields) {
+ try {
+ if (Modifier.isStatic(field.getModifiers())) {
+ Constructor> constructor = REF_TYPES.get(field.getType());
+ if (constructor != null) {
+ field.set(null, constructor.newInstance(realClass, field));
+ }
+ }
+ }
+ catch (Exception e) {
+ // Ignore
+ }
+ }
+ return realClass;
+ }
+
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefConstructor.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefConstructor.java
new file mode 100644
index 0000000..03736a3
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefConstructor.java
@@ -0,0 +1,49 @@
+package mirror;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+
+public class RefConstructor {
+ private Constructor> ctor;
+
+ public RefConstructor(Class> cls, Field field) throws NoSuchMethodException {
+ if (field.isAnnotationPresent(MethodParams.class)) {
+ Class>[] types = field.getAnnotation(MethodParams.class).value();
+ ctor = cls.getDeclaredConstructor(types);
+ } else if (field.isAnnotationPresent(MethodReflectParams.class)) {
+ String[] values = field.getAnnotation(MethodReflectParams.class).value();
+ Class[] parameterTypes = new Class[values.length];
+ int N = 0;
+ while (N < values.length) {
+ try {
+ parameterTypes[N] = Class.forName(values[N]);
+ N++;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ ctor = cls.getDeclaredConstructor(parameterTypes);
+ } else {
+ ctor = cls.getDeclaredConstructor();
+ }
+ if (ctor != null && !ctor.isAccessible()) {
+ ctor.setAccessible(true);
+ }
+ }
+
+ public T newInstance() {
+ try {
+ return (T) ctor.newInstance();
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public T newInstance(Object... params) {
+ try {
+ return (T) ctor.newInstance(params);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefDouble.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefDouble.java
new file mode 100644
index 0000000..0608c4c
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefDouble.java
@@ -0,0 +1,28 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+public class RefDouble {
+ private Field field;
+
+ public RefDouble(Class cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public double get(Object object) {
+ try {
+ return this.field.getDouble(object);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ public void set(Object obj, double value) {
+ try {
+ this.field.setDouble(obj, value);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefFloat.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefFloat.java
new file mode 100644
index 0000000..117383b
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefFloat.java
@@ -0,0 +1,28 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+public class RefFloat {
+ private Field field;
+
+ public RefFloat(Class cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public float get(Object object) {
+ try {
+ return this.field.getFloat(object);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ public void set(Object obj, float value) {
+ try {
+ this.field.setFloat(obj, value);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefInt.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefInt.java
new file mode 100644
index 0000000..6795ec2
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefInt.java
@@ -0,0 +1,28 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+public class RefInt {
+ private Field field;
+
+ public RefInt(Class cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public int get(Object object) {
+ try {
+ return this.field.getInt(object);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ public void set(Object obj, int intValue) {
+ try {
+ this.field.setInt(obj, intValue);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefLong.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefLong.java
new file mode 100644
index 0000000..ccdaeb9
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefLong.java
@@ -0,0 +1,28 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+public class RefLong {
+ private Field field;
+
+ public RefLong(Class cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public long get(Object object) {
+ try {
+ return this.field.getLong(object);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ public void set(Object obj, long value) {
+ try {
+ this.field.setLong(obj, value);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefMethod.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefMethod.java
new file mode 100644
index 0000000..77cb78e
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefMethod.java
@@ -0,0 +1,90 @@
+package mirror;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import static mirror.RefStaticMethod.getProtoType;
+
+@SuppressWarnings("unchecked")
+public class RefMethod {
+ private Method method;
+
+ public RefMethod(Class> cls, Field field) throws NoSuchMethodException {
+ if (field.isAnnotationPresent(MethodParams.class)) {
+ Class>[] types = field.getAnnotation(MethodParams.class).value();
+ for (int i = 0; i < types.length; i++) {
+ Class> clazz = types[i];
+ if (clazz.getClassLoader() == getClass().getClassLoader()) {
+ try {
+ Class.forName(clazz.getName());
+ Class> realClass = (Class>) clazz.getField("TYPE").get(null);
+ types[i] = realClass;
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ this.method = cls.getDeclaredMethod(field.getName(), types);
+ this.method.setAccessible(true);
+ } else if (field.isAnnotationPresent(MethodReflectParams.class)) {
+ String[] typeNames = field.getAnnotation(MethodReflectParams.class).value();
+ Class>[] types = new Class>[typeNames.length];
+ for (int i = 0; i < typeNames.length; i++) {
+ Class> type = getProtoType(typeNames[i]);
+ if (type == null) {
+ try {
+ type = Class.forName(typeNames[i]);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ types[i] = type;
+ }
+ this.method = cls.getDeclaredMethod(field.getName(), types);
+ this.method.setAccessible(true);
+ }
+ else {
+ for (Method method : cls.getDeclaredMethods()) {
+ if (method.getName().equals(field.getName())) {
+ this.method = method;
+ this.method.setAccessible(true);
+ break;
+ }
+ }
+ }
+ if (this.method == null) {
+ throw new NoSuchMethodException(field.getName());
+ }
+ }
+
+ public T call(Object receiver, Object... args) {
+ try {
+ return (T) this.method.invoke(receiver, args);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() != null) {
+ e.getCause().printStackTrace();
+ } else {
+ e.printStackTrace();
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public T callWithException(Object receiver, Object... args) throws Throwable {
+ try {
+ return (T) this.method.invoke(receiver, args);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() != null) {
+ throw e.getCause();
+ }
+ throw e;
+ }
+ }
+
+ public Class>[] paramList() {
+ return method.getParameterTypes();
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefObject.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefObject.java
new file mode 100644
index 0000000..dcbf977
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefObject.java
@@ -0,0 +1,29 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+@SuppressWarnings("unchecked")
+public class RefObject {
+ private Field field;
+
+ public RefObject(Class> cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public T get(Object object) {
+ try {
+ return (T) this.field.get(object);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+
+ public void set(Object obj, T value) {
+ try {
+ this.field.set(obj, value);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticInt.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticInt.java
new file mode 100644
index 0000000..6617419
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticInt.java
@@ -0,0 +1,28 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+public class RefStaticInt {
+ private Field field;
+
+ public RefStaticInt(Class> cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public int get() {
+ try {
+ return this.field.getInt(null);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ public void set(int value) {
+ try {
+ this.field.setInt(null, value);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticMethod.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticMethod.java
new file mode 100644
index 0000000..a4be897
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticMethod.java
@@ -0,0 +1,136 @@
+package mirror;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+@SuppressWarnings("unchecked")
+public class RefStaticMethod {
+ private Method method;
+
+ public RefStaticMethod(Class> cls, Field field) throws NoSuchMethodException {
+ if (field.isAnnotationPresent(MethodParams.class)) {
+ Class>[] types = field.getAnnotation(MethodParams.class).value();
+ for (int i = 0; i < types.length; i++) {
+ Class> clazz = types[i];
+ if (clazz.getClassLoader() == getClass().getClassLoader()) {
+ try {
+ Class.forName(clazz.getName());
+ Class> realClass = (Class>) clazz.getField("TYPE").get(null);
+ types[i] = realClass;
+ } catch (Throwable e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ this.method = cls.getDeclaredMethod(field.getName(), types);
+ this.method.setAccessible(true);
+ } else if (field.isAnnotationPresent(MethodReflectParams.class)) {
+ boolean arrayset=false;
+ String[] typeNames = field.getAnnotation(MethodReflectParams.class).value();
+ Class>[] types = new Class>[typeNames.length];
+ Class>[] types2 = new Class>[typeNames.length];
+ for (int i = 0; i < typeNames.length; i++) {
+ Class> type = getProtoType(typeNames[i]);
+ if (type == null) {
+ try {
+ type = Class.forName(typeNames[i]);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+ types[i] = type;
+ if("java.util.HashSet".equals(typeNames[i])){
+ arrayset=true;
+ Class> type2 =type;
+ try {
+ type2 = Class.forName("android.util.ArraySet");
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ if(type2 != null) {
+ types2[i] = type2;
+ }else{
+ types2[i] = type;
+ }
+ }else{
+ types2[i] = type;
+ }
+ }
+ try {
+ this.method = cls.getDeclaredMethod(field.getName(), types);
+ }catch (Exception e){
+ e.printStackTrace();
+ if(arrayset){
+ this.method = cls.getDeclaredMethod(field.getName(), types2);
+ }
+ }
+ this.method.setAccessible(true);
+ } else {
+ for (Method method : cls.getDeclaredMethods()) {
+ if (method.getName().equals(field.getName())) {
+ this.method = method;
+ this.method.setAccessible(true);
+ break;
+ }
+ }
+ }
+
+ if (this.method == null) {
+ throw new NoSuchMethodException(field.getName());
+ }
+ }
+
+ static Class> getProtoType(String typeName) {
+ if (typeName.equals("int")) {
+ return Integer.TYPE;
+ }
+ if (typeName.equals("long")) {
+ return Long.TYPE;
+ }
+ if (typeName.equals("boolean")) {
+ return Boolean.TYPE;
+ }
+ if (typeName.equals("byte")) {
+ return Byte.TYPE;
+ }
+ if (typeName.equals("short")) {
+ return Short.TYPE;
+ }
+ if (typeName.equals("char")) {
+ return Character.TYPE;
+ }
+ if (typeName.equals("float")) {
+ return Float.TYPE;
+ }
+ if (typeName.equals("double")) {
+ return Double.TYPE;
+ }
+ if (typeName.equals("void")) {
+ return Void.TYPE;
+ }
+ return null;
+ }
+
+
+ public T call(Object... params) {
+ T obj = null;
+ try {
+ obj = (T) method.invoke(null, params);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return obj;
+ }
+
+ public T callWithException(Object... params) throws Throwable {
+ try {
+ return (T) this.method.invoke(null, params);
+ } catch (InvocationTargetException e) {
+ if (e.getCause() != null) {
+ throw e.getCause();
+ }
+ throw e;
+ }
+ }
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticObject.java b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticObject.java
new file mode 100644
index 0000000..7a4f9e4
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/java/mirror/RefStaticObject.java
@@ -0,0 +1,35 @@
+package mirror;
+
+import java.lang.reflect.Field;
+
+@SuppressWarnings("unchecked")
+public class RefStaticObject {
+ private Field field;
+
+ public RefStaticObject(Class> cls, Field field) throws NoSuchFieldException {
+ this.field = cls.getDeclaredField(field.getName());
+ this.field.setAccessible(true);
+ }
+
+ public Class> type() {
+ return field.getType();
+ }
+
+ public T get() {
+ T obj = null;
+ try {
+ obj = (T) this.field.get(null);
+ } catch (Exception e) {
+ //Ignore
+ }
+ return obj;
+ }
+
+ public void set(T obj) {
+ try {
+ this.field.set(null, obj);
+ } catch (Exception e) {
+ //Ignore
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_lucky_money_setting.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_lucky_money_setting.xml
new file mode 100644
index 0000000..fdd8e19
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_lucky_money_setting.xml
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_main.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..deadc3d
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_rimet.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_rimet.xml
new file mode 100644
index 0000000..cb91b2a
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/activity_rimet.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/item_package.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/item_package.xml
new file mode 100644
index 0000000..ba2089b
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/layout/item_package.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/menu/menu_main.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/menu/menu_main.xml
new file mode 100644
index 0000000..a7c1bb8
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/menu/menu_main.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-hdpi/ic_launcher.png b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..cde69bc
Binary files /dev/null and b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-mdpi/ic_launcher.png b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c133a0c
Binary files /dev/null and b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..bfa42f0
Binary files /dev/null and b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..324e72c
Binary files /dev/null and b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..aee44e1
Binary files /dev/null and b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values-zh/strings.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values-zh/strings.xml
new file mode 100644
index 0000000..debc9e6
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values-zh/strings.xml
@@ -0,0 +1,22 @@
+
+ FakeLocation2.0
+
+ GPS定位
+ 基站定位
+ 当前位置基站信息 Lac:%1$s
+ 当前位置基站信息 Cid:%1$s
+ 当前位置GPS信息 Latitude:%1$s
+ 当前位置GPS信息 Longitude:%1$s
+ 自动填入当前位置
+ 开启定位修改
+ 保存
+ 保存成功
+ 重启App
+
+ 微信红包
+ 快速打开红包
+ 有红包消息时toast提示
+ 消息防撤回
+ 解除好友朋友圈仅3天可见限制
+ 自动抢红包延时
+
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/colors.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000..5fc3d92
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #ff212121
+ #ff000000
+ #ff009688
+
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/strings.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000..7c04a49
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/strings.xml
@@ -0,0 +1,22 @@
+
+ FakeLocation2.0
+
+ GPS Location
+ Cell Location
+ Current Lac:%1$s
+ Current Cid:%1$s
+ Current Latitude:%1$s
+ Current Longitude:%1$s
+ Auto Fill
+ open hook
+ Save
+ Save Success
+ Reboot App
+
+ Wechat Hook
+ quick open lucky money
+ show lucky money coming toast
+ prevent message recalled
+ disable 3 days of Moments limit
+ lucky money delay
+
diff --git a/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/styles.xml b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000..5885930
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/src/FakeLocation-master/FakeLocation-master/build.gradle b/src/FakeLocation-master/FakeLocation-master/build.gradle
new file mode 100644
index 0000000..6b80ead
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/build.gradle
@@ -0,0 +1,25 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ repositories {
+ google()
+ jcenter()
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.6.3'
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/src/FakeLocation-master/FakeLocation-master/gradle.properties b/src/FakeLocation-master/FakeLocation-master/gradle.properties
new file mode 100644
index 0000000..aac7c9b
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/gradle.properties
@@ -0,0 +1,17 @@
+# Project-wide Gradle settings.
+
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
diff --git a/src/FakeLocation-master/FakeLocation-master/gradle/wrapper/gradle-wrapper.jar b/src/FakeLocation-master/FakeLocation-master/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..13372ae
Binary files /dev/null and b/src/FakeLocation-master/FakeLocation-master/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/src/FakeLocation-master/FakeLocation-master/gradle/wrapper/gradle-wrapper.properties b/src/FakeLocation-master/FakeLocation-master/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..583385e
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Wed May 27 21:46:47 CST 2020
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
diff --git a/src/FakeLocation-master/FakeLocation-master/gradlew b/src/FakeLocation-master/FakeLocation-master/gradlew
new file mode 100644
index 0000000..9d82f78
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+ echo "$*"
+}
+
+die ( ) {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=$((i+1))
+ done
+ case $i in
+ (0) set -- ;;
+ (1) set -- "$args0" ;;
+ (2) set -- "$args0" "$args1" ;;
+ (3) set -- "$args0" "$args1" "$args2" ;;
+ (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+ JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/src/FakeLocation-master/FakeLocation-master/gradlew.bat b/src/FakeLocation-master/FakeLocation-master/gradlew.bat
new file mode 100644
index 0000000..8a0b282
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/src/FakeLocation-master/FakeLocation-master/settings.gradle b/src/FakeLocation-master/FakeLocation-master/settings.gradle
new file mode 100644
index 0000000..e7b4def
--- /dev/null
+++ b/src/FakeLocation-master/FakeLocation-master/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/src/XPrivacy-master/XPrivacy-master.zip b/src/XPrivacy-master/XPrivacy-master.zip
new file mode 100644
index 0000000..9e43b95
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master.zip differ
diff --git a/src/XPrivacy-master/XPrivacy-master/.classpath b/src/XPrivacy-master/XPrivacy-master/.classpath
new file mode 100644
index 0000000..2dd6e11
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/.classpath
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/.gitignore b/src/XPrivacy-master/XPrivacy-master/.gitignore
new file mode 100644
index 0000000..477ec3c
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/.gitignore
@@ -0,0 +1,23 @@
+# built application files
+*.apk
+*.ap_
+
+# files for the dex VM
+*.dex
+
+# Java class files
+*.class
+
+# generated files
+bin/
+gen/
+
+# Local configuration file (sdk path, etc)
+local.properties
+
+# Eclipse project files
+#.classpath
+.project
+
+#proguard
+proguard/
diff --git a/src/XPrivacy-master/XPrivacy-master/.settings/org.eclipse.jdt.core.prefs b/src/XPrivacy-master/XPrivacy-master/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..b954e11
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,291 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=0
+org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
+org.eclipse.jdt.core.formatter.blank_lines_before_package=0
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=true
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
+org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
+org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.lineSplit=120
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=true
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
diff --git a/src/XPrivacy-master/XPrivacy-master/.settings/org.eclipse.jdt.ui.prefs b/src/XPrivacy-master/XPrivacy-master/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..9e285b6
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+formatter_profile=_Long lines
+formatter_settings_version=12
diff --git a/src/XPrivacy-master/XPrivacy-master/AndroidManifest.xml b/src/XPrivacy-master/XPrivacy-master/AndroidManifest.xml
new file mode 100644
index 0000000..bc9d416
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/AndroidManifest.xml
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/CHANGELOG-LEGACY.md b/src/XPrivacy-master/XPrivacy-master/CHANGELOG-LEGACY.md
new file mode 100644
index 0000000..b183d82
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/CHANGELOG-LEGACY.md
@@ -0,0 +1,3045 @@
+Legacy changelog
+================
+
+**XPrivacy 2 will not be maintained anymore.**
+
+See for more information about XPrivacy 3 [here](https://github.com/M66B/XPrivacy/blob/master/CHANGELOG.md).
+
+**Important**
+
+* Xposed version 2.6+ is required
+* Updating from a version prior to 2.0.35 the main template will be reset to default
+* Updating from a version prior to 2.1.5 on demand restricting will be disabled until the update is completed
+* Updating from a version prior to 2.1.8 you will need to setup the IPC restrictions again
+* Updating from a version prior to 2.1.21 you will need to setup the IPC restrictions again, except for *Reflection*
+* From version 2.0.29 dangerous functions need to be restricted manually (manually includes the template, if defined to do so)
+* From version 2.1.20 batch operations (toggle restrictions for multiple applications) require a pro license
+ * I have put about 2000 hours into developing and supporting XPrivacy so far. The reason for [accepting donations](http://www.xprivacy.eu/) is to keep myself motivated to keep doing this. Unfortunately the number of donations is quite low and thus not very motivating. So, don't start complaining about this change, but instead think about supporting this huge project. You can still fully protect your privacy with all the free features of XPrivacy. I have made a promise that you will always be able to do so and I intend to keep this promise.
+* From version 2.1.21-5 *I don't know* will allow dangerous functions once (other functions are still denied once)
+
+**Version 2.3 STABLE**
+
+Main changes since stable version 2.2.1:
+
+* Reviewed all about 250 restrictions, resulting in numerous changes, mainly visible as performance improvements
+* Reorganized menus, action bar items and other user interface elements to improve usability
+* Fixed all reported bugs and implemented lots of requested features
+* See for all details the changelogs of version 2.2.x
+
+Other changes:
+
+* Displaying if an application has specific fake values ([issue](/../../issues/1831))
+* Added help texts
+* Updated in application documentation
+* Added option to merge template to reset functions (not categories)
+* Clear will also clear usage data and application specific settings
+* Clear filters will reset the filters to their default state
+* Changed on demand restricting progress bar to holo style
+* Clicking the application name will open the application details view
+* Changed multiple selection background color
+* Reorganized menus and action bar items
+* Updated Arabic translation
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Italian translation
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Norwegian translation
+* Updated Russian translation
+* Updated Slovak translation
+* Updated simplified Chinese translation
+* Updated traditional Chinese translation
+
+**Version 2.2.12 BETA**
+
+* Fixed crash caused by legacy restrictions ([issue](/../../issues/1893))
+* Updated Slovak translation
+
+**Version 2.2.11 BETA**
+
+* Filtering restrictions available from version 2.99.x only (reported on XDA)
+
+**Version 2.2.10 BETA**
+
+* Filtering restrictions available from version 2.99.x only (reported on XDA)
+
+**Version 2.2.9 TEST**
+
+* Option to select duration to allow/deny once ([issue](/../../issues/1873))
+* Added help items to template ([issue](/../../issues/1827))
+* Added application specific quirks ([issue](/../../issues/1844))
+* Added intent for update check ([issue](/../../issues/1867))
+* Changed the default to *noresolve* and added quirk *resolve*
+* Flush will clear the asked once cache too
+* Display if update service is busy in reboot layout ([issue](/../../issues/1887))
+* Fixed asking again in some cases ([issue](/../../issues/1885))
+* Performance improvement (caching category restrictions)
+* Local transient values only
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Japanese translation
+* Updated Simplified Chinese translation
+* Updated Slovenian translation
+
+**Version 2.2.8 BETA**
+
+* Moved *getAllByName*, *getByAddress* and *getByName* to *internet*
+ * Since these functions were moved recently, it is not possible to update them
+* Performance optimizations (introduced transient values)
+* Fixed all problems reported through the support data
+* Allow own uid for *getPackagesForUid* and *queryContentProviders* ([issue](/../../issues/1871))
+* Updated Dutch translation
+* Updated Italian translation
+
+**Version 2.2.7 BETA**
+
+* Removed restrictions *MapV1.getLatitudeE6* and *MapV1.getLongitudeE6*, since these are not needed and bad for performance ([issue](/../../issues/1862))
+* Handling *MapV1.disableMyLocation* when *MapV1.enableMyLocation* is restricted
+
+**Version 2.2.6 BETA**
+
+* Enabled *Camera.permission*, *Record.Video.permission* and *Record.Audio.permission*
+
+**Version 2.2.5 BETA**
+
+* Enabled on demand restricting for *Camera.permission*, *Record.Video.permission* and *Record.Audio.permission*
+* Fixed *Camera.permission*, *Record.Video.permission* and *Record.Audio.permission* for some ROMs ([issue](/../../issues/1855))
+* Fixed repeated on demand restricting for functions with a whitelist
+* Removed [VACUUM](http://sqlite.org/lang_vacuum.html) for usage data database
+* Updated Dutch translation
+* Updated Japanese translation
+* Updated Simplified Chinese translation
+
+**Version 2.2.4 TEST**
+
+* Fixed alignment of the check boxes in the details view
+* Added menu *Check for updates* (only [Pro license](http://www.xprivacy.eu/))
+* Fixed restriction *Srv_startActivities* ([issue](/../../issues/1853))
+* Updated Dutch translation
+* Updated Simplified Chinese translation
+
+**Version 2.2.3 TEST**
+
+* Removed restriction *LinkAddress*, since it is not needed
+* Added support for [MEID](http://en.wikipedia.org/wiki/Mobile_equipment_identifier) and removed restrictions *getNetworkType* and *getPhoneType* ([issue](/../../issues/1843))
+* Prefixed *getAddress* and *getBondedDevices* with *Bluetooth*
+* Replaced *setPreviewCallback*, *setPreviewCallbackWithBuffer*, *setOneShotPreviewCallback* by *startPreview*
+* Prefixed *startPreview* and *takePicture* with *Camera*
+* Prefixed *startRecording* with *Audio*
+* Renamed *setOutputFile* into *MediaRecorder.start*
+* Restructured restriction meta data (no visible changes)
+* Fixed displaying white list entry state after scrolling ([issue](/../../issues/1850))
+* Added restrictions *Camera.permission*, *Record.Audio.permission* and *Record.Video.permission*
+* Hiding on demand restricting check box for functions without on demand restricting
+* Added Croatian translation
+* Updated Slovak translation
+
+**Version 2.2.2 TEST**
+
+The internet and network restrictions were reorganized.
+The internet restrictions are for restricting internet access,
+the network restrictions are for restricting network information, mainly IP addresses.
+Restrictions which were moved from one to the other category will be updated automatically,
+but a function can only be restricted if the category is restricted.
+This means that if a function was moved from internet to network,
+it will only be restricted if the network category was restricted.
+
+* Fixed all problems reported through the support info
+* Option to white/black list from usage data (long press entry) ([issue](/../../issues/1821)) (only [Pro license](http://www.xprivacy.eu/))
+* Added IPC restrictions for *IApplicationThread*, *IContentProvider* and *IWindowSession* (on demand restricting only)
+* Added wildcards for IPC transaction names
+* Fixed translating transaction codes into transaction names in most cases
+* Restricting [ACTION_PACKAGE_VERIFIED](http://developer.android.com/reference/android/content/Intent.html#ACTION_PACKAGE_VERIFIED) as intended
+* *DATA_SMS_RECEIVED*, *SMS_RECEIVED* and *WAP_PUSH_RECEIVED* were always part of Android, but only [documented since KitKat](https://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html)
+* Translating isolated uids into originating application uids
+* Fixed default on demand restricting for dangerous functions with a whitelist while no on demand restricting for category
+* Added restriction [ACTION_DIAL](http://developer.android.com/reference/android/content/Intent.html#ACTION_DIAL)
+* Removed restriction *ApplicationsProvider* for KitKat, since the provider doesn't exist anymore
+* Made *accounts/hasFeatures* dangerous
+* Added restrictions [SMS_DELIVER](https://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html#SMS_DELIVER_ACTION) and [WAP_PUSH_DELIVER](https://developer.android.com/reference/android/provider/Telephony.Sms.Intents.html#WAP_PUSH_DELIVER_ACTION)
+* Corrected some restriction permissions
+* Moved restrictions *getAllByName*, *getByAddress* and *getByName* ([InetAddress](http://developer.android.com/reference/java/net/InetAddress.html)) from *internet* to *network*
+* Fixed restrictions *getByAddress* and *getByName*; to prevent problems these dangerous restrictions need to be set again
+* Prefixed *getHardwareAddress*, *getInetAddresses* and *getInterfaceAddresses* (network) with [NetworkInterface](http://developer.android.com/reference/java/net/NetworkInterface.html)
+* Prefixed *getByInetAddress*, *getByName* and *getNetworkInterfaces* (internet) with [NetworkInterface](http://developer.android.com/reference/java/net/NetworkInterface.html)
+* Added restriction [NetworkInterface.getByIndex](http://developer.android.com/reference/java/net/NetworkInterface.html#getByIndex(int))
+* Prefixed *getDetailedState*, *getState*, *isConnected* and *isConnectedOrConnecting* with [NetworkInfo](http://developer.android.com/reference/android/net/NetworkInfo.html)
+* Moved *getExtraInfo* to *network*
+* Prefixed *getActiveNetworkInfo*, *getAllNetworkInfo* and *getNetworkInfo* with *Connectivity*
+* Prefixed *getConfiguredNetworks*, *getConnectionInfo*, *getDhcpInfo*, *getScanResults*, and *getWifiApConfiguration* with *WiFi*
+* Updated in application documentation
+* Updated Dutch translation
+* Updated German translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+
+**Version 2.2.1 STABLE**
+
+* Fixed all problems reported through the support info
+* Removed restriction *IPC.Reflection* to fix delays/freezes ([issue](/../../issues/1820))
+* Better handling of [StrictMode](http://developer.android.com/reference/android/os/StrictMode.html)
+* Updated Polish translation
+
+**Version 2.2 STABLE**
+
+Changes since last stable version:
+
+* Added a series of new restrictions and improved/extended existing restrictions
+* Redesigned on demand restricting dialog
+* Added experimental support for [Cydia Substrate](http://www.cydiasubstrate.com/)
+* Several improvements and bug fixes
+* See for all details the changes since version 2.1.5
+
+Changes since previous version:
+
+* Updated German translation
+* Updated Italian translation
+* Updated Japanese translation
+* Updated Norwegian translation
+* Remember on demand dialog settings across reboots ([issue](/../../issues/1812))
+* Showing stored version in *About* when different from current version
+* Removed function help from on demand dialog
+* Displaying less details in on demand dialog in expert mode
+
+**Version 2.1.26 BETA**
+
+* Fixed crash while deleting white/black list entries
+* Fixed all problems reported through the support info
+* Updated Slovak translation
+
+**Version 2.1.25 TEST**
+
+* Enabled Google Maps API v2 restrictions
+* Added restrictions for [Google Maps API v1](https://developers.google.com/maps/documentation/android/v1/reference/index) ([issue](/../../issues/1807))
+
+**Version 2.1.24-2 TEST**
+
+* Added IPC restriction *ICameraService*
+
+**Version 2.1.24-1 TEST**
+
+* Updated some texts
+* Added restrictions for [Google Maps API v2](http://developer.android.com/reference/com/google/android/gms/maps/GoogleMap.html) ([issue](/../../issues/1807))
+
+**Version 2.1.24 TEST**
+
+* Added category help
+* Moved on demand restricting details to expert mode
+* Rewrote location restrictions
+* Fixed fake location for Play services locations
+* Optimized *intent* restricting for performance
+* Moved *android.intent.action.NEW_OUTGOING_CALL* and *CallLogProvider* from *Phone* to *Calling* category
+* Added *quirks* settings
+* Updated Dutch translation
+* Updated German translation
+* Updated Italian translation
+* Updated Lithuanian translation
+
+**Version 2.1.22 BETA**
+
+* Added reset button to on demand dialog
+* Optimized IPC restrictions performance
+* Updated Japanese translation
+
+**Version 2.1.21 TEST**
+
+* Added option to specify file name to export intent ([issue](/../../issues/1784))
+* Added option to blacklist applications, accounts and contacts ([issue](/../../issues/1781))
+* Fixed order of applications to allow ([Pro license](http://www.xprivacy.eu/) only)
+* Allowing cancel of accounts, applications and contacts to allow dialog
+* Faster and more secure IPC restriction implementation with transaction whitelisting
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Improved on demand dialog layout
+* Added help for function documentation icon
+* Show function help in on demand dialog ([issue](/../../issues/1790))
+* Allow dangerous functions for *I don't know*
+* Fixed on demand dialog freeze by not on demand restricting in some situations, see also the [FAQ](https://github.com/M66B/XPrivacy#FAQ64)
+* Updated Dutch translation
+* Updated Japanese translation
+* Updated Slovenian translation
+
+**Version 2.1.20 BETA**
+
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Added option to sort by state ([issue](/../../issues/1772))
+* Some small performance optimizations
+* Require a pro license for batch operations (toggle restrictions for multiple applications)
+ * I have put about 2000 hours into developing and supporting XPrivacy so far. The reason for [accepting donations](http://www.xprivacy.eu/) is to keep myself motivated to keep doing this. Unfortunately the number of donations is quite low and thus not very motivating. So, don't start complaining about this change, but instead think about supporting this huge project. You can still fully protect your privacy with all the free features of XPrivacy. I have made a promise that you will always be able to do so and I intent to keep this promise.
+* Allow white listing of top folders of file name of *android.intent.action.VIEW*
+* Made *getAllProviders* and *getBestProvider* dangerous
+* Updated Danish translation
+* Updated Dutch translation
+* Updated German translation
+* Updated Slovak translation
+
+**Version 2.1.19 BETA**
+
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Cache empty settings (performance)
+* Updated Russian translation
+
+**Version 2.1.18 TEST**
+
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Leave on demand dialog buttons enabled when new dialog within 1 second
+* Updated in application documentation, thanks @[an0n981](https://github.com/an0n981)
+* Updated German translation
+* Updated Vietnamese translation
+
+**Version 2.1.17 TEST**
+
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Removed restrictions for *NEW_PICTURE* and *ACTION_NEW_VIDEO* broadcasts
+ * Has been replaced by:
+* Added restrictions for [ContentResolver.open...](http://developer.android.com/reference/android/content/ContentResolver.html)
+* Added restriction for *InputDevice.getName*
+* Added restriction for *addGpsStatusListener*, *getAllProviders* and *getBestProvider*
+* Added parameter provider name to *isProviderEnabled*, *getLastKnownLocation*, *requestLocationUpdates*, *requestSingleUpdate*, and *sendExtraCommand*
+* Added parameter host name to *getAllByName*, *getByAddress* and *getByName*
+* Added parameter path to *MediaRecorder.setOutputFile*
+* Added restriction for *getPackagesForUid*
+* Added process name parameter to *queryContentProviders*
+* Added restriction *SIP.isSipWifiOnly*
+* Added parameter destination address to *sendDataMessage*, *sendMultipartTextMessage* and *sendTextMessage* (SMS)
+* Added whitelist to *sendDataMessage*, *sendMultipartTextMessage* and *sendTextMessage* (SMS)
+* Added parameter key to *%imei*, *%hostname*, *%serialno*, *%macaddr* and *%cid*
+* Added parameter user agent to *getUserAgentString*
+* Added parameter device name to *USB.getDeviceId*
+* Added white list to *getAllByName*, *getByAddress* and *getByName*
+* Added restriction for *LinkAddress.toString* (Android "L") ([issue](/../../issues/1757))
+* Added restriction for heart rate sensor (Android "L") ([issue](/../../issues/1757))
+* Added restriction for *USB.getSerialNumber* (Android "L") ([issue](/../../issues/1757))
+* Added restriction for new camera device (Android "L") ([issue](/../../issues/1757))
+* One second delay before enabling on demand dialog buttons
+* Updated Dutch translation
+* Updated Italian translation
+
+**Version 2.1.16 BETA**
+
+* Fixed repeating on demand restricting
+
+**Version 2.1.15 BETA**
+
+* Added restrictions for NEW_PICTURE and ACTION_NEW_VIDEO broadcasts
+* Fixed on demand once caching restriction
+
+**Version 2.1.14 BETA**
+
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Fixed returning wrong restriction sometimes for repeated on demand restricting
+* Fixed finger print lockscreen ([issue](/../../issues/1759))
+* Added allow/deny once for category ([issue](/../../issues/1764))
+* Added white/black listing for parent folder ([issue](/../../issues/1474))
+* Added option to disable restrictions at boot:
+
+```
+cd /data/system/xprivacy
+echo "ipc" >disabled
+echo "system.getInstalledProviders" >>disabled
+```
+
+**Version 2.1.12 BETA**
+
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Fixed compatibility with [Boat Browser](https://play.google.com/store/apps/details?id=com.boatbrowser.free) ([issue](/../../issues/1760))
+* Fixed on demand restricting dialog background color for dangerous functions / system applications
+* Added statistics to title of usage list
+* Updated Slovak translation
+* Updated traditional Chinese translation
+
+**Version 2.1.11 BETA**
+
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Attempt to fix on demand transparency ([issue](/../../issues/1755))
+
+**Version 2.1.10 BETA**
+
+* Fixed IPC restrictions
+
+**Version 2.1.9 BETA**
+
+* Added some help texts
+* Fixed all problems reported through the support info
+ * Thanks for sending all the support info!
+* Added IPC restriction *bluetooth*
+* Updated Dutch translation
+* Updated German translation
+
+**Version 2.1.8 TEST**
+
+* Allow management binder transactions
+ * *service list* will not trigger IPC restrictions anymore
+* Made IPC restrictions apply to Java calls too
+ * **The IPC restrictions need to be set again, because they were renamed to prevent trouble**
+* Added IPC restrictions
+ * *ISipService*
+ * *ISms*
+ * *INfcAdapter*
+ * *IAppWidgetService*
+ * *IBluetoothManager*
+ * *IInputManager*
+ * *SensorServer*
+ * *IUsbManager*
+* Added get method [reflection](http://en.wikipedia.org/wiki/Reflection_(computer_programming)) restriction (IPC category)
+ * Methods can be white/black listed
+* Added experimental support for [Cydia Substrate](http://www.cydiasubstrate.com/)
+ * *Build.SERIAL* cannot be restricted
+ * *Settings.Secure.ANDROID_ID* cannot be restricted
+* Made update service not run for future versions (for testing purposes)
+* Performance improvements for AOSP based ROMs, including [CyanogenMod](http://www.cyanogenmod.org/) and [OmniROM](http://omnirom.org/)
+* Attempted to fix on demand dialog freezing by rewriting on demand dialog
+* Removed enabling on demand restricting on update
+ * You can use [PlayPermissionsExposed](http://forum.xda-developers.com/xposed/modules/playpermissionsexposed-fix-play-store-t2783076) instead
+* Fixed template function exceptions being display wrong for 15 seconds in some situations
+* Applying template will not set disabled restrictions anymore ([issue](/../../issues/1747))
+* Displaying *changed* state when all restrictions are cleared ([issue](/../../issues/1748))
+ * The application state is shown with a color left in the application list (see also the help legend)
+* Added restrictions for [UsbDevice](http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html) ([issue](/../../issues/1750))
+* Updated Slovak translation
+
+**Version 2.1.6 BETA**
+
+* Fixed updating dangerous function restrictions when restrict dangerous enabled ([issue](/../../issues/1742))
+* Display system components as disabled when restricting system components is not enabled ([issue](/../../issues/1744))
+* Display no usage data when restriction not available or disabled
+
+**Version 2.1.5 STABLE**
+
+* Added restrictions for [SIP](http://en.wikipedia.org/wiki/Session_Initiation_Protocol) calling ([issue](/../../issues/1739))
+* Disabling on demand restricting until update service completes
+* Showing whitelist icon on category level ([issue](/../../issues/1741))
+* Made *About* scrollable
+* Updated Italian translation
+* Updated Lithuanian translation
+
+**Version 2.1.4 STABLE**
+
+* Fixed applying template with dangerous function restrictions
+* Fixed caching of function template settings
+
+**Version 2.1.3 STABLE**
+
+* Added short usage instructions (check *About*)
+* Added *I don't know* to the on demand restricting dialog, which will deny once
+* Updated Dutch translation
+* Updated German translation
+* Updated Slovak translation
+
+**Version 2.1.2 STABLE**
+
+* Fixed displaying half on demand state template
+* Fixed dangerous functions defaults
+* Fixed on demand defaults when applying template
+* Fixed on demand defaults when on demand restricting category
+
+**Version 2.1.1 STABLE**
+
+* Added restriction for internet administration (*inet_admin*)
+* Added restriction for internet bandwidth statistics/administration (*inet_bw*)
+* Added restriction for [VPN](http://en.wikipedia.org/wiki/Vpn) services (*inet_vpn*)
+* Added restriction for [Mesh networking](http://en.wikipedia.org/wiki/Mesh_networking) services (*inet_mesh*)
+* Added restriction for [MTP](http://en.wikipedia.org/wiki/Media_Transfer_Protocol)
+* Fixed not disabling on demand function settings when on demand restricting for category is disabled
+* Hiding status bar when showing on demand restricting dialog
+
+**Version 2.1 STABLE**
+
+* Fixed applying template restricting dangerous functions ([issue](/../../issues/1728))
+* Applying template with on demand restricting will enabled on demand restricting setting ([issue](/../../issues/1727))
+* Fixed *inet*, *media* and *sdcard* always on demand restricting ([issue](/../../issues/1722))
+* Do not import version number ([issue](/../../issues/1721))
+* Display *Default* as first template name ([issue](/../../issues/1723))
+* Updated Dutch translation
+
+**Version 2.0.38 STABLE**
+
+* Showing enabled (on/off) state
+* Requesting restart for *load* and *loadLibrary*
+* Resetting on demand restricting for system applications on upgrade
+* Updated Slovak translation
+
+**Version 2.0.37 TEST**
+
+* Display whitelist icon when there are allowed accounts, applications and/or contacts
+* Restrictions for individual sensors
+ * *getDefaultSensor* and *getSensorList* needs to be disabled
+ * *getDefaultSensor* and *getSensorList* were made dangerous
+* Allow to select category when toggling restrictions
+
+**Version 2.0.36 STABLE**
+
+* Reddish background for template group indicators
+* Enabling on demand restricting before application is being updated
+* No on demand restricting for restrictions which cannot be used (see limitations)
+* Dropped support for Cydia Substrate, because there are too many unsolved problems
+
+**Version 2.0.35 BETA**
+
+* Fixed toggling dangerous functions not immediately displaying correct template restriction
+* Removed exception for disabling on demand restricting when changing category restriction on demand
+* Enable kill application menu only if application is running
+* Added experimental support for [Cydia Substrate](http://www.cydiasubstrate.com/)
+ * I can't get Cydia Substrate working if Xposed is not installed, which may be caused by an incompatible *app_process*
+ * Cydia Substrate is not able to hook *Settings.Secure*, for which a boot class loader is needed
+ * *Build.SERIAL* cannot be restricted
+ * There will be limited support for this
+
+**Version 2.0.34 BETA**
+
+* Removed delay when opening application details
+* Setting on demand restriction to enabled for functions with a white list when on demand restricting a category
+* Made *network/getScanResults* dangerous
+ * Because *location/getScanResults* is dangerous too
+* Made *accounts/getTokenGoogle* and *accounts/getTokenWithNotification* dangerous
+* Made *accounts/getAuthToken* and *accounts/getAuthTokenByFeatures* dangerous
+* Made *identification//sys/block/.../cid* and *identification//sys/class/.../cid* dangerous
+* Made *internet/getAllByName*, *internet/getByAddress* and *internet/getByName* dangerous
+* Made all *shell* functions dangerous
+
+All above functions throw an exception when restricted.
+Although the exception is part of the standard API, a lot of applications are not prepared to handle an exception.
+
+**This version will reset the main template to the default** (if not done by an earlier version)
+
+**Version 2.0.33 BETA**
+
+* Fixed applying template / dangerous functions
+* Fixed default on demand restricting / dangerous functions
+
+**Version 2.0.32 BETA**
+
+* Fetch user applications only by default
+* Added option to allow/disallow all contacts
+* Fixed dangerous restrictions being asked after update
+* Enable on demand restricting on application update ([reason](http://www.xda-developers.com/android/play-store-permissions-change-opens-door-to-rogue-apps/))
+
+**Version 2.0.31 TEST**
+
+* Update notifications only if XPrivacy is enabled in Xposed
+* Directly open Xposed pages, thanks @[liudongmiao](https://github.com/liudongmiao)
+* Added multiple template definitions
+ * The first template will always be applied to new applications
+* Added allow contacts by group
+* Fixed caching of not set settings
+* Updated simplified Chinese translation
+* Updated traditional Chinese translation
+
+**Version 2.0.30 TEST**
+
+* Fixed template settings caching
+* Fixed applying template
+* Fixed function exceptions defaults
+* Fixed displaying functions which cannot be restricted
+* Updated Italian translation
+
+**Version 2.0.29 TEST**
+
+* Showing restrictions which cannot be applied as disabled, thanks @[liudongmiao](https://github.com/liudongmiao)
+* Made filter and sort dialog scrollable, thanks @[liudongmiao](https://github.com/liudongmiao)
+* Made toggle restrictions dialog scrollable
+* Removed setting *Restrict dangerous functions* ([issue](/../../issues/1704))
+ * The issue contains additional information
+* Added half check boxes to template ([issue](/../../issues/1706))
+* Always use settings cache for UI (performance)
+* Always use restriction cache for UI (performance)
+* Fixed user defined dangerous functions (some names did overlap)
+ * Unfortunately you need to define them again
+* Prevent restriction of identification category for Android
+* Updated simplified Chinese translation
+
+**Version 2.0.28 BETA**
+
+* Added *WRITE_CALENDAR* permissions to calendar restriction
+* Updated XposedBridge to version 54 (Xposed version 2.6 is required now)
+* Show all usage data ([issue](/../../issues/1695))
+* Show toggle on demand restricting on/off always ([issue](/../../issues/1697))
+* Added option to merge template with existing restrictions ([issue](/../../issues/1700))
+* Fixed selected accounts when imported from another device ([issue](/../../issues/1699))
+ * Some people need to allow accounts again, unfortunately there is no way to fix this
+* Updated Dutch translation
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Norwegian translation
+
+**Version 2.0.27 STABLE**
+
+* Showing icon if there is white/black list for a function ([issue](/../../issues/1654))
+ * Thanks @[an0n981](https://github.com/an0n981) for the icons
+* Updated Russian translation
+* Updated Slovak translation
+
+**Version 2.0.26 BETA**
+
+* Acquiring partial wakelock for batch operations ([issue](/../../issues/1683))
+* Added option/interface to clear service cache ([issue](/../../issues/1678))
+ * Run this as root to clear the service cache:
+
+```
+am startservice -a biz.bokhorst.xprivacy.action.FLUSH
+```
+
+* Not storing salt into database anymore for increased privacy ([issue](/../../issues/1661))
+* Updated Dutch translation
+* Updated German translation
+* Updated Italian translation
+* Updated traditional Chinese translation
+
+**Version 2.0.25 STABLE**
+
+* Fixed applying template for functions with whitelists (reported on XDA)
+* Port number wildcard for IP-address and domain names ([issue](/../../issues/1649))
+
+**Version 2.0.24 BETA**
+
+* Reverted "Not storing salt into database anymore for increased privacy" ([issue](/../../issues/1661)) ([issue](/../../issues/1664))
+
+**Version 2.0.23 BETA**
+
+* Fixed displaying contacts without display name ([issue](/../../issues/1660))
+* Fixed on demand restricting for dangerous methods with whitelists ([issue](/../../issues/1653))
+* Not storing salt into database anymore for increased privacy ([issue](/../../issues/1661))
+* Easier pro license file import ([issue](/../../issues/1658))
+
+**Version 2.0.22 STABLE**
+
+* Fixed incompatibility with Xposed 2.6 beta 1 ([issue](/../../issues/1659))
+
+**Version 2.0.21 STABLE**
+
+* Fixed incompatibility with Xposed 2.6 beta 1 ([issue](/../../issues/1659))
+
+**Version 2.0.20 STABLE**
+
+* Updated French translation
+* Updated Slovak translation
+* Fixed hooking abstract methods ([issue](/../../issues/1647))
+
+**Version 2.0.19 STABLE**
+
+* Fixed handling of *removeActivityUpdates*
+
+**Version 2.0.18 STABLE**
+
+* Updated Italian translation
+
+**Version 2.0.17 BETA**
+
+* Fixed restricting activity recognition (category location)
+* Display disabled standard dangerous functions with a faint background color
+
+**Version 2.0.16 BETA**
+
+* Fixed applying template in relation to default restrictions ([issue](/../../issues/1566))
+* Prefix export file name with date ([issue](/../../issues/1625))
+* Display user defined dangerous functions orangish ([issue](/../../issues/1626))
+ * Long press on a function in the template to define dangerous functions
+
+**Version 2.0.15 BETA**
+
+* On demand restricting control in application list ([issue](/../../issues/1615))
+* Updated embedded documentation, thanks @[Phylon](https://github.com/Phylon)
+* Updated Polish translation
+* Updated Slovak translation
+
+**Version 2.0.14 STABLE**
+
+* Fixed restricting profile (owner name, etc) ([issue](/../../issues/1610))
+
+**Version 2.0.13 TEST**
+
+* Fixed error message for Android versions below JellyBean MR1 (SDK 17) ([issue](/../../issues/1602))
+* Reverted "Fixed multi threaded database access", since it leads to freezes on some ROMs
+* Added restriction for [activity recognition](http://developer.android.com/training/location/activity-recognition.html) ([issue](/../../issues/1608))
+* Updated Arabic translation
+
+**Version 2.0.12 STABLE**
+
+* Updated embedded documentation
+* Fixed some minor issues reported by support info
+* Updated traditional Chinese translation
+
+**Version 2.0.11 BETA**
+
+* Fixed application specific settings ([issue](/../../issues/1596))
+* Always notify *Restricted by ...* (disabled client side caching)
+* Hide application notifications settings when global setting disabled
+
+**Version 2.0.10 TEST**
+
+* Fixed multi threaded database access (for some ROMs this happens sometimes)
+* Added option to globally enable/disable update notifications
+* *getDeviceId* and *getSubscriberId* will automatically restrict *getPhoneType*, thanks @[Phylon](https://github.com/Phylon) for the suggestion
+
+**Version 2.0.9 BETA**
+
+* Fixed photos for allowed contacts ([issue](/../../issues/1588))
+* Fixed *GMS.removeGeofences*
+* Fixed randomization for secondary users
+* Updated Lithuanian translation
+* Updated Slovenian translation
+
+**Version 2.0.8 BETA**
+
+* Using secure links for documentation, thanks @[Phylon](https://github.com/Phylon)
+* Made reboot messages translatable ([issue](/../../issues/1580))
+* Limited usage data to 12 hours or 700 lines
+* Made applying template consistent with visible template
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Italian translation
+* Updated Russian translation
+* Updated Vietnamese translation
+
+**Version 2.0.7 STABLE**
+
+* Fixed restrictions *getAuthToken*, *getAuthTokenByFeatures* and *hasFeatures*
+* Increase usage data period to 12 hours
+
+**Version 2.0.6 BETA**
+
+* Fixed global settings for secondary users
+* Import performance optimization
+
+**Version 2.0.5 TEST**
+
+* Fixed wrong uid for restricted profiles ([issue](/../../issues/1561))
+* Fixed on demand dialog colors by hard coding theme ([issue](/../../issues/1562))
+* Fixed synchronization on demand setting and check box (details view)
+* Separated global settings for each Android user ([issue](/../../issues/1563))
+ * Only the primary user can clear all data
+ * Only the primary user can define dangerous functions
+ * Only the primary user can enable/disable debug logging
+* Display usage data for last three hours
+ * The primary user can see all usage data
+ * Secondary users can only see their own usage data
+* Some performance optimizations
+* Updated Slovenian translation
+
+**Version 2.0.4 STABLE**
+
+* Fixed migration of template settings
+* Fixed migration of allowed accounts, applications and contacts ([issue](/../../issues/1555))
+* Fixed permission updates ([issue](/../../issues/1554))
+
+**Version 2.0.3 STABLE**
+
+* Fixed restrictions not always showing correct after on demand restricting ([issue](/../../issues/1549))
+* Fixed invalid *restart required* when toggling restrictions of a category
+* Fixed and improved batch operation layout ([issue](/../../issues/1539))
+* Fixed randomize on access combined with randomize on boot ([issue](/../../issues/1547))
+* Fixed displaying on demand restricting in application list
+* Better matching of *sh* and *su* ([issue](/../../issues/1551))
+
+**Version 2.0.2 STABLE**
+
+* Clear restrictions before calling pro enabler
+
+**Version 2.0.1 STABLE**
+
+* Reverted restriction for time zone ([issue](/../../issues/1524))
+* Updated Norwegian translation
+
+**Version 2.0 STABLE**
+
+Main changes since stable version 1.11:
+
+* Replaced XML settings files by a privacy service and a privacy database
+ * Increased speed, stability and security
+ * Allows for new features formerly not possible, like:
+* Added on demand restricting
+ * XPrivacy will ask to allow/deny on actual function usage
+* Added white and black listing for files, IP addresses, domain names, commands, libraries and URLs
+ * White and black listing on demand are available to anyone
+ * White/black list management from the user interface requires a [Pro license](http://www.xprivacy.eu/)
+ * Clearing restrictions will clear white/black lists too
+* Added parameters to usage data (option) (only [Pro license](http://www.xprivacy.eu/))
+* Added a service to migrate settings, upgrade and randomize
+* Added sorting and extended filtering
+* Added multiple select and batch operations to set, reset, import and export restrictions
+* Added a series of new restrictions and improved existing restrictions
+* Added template for functions
+* Added user defined dangerous functions
+* Added in application documentation for all functions
+* Added switch to disable restrictions for each application
+ * Allows for disabling restrictions, without taking away the ability to edit restrictions
+* Support for multiple users (if your device supports this)
+* XPrivacy became [one of the Open Source Rookies of 2013](http://www.blackducksoftware.com/news/releases/black-duck-announces-open-source-rookies-year-winners)
+* The number of [crowd sourced restrictions](https://crowd.xprivacy.eu/) is more than 5 million now
+* Donations are [accepted in Bitcoins](http://www.xprivacy.eu/#bitcoin) now too
+
+Other changes:
+
+* Added restriction for time zone ([issue](/../../issues/1524))
+* White listing does not change default of check boxes ([issue](/../../issues/1531))
+* Layout fix ([issue](/../../issues/1537))
+* Updated Dutch translation
+* Updated German translation
+* Updated French translation
+* Updated Polish translation
+* Updated Slovak translation
+* Updated Slovenian translation
+
+**Version 1.99.72 BETA**
+
+* Added version number to reboot view
+* Update application state after changing on demand restricting ([issue](/../../issues/1515))
+* Made all IPC restrictions dangerous again
+* Fixed some translations, thanks @[Phylon](https://github.com/Phylon) ([pull request](https://github.com/M66B/XPrivacy/pull/1446))
+* Updated Russian translation
+* Updated Slovenian translation
+
+**Version 1.99.71 BETA**
+
+* Added partial asked state ([issue](/../../issues/1513))
+* Removed reboot action from restart required notification ([issue](/../../issues/1485))
+* Positional text parameters (English only), thanks @[Phylon](https://github.com/Phylon) ([pull request](https://github.com/M66B/XPrivacy/pull/1514))
+* Updated Dutch translation
+* Updated Slovenian translation
+
+**Version 1.99.70 BETA**
+
+* Fixed exporting of template ([issue](/../../issues/1506))
+* Fixed exporting of on demand restricting function settings ([issue](/../../issues/1508))
+* Added *uid* to *restricted by* dialog (requested on XDA)
+* On demand restricting for dangerous functions with a whitelist always enabled
+* Updated Italian translation
+
+**Version 1.99.69 BETA**
+
+* Small layout fix (reported on XDA)
+* Moved user defined dangerous functions to template
+* Whitelist subnets ([issue](/../../issues/1501))
+* Added *uid* to on demand restricting dialog
+
+**Version 1.99.68 BETA**
+
+* Fixed erasing whitelists when changing restrictions ([issue](/../../issues/1499))
+* Fixed updating application state when new application with shared user ID is installed ([issue](/../../issues/1498))
+* Updated German translation
+* Updated French translation
+
+**Version 1.99.67 TEST**
+
+* Option to apply template partially (categories) or fully (categories and functions)
+* Reverted *Removed user defined dangerous functions*
+
+**Version 1.99.66 TEST**
+
+* Fixed function templates in relation to dangerous functions
+* Added spinners for changing restrictions
+* Clearing restrictions does no longer disable on demand restricting application *setting*
+* Delete restrictions and apply template of applications details view will use batch operation
+* Removed user defined dangerous functions
+
+**Version 1.99.65 TEST**
+
+* Fixed on demand restricting filtering negate ([issue](/../../issues/1495))
+* Run all restriction changes in the background
+ * To prevent application not responding messages
+ * There can be a delay before a restriction change is visible
+* Updated Lithuanian translation
+
+**Version 1.99.64 TEST**
+
+* Fixed all minor bugs reported through the support info
+* Fixed some minor bugs and improved some layouts
+* Added template for functions
+* Added info icon to toggle restrictions
+
+**Version 1.99.63 BETA**
+
+* Fixed interaction of on demand restricting dialog with status bar and keyboard
+ * Some dialogs when starting an application from a notification are still unresponsive
+* Template restrictions and on demand restricting separately, thanks @[jpeg729](https://github.com/jpeg729)
+* Enabled proguard again for a smaller file size (in preparation of the stable release)
+* Updated Italian translation
+
+**Version 1.99.62 BETA**
+
+* Fixed making exceptions for dangerous functions in some situations
+* Batch enable/disable on demand restricting requires enabling *Restrict dangerous functions*
+* Batch enable/disable on demand restricting will disable/enable update notifications too
+* Show usage data for selected category only
+* Updated Android support library to latest version
+* Updated simplified Chinese translation
+
+**Version 1.99.61 BETA**
+
+* Fixed all minor bugs reported through the support info
+ * The loop back address will be restricted too, see [this commit](https://github.com/M66B/XPrivacy/commit/4aad9cecc15cc040a0b9c4104dabb65332e4f63e)
+* Fixed negative GSF ID ([issue](/../../issues/1473))
+* Select visible applications for fetch ([issue](/../../issues/1477))
+* Add package name to export file name when exporting one application ([issue](/../../issues/1465))
+* Lower case entry for Android ID (reported on XDA)
+* Updated German translation
+* Updated Polish translation
+
+**Version 1.99.60 BETA**
+
+* Added option to batch disable on demand restricting ([issue](/../../issues/1467))
+* Clearer whitelist entry delete icon
+* Log database upgrade failures ([issue](/../../issues/1466))
+* Use not focusable on demand dialog ([issue](/../../issues/1464))
+* Updated Dutch translation
+* Updated French translation
+* Updated Lithuanian translation
+* Updated Russian translation
+
+**Version 1.99.59 BETA**
+
+* Fixed all minor bugs reported through the support info
+* More compatible database upgrade procedure (again)
+* Added option to batch enable on demand restricting (requested on XDA)
+* Added option to export from application details view (requested on XDA)
+
+**Version 1.99.58 TEST**
+
+* Fixed all minor bugs reported through the support info
+* Running [VACUUM](http://www.sqlite.org/lang_vacuum.html) on databases on boot
+* Setting [asynchronous mode](http://www.sqlite.org/pragma.html#pragma_synchronous) for usage data database
+
+**Version 1.99.57 TEST**
+
+* More compatible database upgrade procedure (again)
+* Better support info
+
+**Version 1.99.56 TEST**
+
+* More compatible database upgrade procedure
+
+**Version 1.99.55 TEST**
+
+* Fixed submitting restrictions ([issue](/../../issues/1452))
+* System server will create database folder ([issue](/../../issues/1437))
+* Updated Russian translation
+* Updated Slovak translation
+
+**Version 1.99.54 TEST**
+
+* Toggle restriction will allow to choose between, clear, restrict and template ([issue](/../../issues/1319))
+* Option to select if existing restrictions should be deleted on import or fetch ([issue](/../../issues/1119))
+* Move database to /data/system/xprivacy ([issue](/../../issues/1437))
+* Submit functions with a white/blacklist as having an exception ([issue](/../../issues/1438))
+* On demand timeout will result in using defined restriction (was deny once)
+* Import/export one application will not import/export global settings
+* Option to enable/disable usage data parameters (**default disabled**)
+* Removed phone properties restrictions (these are covered by function restrictions too)
+* Fixed on demand restricting asking again ([issue](/../../issues/1447))
+* Separated file name and /proc whitelists
+ * This means you have to whitelist /proc entries again
+* Updated Dutch translation
+* Updated German translation
+* Updated Italian translation
+* Updated Polish translation
+* Updated traditional Chinese translation
+
+**Version 1.99.53 TEST**
+
+* Fixed hooking base constructors ([issue](/../../issues/1431))
+* Fixed some restrictions applying only after reboot (reported on XDA)
+* Restrict all *view* actions, show parameters and whitelisting ([issue](/../../issues/1419))
+ * You might see a few more messages *Restricted by XPrivacy* because of this
+* Improved usage data layout, option to copy parameters ([issue](/../../issues/1424))
+* Improved on demand restricting dialog layout
+* Moved usage data to separate database to improve performance (locking)
+* Removed *internet/socket*, since it passes *internet/connect* anyway
+* Show data parameter for intents
+* Export only application settings when exporting one application
+
+**Version 1.99.52 BETA**
+
+* Optimized *storage/open* restriction
+* Added whitelisting for folders
+* Added whitelisting for subdomains ([issue](/../../issues/1418))
+* Limited parameters to 128 characters to prevent performance problems
+* Display host name instead of IP address where possible ([issue](/../../issues/1415))
+* Fixed crash when both on demand restricting and notify restricted ([issue](/../../issues/1417))
+
+**Version 1.99.51 TEST**
+
+* Fixed returning exceptions ([issue](/../../issues/1398))
+* Localized whitelist names ([issue](/../../issues/1375))
+* Sorted whitelist entries ([issue](/../../issues/1375))
+* Removed /proc exceptions, except */proc/self/cmdline*
+* Added /proc to files whitelist ([issue](/../../issues/1375))
+* *storage/open* will also check media storage
+* Clear restrictions will clear whitelists ([issue](/../../issues/1375))
+* Whitelist management requires a [Pro license](http://www.xprivacy.eu/)
+* Limit parameters to 250 characters (some applications use long Javascript for loadUrl)
+* Updated Dutch translation
+* Updated Lithuanian translation
+* Updated Russian translation
+
+**Version 1.99.50 TEST**
+
+* Fixed returning exceptions ([issue](/../../issues/1398))
+* Attempt to fix interaction between on demand dialog and status bar (reported on XDA)
+* Removed more dependencies on Xposed
+* Improved on demand restricting dialog layout
+* Show SDK version and XPrivacy version *from* in function information
+* Prevent on demand restricting after being powered down
+* Added white/black listing for IP addresses, shell commands, files and URLs, big thanks @[jpeg729](https://github.com/jpeg729) ([issue](/../../issues/1375))
+* Updated Russian translation
+
+**Version 1.99.49 TEST**
+
+* Fixed restriction caching (performance)
+* Fixed allowing contacts for contact aggregation
+* Fixed select/unselect all ([issue](/../../issues/1390))
+* Fixed some more repeated asking on demand, thanks @[jpeg729](https://github.com/jpeg729)
+* Fixed duplicate usage data entries (reported on XDA)
+* Fixed hooking for multi SIM devices ([issue](/../../issues/1366))
+* Improved tutorial/info background ([issue](/../../issues/1391))
+* Added template for on demand restricting, thanks @[jpeg729](https://github.com/jpeg729) ([issue](/../../issues/1376))
+* Reduced dependency on Xposed
+ * So we could *for example* more easily use [Cydia Substrate](http://www.cydiasubstrate.com/)
+* Updated German translation
+* Updated French translation
+* Updated Lithuanian translation
+
+**Version 1.99.48 TEST**
+
+* Fixed a null pointer exception for some ROMs (support info)
+* Fixed not all parameters appearing in the usage data
+* Fixed asking again when allowing/denying once
+* Fixed touch sensitivity on demand restricting check box (reported on XDA)
+* Fixed on demand getting set for functions, when category on demand not set
+* Attempt to fix hooking of native functions ([issue](/../../issues/1366))
+* White list */proc/meminfo* ([issue](/../../issues/1320))
+* Added option to fake [GSM CID/LAC](http://en.wikipedia.org/wiki/Cell_ID) ([issue](/../../issues/1289))
+ * Note: only [cell locations](http://developer.android.com/reference/android/telephony/CellLocation.html) can be faked, not [cell info](http://developer.android.com/reference/android/telephony/CellInfo.html)
+* *Apply to entire category* and *Once for ... seconds* exclude each other ([issue](/../../issues/1381))
+* Notification *Restart required* will ask to reboot ([issue](/../../issues/1382))
+* New dangerous functions will not be unrestricted on update if you have *restrict dangerous functions* enabled
+ * If you want this, disable this setting before upgrading
+* Updated info icons, thanks @[Phylon](https://github.com/Phylon)
+* Updated Slovak translation
+
+**Version 1.99.47 BETA**
+
+* Fixed null pointer in storage/open
+* Fixed restricting GSF ID in some cases ([issue](/../../issues/1374))
+* Improved filter view layout ([issue](/../../issues/1335))
+
+**Version 1.99.46 TEST**
+
+* Fixed function name overlapping information icon
+* Fixed defaults for some on demand restricting settings
+* Clear all data will also clear local caches
+* Show parameters in usage data (only [Pro license](http://www.xprivacy.eu/))
+* Added restriction for deprecated *contacts/people* ([issue](/../../issues/1367))
+* Added restriction for storage/open file on common storage (sdcard or internal storage)
+* Added restriction for internet/socket
+* Compatible with Poweramp unlocker again ([issue](/../../issues/1340))
+* Updated Dutch translation
+* Updated Lithuanian translation
+* Updated Polish translation
+
+**Version 1.99.45 BETA**
+
+* Fixed contacts permissions (reported on XDA)
+* Made *internet/connect* dangerous ([issue](/../../issues/1354))
+* Only check for enabled (not frozen) incompatible applications ([issue](/../../issues/1358))
+* Show notification for restricted *getPrimaryClipDescription*, *hasPrimaryClip* and *hasText* (clipboard)
+* Allow/deny once with parameter will be asked always (time to allow/deny does not apply in this case)
+* Added check boxes to enable/disable on demand restricting asking in application details view, thanks @[jpeg729](https://github.com/jpeg729)
+* Hide name from licensed info ([issue](/../../issues/1347))
+* Added Malay translation
+
+**Version 1.99.44 TEST**
+
+* Fixed function restrictions not sticking
+* Fixed size of documentation popup ([issue](/../../issues/1341))
+* Added restriction for connecting to the internet (experimental)
+* Added restriction for *system/getPreferredActivities*
+* Added documentation for sensors, overlay, system and view, thanks @[jpeg729](https://github.com/jpeg729) ([issue](/../../issues/838))
+* Added documentation for network, NFC, notifications, phone and shell ([issue](/../../issues/838))
+* Updated Lithuanian translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+
+**Version 1.99.43 BETA**
+
+* Fixed cycling through restriction states, thanks @[jpeg729](https://github.com/jpeg729)
+* Fixed Gmail contact restricting ([issue](/../../issues/1336))
+* Added documentation for messages and storage ([issue](/../../issues/838))
+* Made *Browser/Downloads* dangerous
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Lithuanian translation
+
+**Version 1.99.42 BETA**
+
+* Fixed dark theme usage list ([issue](/../../issues/1331))
+* Even easier multiple select, thanks @[paour](https://github.com/paour) ([issue](/../../issues/1318))
+* Added documentation for identification, internet, ipc, location and media ([issue](/../../issues/838))
+* Show required permissions in information dialog
+
+**Version 1.99.41 BETA**
+
+* Fixed some UI elements not working ([issue](/../../issues/1321))
+* Added reboot reasons to reboot view
+* Easier multiple select ([issue](/../../issues/1318))
+
+**Version 1.99.40 BETA**
+
+* Rewritten URI restrictions for better compatibility
+* Simplified restricting / allowing contacts
+* Added restriction for browser downloads
+* Added documentation for accounts, browser, calendar, calling, clipboard, contacts, dictionary and email ([issue](/../../issues/838))
+* Added Kurdish translation
+* Updated traditional Chinese translation
+* Updated Norwegian translation
+* Updated Polish translation
+* Updated Ukrainian translation
+
+**Version 1.99.39 BETA**
+
+* Fixed allowing contacts in some situations ([issue](/../../issues/1155))
+* Fixed checkbox logic when *Restrict dangerous functions* was not set, thanks @[jpeg729](https://github.com/jpeg729)
+* Fixed keyboard interfering with on demand restricting dialog (reported on XDA)
+* Improved performance
+* Updated German translation
+
+**Version 1.99.38 TEST**
+
+* Fixed allowing contacts in some situations ([issue](/../../issues/1155))
+* Show URI for content providers
+* Added restriction for ICC provider (SIM contacts)
+* Added restriction for profile provider (contacts)
+* Added restriction for contacts provider (fallback)
+* Option to disable asking per function, thanks @[jpeg729](https://github.com/jpeg729)
+* Updated Arabic translation
+
+**Version 1.99.37 BETA**
+
+* Fixed all issues reported with the support info
+* Fixed layout of on demand restricting dialog for long functions/parameters
+* Increased on demand restricting timeout to 20 seconds ([issue](/../../issues/1293))
+* When registering, nicely ask for e-mail address
+* Better protection of IPCs
+* Updated German translation
+* Updated Lithuanian translation
+
+**Version 1.99.36 BETA**
+
+* Fixed filter count (adding on-demand filter)
+* XPrivacy will not start with LBE Security master installed ([issue](/../../issues/1231))
+* Respect *Restrict dangerous functions* setting when fetching restrictions
+
+**Version 1.99.35 BETA**
+
+* Fixed all issues reported with the support info
+* Fixed a locking bug for new installations, which resulted in a bootloop ([issue](/../../issues/1282))
+* Clear button for filters, thanks @[jpeg729](https://github.com/jpeg729) ([issue](/../../issues/1281))
+* Added filter for on-demand restricting, thanks @[jpeg729](https://github.com/jpeg729)
+* Smooth count down for on-demand restricting, thanks @[jpeg729](https://github.com/jpeg729)
+* Updated documentation, thanks @[Jimmy34742](https://github.com/Jimmy34742) and reviewers
+* Updated Dutch translation
+* Updated German translation
+* Updated Spanish translation
+
+**Version 1.99.34 BETA**
+
+* Fixed all issues reported with the support info
+* Fixed database locking problem
+* Attempt to fix usage data list
+* Improved layout of on demand restricting dialog
+* Added category and function name to *Restricted by XPrivacy* message
+* Updated Dutch translation
+* Updated Slovak translation
+* Updated Polish translation
+
+**Version 1.99.33-3 TEST**
+
+* Fixed all issues reported with the support info
+* Fixed caching of category restrictions for on demand restricting
+* Fixed a few corner cases in on demand restricting logic
+* Fixed on demand dialog not appearing ([issue](/../../issues/1261))
+* Set category to restricted on change for on demand restricting
+* Remember last choice for *Apply to entire category* and *Once for ... seconds*
+* Display on demand restriction status in application list
+* Clearing restrictions from the application list will enable on demand restricting
+* Increased usage data list to maximum 500 entries (was 250 entries)
+* If a corrupt database is detected:
+ * Backup old database
+ * Create new, empty database
+ * This is default Android behavior
+* Automatically handle *removeOnAccountsUpdatedListener*, *removeUpdates* and *GMS.removeLocationUpdates*
+* Toggle will apply template and take into account dangerous functions ([issue](/../../issues/1266))
+* Notify usage for *Calling* and *Clipboard* category and *action.VIEW* (like the *Media* category)
+* Display account name when retrieving accounts through Google Play services
+* Display URL for *View/loadUrl*
+* Fixed cursor blinking with an ugly hack
+* New icon for filter, thanks @[danielmmmm](https://github.com/danielmmmm)
+* Updated Dutch translation
+* Updated Lithuanian translation
+
+**Version 1.99.32 TEST**
+
+* Fixed respecting dangerous while applying template ([issue](/../../issues/1251))
+* Fixed fetching function exceptions
+* Moved filter to action bar, thanks @[jpeg729](https://github.com/jpeg729) ([issue](/../../issues/1240))
+* Support info for user interface errors
+* Rewritten on demand restricting logic ([issue](/../../issues/1245)) ([issue](/../../issues/1247)) ([issue](/../../issues/1253))
+* Added progress bar for on demand restricting time out
+* Show shell command/library ([issue](/../../issues/1258))
+* Show account name/type ([issue](/../../issues/1258))
+* Show /proc/... ([issue](/../../issues/1258))
+* Limited usage data display to prevent crash
+* Updated traditional Chinese translation
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Polish translation
+
+**Version 1.99.31 TEST**
+
+* Fixed on demand asking for secondary users
+* Fixed on demand asking for same restriction again
+* Fixed restrictions undone when using on demand restricting in some situation
+* Disabling a restriction category will delete exceptions in application details view ([issue](https://github.com/M66B/XPrivacy/issues/1198))
+* No on demand restricting while device is locked ([issue](https://github.com/M66B/XPrivacy/issues/1243))
+* No on demand restricting while device is sleeping ([issue](https://github.com/M66B/XPrivacy/issues/1243))
+* Several speed optimizations for the user interface
+* Checking integrity of privacy database on boot and better error handling in privacy service
+
+**Version 1.99.30 TEST**
+
+* Fixed not restricting if not using on demand ([issue](https://github.com/M66B/XPrivacy/issues/1242))
+* Fixed multiple on demand dialogs ([issue](https://github.com/M66B/XPrivacy/issues/1243))
+* Broken on demand asking for same restriction
+
+**Version 1.99.29 TEST**
+
+* Fixed on demand choice not sticking
+* Fixed on demand asking for same restriction
+* Fixed on demand reboot problem ([issue](https://github.com/M66B/XPrivacy/issues/1238))
+* Added setting for height ([issue](https://github.com/M66B/XPrivacy/issues/1179))
+* Added restriction for *getGpsStatus* ([issue](https://github.com/M66B/XPrivacy/issues/1179))
+* Removed restriction *Srv.getConfiguredNetworks*, use [Pry-Fi](http://forum.xda-developers.com/showthread.php?t=2631512)
+
+**Version 1.99.28 TEST**
+
+* Attempt to fix reboot in relation to on demand ([issue](https://github.com/M66B/XPrivacy/issues/1238))
+* Upgrading *Srv.getConfiguredNetworks* (dangerous function)
+* Updated Lithuanian translation
+
+**Version 1.99.27 TEST**
+
+* Fixed some invalid *restart required* messages
+* Fixed restriction of functions without usage data
+* Added restriction for *Srv.getConfiguredNetworks*
+* Updated Dutch translation
+
+**Version 1.99.26 TEST**
+
+* Less restrictive database file permissions, always set on boot
+* Support for multi SIM IPC restrictions (Huawei and maybe others)
+* Added *act on category* check box to restricting on demand prompt, thanks @[jpeg729](https://github.com/jpeg729)
+* Added application icon to restricting on demand prompt
+* On demand restricting default enabled (there is a new main setting to disable it)
+* If LBE Security Master is enabled, only applications can be restricted ([issue](https://github.com/M66B/XPrivacy/issues/1231))
+* Fixed randomize on access not sticking for latitude and longitude
+* Updated German translation
+* Updated Slovak translation
+
+**Version 1.99.25 BETA**
+
+* Fixed handling for automated export, thanks @[jpeg729](https://github.com/jpeg729) ([issue](https://github.com/M66B/XPrivacy/issues/1211))
+ * See the [FAQ question 6](https://github.com/M66B/XPrivacy#FAQ6) for how to
+* Added function name to on demand restricting dialog
+* Moved database back to /data/xprivacy, see also the [FAQ question 6](https://github.com/M66B/XPrivacy#FAQ6)
+
+**Version 1.99.24 BETA**
+
+* Fixed accessing Google services ([issue](https://github.com/M66B/XPrivacy/issues/1206)) ([issue](https://github.com/M66B/XPrivacy/issues/1209))
+* Compatibility with LBE Security Master ([issue](https://github.com/M66B/XPrivacy/issues/1167))
+* Display message for *media* restrictions
+* Added *deny once* (this will be cached for 15 seconds)
+* Added restriction for *getAuthenticatorTypes* (accounts)
+* Added restrictions for *getCurrentSync*, *getCurrentSyncs* and *getSyncAdapterTypes* (accounts)
+* Added restriction for *onConfigurationChanged* ([issue](https://github.com/M66B/XPrivacy/issues/1201))
+* Restrict isolated processes (since JellyBean)
+* Disabled [largeHeap](http://developer.android.com/reference/android/R.attr.html#largeHeap) to conserve memory
+* Disabled [allowBackup](http://developer.android.com/reference/android/R.attr.html#allowBackup) for more privacy
+* Enable on demand restricting for new applications only ([issue](https://github.com/M66B/XPrivacy/issues/1208))
+* Updated Dutch translation
+* Updated Lithuanian translation
+
+**Version 1.99.23 BETA**
+
+* Prevent bootloops with not yet migrated restrictions
+* Fixed clearing restrictions / applying template for application groups ([issue](https://github.com/M66B/XPrivacy/issues/1202))
+* Added restriction for MCC/MNC found in configuration ([issue](https://github.com/M66B/XPrivacy/issues/1201))
+* Updated Lithuanian translation
+
+**Version 1.99.22 BETA**
+
+* Fixed crash on saving main settings
+* Fixed support info popup for method not found
+
+**Version 1.99.21 BETA**
+
+* Restricting on demand
+* Fixed erased settings staying cached
+* Faster sorting, thanks @[jpeg729](https://github.com/jpeg729)
+* Change state to gray when unrestricting ([issue](https://github.com/M66B/XPrivacy/issues/1190))
+* Updated Dutch translation
+* Updated French translation
+* Updated Lithuanian translation
+* Updated Slovak translation
+
+**Version 1.99.20 BETA**
+
+* Fixed restricting accounts in some situations
+* Added application sort, thanks @[jpeg729](https://github.com/jpeg729)
+* Saving tab state (category, filters), thanks @[jpeg729](https://github.com/jpeg729) ([issue](https://github.com/M66B/XPrivacy/issues/1035))
+* Restrict access to Gmail information ([issue](https://github.com/M66B/XPrivacy/issues/1080))
+* Added XPrivacy version and device name to export file name ([issue](https://github.com/M66B/XPrivacy/issues/1116))
+* Using zero altitude for fake locations ([issue](https://github.com/M66B/XPrivacy/issues/1179))
+* Updated Dutch translation
+* Updated French translation
+* Updated Lithuanian translation
+* Updated Polish translation
+
+**Version 1.99.19 BETA**
+
+* Fixed always randomizing application settings when global randomization enabled
+
+**Version 1.99.18 BETA**
+
+* Further simplify application specific settings: no check mark or empty value means use global value
+* Migration will no longer migrate empty values; existing empty values will be erased from the database
+* Display message *XPrivacy is incompatible with ...* (currently LBE Security Master only)
+
+**Version 1.99.17 BETA**
+
+* Fixed opening wrong application view from notification ([issue](https://github.com/M66B/XPrivacy/issues/717))
+* Run upgrade after migrate ([issue](https://github.com/M66B/XPrivacy/issues/1165))
+* Close application details view on removing the application
+* Added checks for LBE Security Master and for accessibility of the database
+
+**Version 1.99.16 BETA**
+
+* Fixed empty settings values ([issue](https://github.com/M66B/XPrivacy/issues/1164))
+* Added restriction for *NetworkInfo.getExtraInfo* ([issue](https://github.com/M66B/XPrivacy/issues/1175))
+* Updated Czech translation
+* Updated German translation
+
+**Version 1.99.15 BETA**
+
+* Fixed global application setting not sticking ([issue](https://github.com/M66B/XPrivacy/issues/1164))
+* Always allow randomization ([issue](https://github.com/M66B/XPrivacy/issues/1159))
+* Display application switch state as enabled/disabled in main list
+* Updated Chinese translation
+
+**Version 1.99.14 TEST**
+
+* Fixed randomize on boot setting being restored ([issue](https://github.com/M66B/XPrivacy/issues/1164))
+* Fixed crash on start in some situations ([issue](https://github.com/M66B/XPrivacy/issues/1168))
+* Fixed usage data vertical alignment
+* Updated Slovak translation
+
+**Version 1.99.13 TEST**
+
+* Updated German translation
+* Moved database back again due to permission problems ([issue](https://github.com/M66B/XPrivacy/issues/1160))
+
+**Version 1.99.12 TEST**
+
+* Show restrictions of system applications, even when disabled
+* Moved database back due to permission problems ([issue](https://github.com/M66B/XPrivacy/issues/1129))
+
+**Version 1.99.11 TEST**
+
+* Added a switch to enable/disable all application restrictions
+* Improved device registration procedure
+* Prevent pollution of usage data ([issue](https://github.com/M66B/XPrivacy/issues/1140))
+* Improved randomization of subscriber ID ([issue](https://github.com/M66B/XPrivacy/issues/1158))
+
+**Version 1.99.10 TEST**
+
+* Fixed usage data display for restriction categories
+* Fixed a bug in randomizing the GSF ID
+* Rewrote migration process, should solve continues migration and should be faster
+* Added setting to enable restriction of system components (Android), default **disabled**
+* Added setting to disable usage data collection, default enabled
+* Marked IPC functions as not dangerous
+* Updated Dutch translation
+* Updated Lithuanian translation
+* Updated Norwegian translation
+* Updated traditional Chinese translation
+
+**Version 1.99.9 TEST**
+
+* Fixed crash on rotation change
+* Added checks for all hooks
+
+**Version 1.99.8 TEST**
+
+* Batch set restrictions on fetch (performance)
+* Added service restriction cache again (performance)
+* Updated German translation
+* Updated Lithuanian translation
+
+**Version 1.99.7 TEST**
+
+* Attempt to fix update service dying
+* Fixed toggling category restrictions from application list
+* Fixed toggling function restrictions from application details view
+* Changed memory class for service settings cache to heap size >= 32MB
+
+**Version 1.99.6 TEST**
+
+* Fixed export progress, thanks @[jpeg729](https://github.com/jpeg729)
+* Fixed some settings not migrated correctly ([issue](https://github.com/M66B/XPrivacy/issues/1127))
+* Fixed allowing applications for *queryIntentActivities* ([issue](https://github.com/M66B/XPrivacy/issues/1147))
+* Corrected application name and version in update notifications, thanks @[jpeg729](https://github.com/jpeg729) ([issue](https://github.com/M66B/XPrivacy/issues/1112))
+* Added update service with progress notifications for migration, randomization and upgrade
+* Allowed secondary users to set restrictions
+* Kill application is not experimental anymore and can kill applications only
+* Moved privacy database to application data folder ([issue](https://github.com/M66B/XPrivacy/issues/1129))
+* Added dialog for export, import, submit, fetch and toggle, big thanks @[jpeg729](https://github.com/jpeg729)
+* Added caching before restriction database (will only be used if the heap size >= 64 MiB)
+* Show half check box for restricted categories with only dangerous functions
+* Updated Arabic translation
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Slovak translation
+
+**Version 1.99.5 EXPERIMENTAL**
+
+* Fixed deleting all usage data
+* Replaced Play service library by local interface definition (smaller application size)
+* Removed obsolete restriction GMS.connect
+* Guarantee migrate, upgrade, randomize threads keep running
+
+**Version 1.99.4 EXPERIMENTAL**
+
+* Fixed usage data in application list
+* Fixed setting *IPC*, *Storage* and *View* restrictions
+
+**Version 1.99.3 EXPERIMENTAL**
+
+* Fixed security exception reported with support info
+* Fixed restart required notification
+* Option to register device on custom e-mail address
+* Restored restrictions *getNetwork...* and *getSim...* ([issue](https://github.com/M66B/XPrivacy/issues/1125))
+* User defined dangerous functions, long press a function name to toggle ([issue](https://github.com/M66B/XPrivacy/issues/869))
+
+**Version 1.99.2 EXPERIMENTAL**
+
+* Removed restriction *getPackagesForUid*
+* Migrate on boot completed event and display notification migration completed
+* Attempt to fix security exception (based on received support info)
+* Moved meta.xml to Meta class
+* Cache permissions for better performance
+* Optimized usage data getting (should solve most of the performance issue)
+* Half check box for restricted IPC category (special case)
+* Use inbox style notifications ([issue](https://github.com/M66B/XPrivacy/issues/1112))
+
+**Version 1.99.1 EXPERIMENTAL**
+
+* **Redesigned restriction/settings engine/database**
+ * Existing settings will be migrated automatically
+ * No more missing and always up-to-date usage data
+ * Less processor and memory usage
+ * New features possible
+* Better method for hooking the bluetooth manager
+* Better method for hooking the package manager
+* Added restriction for *getPackagesForUid*, *getPackagesHoldingPermissions* (JellyBean MR2) and *queryIntentContentProviders* (Kitkat)
+* Lower case randomized Android ID
+* Simple registration procedure for submitting restrictions
+* Moved IPC to separate category
+* Replaced *getNetwork...* and *getSim...* by system property restrictions
+* Upgrade settings in separate thread
+* Updated Arabic translation
+* Updated Chinese translation
+* Updated Lithuanian translation
+* Updated Slovak translation
+* Updated Vietnamese translation
+
+**Version 1.11.13 EXPERIMENTAL**
+
+* Experimental: restriction for direct inter-process communication (System/IPC)
+* Experimental: new, faster way of getting restrictions/settings
+
+**Version 1.11.12 BETA**
+
+* Use secure connection for [submitting and fetching restrictions](https://crowd.xprivacy.eu/)
+* Skip upgrade for dangerous functions
+* Restored original location and telephony restrictions
+
+**Version 1.11.11 TEST**
+
+* Fixed restricting locations for some Android versions ([issue](https://github.com/M66B/XPrivacy/issues/1102))
+* Fixed restricting incoming phone number for some Android versions
+* Fixed removing location and phone state listener
+* Fixed location client always restricting locations
+* Fixed fake value for SIM (ICC) operator name
+
+**Version 1.11.10 TEST**
+
+* Fixed fake values for get network operator/sim info
+* Fixed phone state listener cast errors
+* Updated Lithuanian translation
+
+**Version 1.11.9 TEST**
+
+* Fixed usage data with a dot in the name
+* Added an Easter egg (don't ask)
+* Added cell location restrictions within the phone process
+* Added phone/network type restrictions within the phone process
+* Added phone property restrictions (static phone info)
+* Added phone registry restrictions (phone state listener)
+* Added phone sub info restrictions (volatile phone info)
+* Write warnings and errors to a new private log file
+* Suppressing com.google.android.gms.* method errors
+* Increase retry count for reading settings files
+* Updated Tagalog translation
+
+Replacing the location and phone restrictions is ready for testing now.
+
+**Version 1.11.8 BETA**
+
+* Fixed restricting locations acquired using Google Play services
+* Fixed maximum number count message for submit and increased maximum to ten
+* Fixed location listener casting ([issue](https://github.com/M66B/XPrivacy/issues/1094))
+* Fixed reading settings file in some situations ([issue](https://github.com/M66B/XPrivacy/issues/1094))
+* Fixed force close from update notification for removed application ([issue](https://github.com/M66B/XPrivacy/issues/51))
+* Added restriction for Motorola's contact provider *blur*, thanks @[liudongmiao](https://github.com/liudongmiao)
+* Updated minimum API version numbers, thanks @[liudongmiao](https://github.com/liudongmiao)
+* Updated XML utils to KitKat version
+* Restore application state color from imported settings ([issue](https://github.com/M66B/XPrivacy/issues/1065))
+* Added import from the application view ([issue](https://github.com/M66B/XPrivacy/issues/1096))
+* Enable Android usage data by default
+* Added restriction for [getDefaultAdapter](http://developer.android.com/reference/android/nfc/NfcAdapter.html#getDefaultAdapter\(android.content.Context\)), thanks @[liudongmiao](https://github.com/liudongmiao)
+* Disable XPrivacy view restrictions on XPrivacy view actions
+* Improved debug logging (read settings file, build application list)
+* Updated German translation
+* Updated Polish translation
+* Updated simplified Chinese translation
+* Updated Slovak translation
+
+[Open issues](https://github.com/M66B/XPrivacy/issues?state=open)
+
+**Version 1.11.7 TEST**
+
+* Sharper check marks, thanks @[jpeg729](https://github.com/jpeg729)
+* Select/clear all visible/invisible action, thanks @[jpeg729](https://github.com/jpeg729)
+* Toggle (clear/set) selected applications ([issue](https://github.com/M66B/XPrivacy/issues/1031))
+* Fetch/submit selected applications ([issue](https://github.com/M66B/XPrivacy/issues/1031))
+* Import selected applications ([issue](https://github.com/M66B/XPrivacy/issues/1031))
+* Better location restrictions
+* Updated simplified Chinese translation
+* Updated traditional Chinese translation
+* Updated French translation
+* Updated Lithuanian translation
+
+**Version 1.11.6 BETA**
+
+* Fixed disabling application settings when using global settings ([issue](https://github.com/M66B/XPrivacy/issues/1050))
+* Fixed display issues and scroll lag ([issue](https://github.com/M66B/XPrivacy/issues/1049)) ([issue](https://github.com/M66B/XPrivacy/issues/1059))
+* Fixed check marks not visible with some themes ([issue](https://github.com/M66B/XPrivacy/issues/1057))
+* Updated Chinese translation
+* Updated Dutch translation
+* Updated Slovak translation
+* Updated Vietnamese translation
+
+**Version 1.11.5 BETA**
+
+* Fixed batch fetching system applications ([issue](https://github.com/M66B/XPrivacy/issues/1048))
+* Added grayed usage data icon to help
+* Updated Chinese translation
+* Updated Tagalog translation
+
+**Version 1.11.4 BETA**
+
+* Fixed scroll lag on slower devices
+* Fixed displaying wrong information in scroll lists sometimes
+* Fixed settings not sticking in first three minutes ([issue](https://github.com/M66B/XPrivacy/issues/1042))
+* Updated Polish translation
+* Updated Spanish translation
+
+**Version 1.11.3 TEST**
+
+* Reverted "Prevent applications from bypassing Android APIs" ([issue](https://github.com/M66B/XPrivacy/issues/1039))
+
+**Version 1.11.2 TEST**
+
+* Fixed disarranged categories ([issue](https://github.com/M66B/XPrivacy/issues/1033))
+* Fixed race conditions in list views (resulting in strange glitches sometimes)
+* Fixed reloading when navigating up ([issue](https://github.com/M66B/XPrivacy/issues/1034))
+* Fixed multiple filters running simultaneously, thanks @[jpeg729](https://github.com/jpeg729) ([issue](https://github.com/M66B/XPrivacy/issues/1036))
+* Notify action for application settings ([issue](https://github.com/M66B/XPrivacy/issues/955))
+* Display grayed usage data icon for methods with no usage data ([issue](https://github.com/M66B/XPrivacy/issues/878))
+* Prevent applications from bypassing Android APIs by directly calling the binder
+
+**Version 1.11.1 TEST**
+
+* Fixed getting restrictions for multi-user environments ([issue](https://github.com/M66B/XPrivacy/issues/357))
+* Fixed restricting internet and storage for multi-user environments ([issue](https://github.com/M66B/XPrivacy/issues/357))
+* Fixed clearing existing restrictions on import, thanks @[jpeg729](https://github.com/jpeg729)
+* Experimental functions enabled by default
+* Sorted localized restriction categories, thanks @[jpeg729](https://github.com/jpeg729)
+* Themed tri-state check boxes, thanks @[jpeg729](https://github.com/jpeg729)
+* Added location restrictions for Google Play services ([issue](https://github.com/M66B/XPrivacy/issues/1011))
+* Added Tagalog translation
+* Updated Chinese translations
+* Updated German translation
+* Updated Vietnamese translation
+
+**Version 1.11 STABLE**
+
+* Fixed application notification setting not sticking ([issue](https://github.com/M66B/XPrivacy/issues/1006))
+* Sort applications respecting locale, thanks @[jpeg729](https://github.com/jpeg729)
+* Display if Pro version (only [Pro license](http://www.xprivacy.eu/)) ([issue](https://github.com/M66B/XPrivacy/issues/996))
+* Updated Hindi translation
+* Updated Slovak translation
+* Updated Slovenian translation
+* Updated Ukrainian translation
+
+**Version 1.10.51 BETA**
+
+* Fixed boot loop on some devices/ROMs ([issue](https://github.com/M66B/XPrivacy/issues/995))
+
+**Version 1.10.50 BETA**
+
+* Fixed missing version names
+* Fixed wrong package for application, thanks @[jpeg729](https://github.com/jpeg729)
+* Fixed getting settings for isolated processes
+* Submit if accounts, application, contacts are allowed ([issue](https://github.com/M66B/XPrivacy/issues/986))
+* Proguard to reduce the application size (saves about 200 KB of 650 KB)
+* Experimental: kill applications
+* Experimental: auto flush restriction/settings cache
+* Updated Arabic translation
+* Updated Chinese translation
+* Updated French translation
+* Updated Russian translation
+* Updated Slovak translation
+
+**Version 1.10.49 BETA**
+
+* Make application title scrollable
+
+**Version 1.10.48 BETA**
+
+* Fixed application package list scroll
+
+**Version 1.10.47 BETA**
+
+* Fixed application package list filling screen
+
+**Version 1.10.46 BETA**
+
+* Fixed GitHub links by forcing desktop mode
+* Updated Chinese translation
+
+**Version 1.10.45 BETA**
+
+* Fixed uncaught exception handler ([issue](https://github.com/M66B/XPrivacy/issues/951))
+* Fixed confidence settings (application details view)
+* Fixed always restart required for dangerous functions
+* Moved confidence setting to expert mode
+* Replaced wiki links by links to GitHub
+* Added menu to clear usage data
+* Added refresh menu to application list
+* Handle applications with shared components, also thanks @[jpeg729](https://github.com/jpeg729)
+* Updated Chinese translations
+* Updated Norwegian translation
+* Updated Polish translation
+* Updated Lithuanian translation
+
+**Version 1.10.44 BETA**
+
+* Better progress report while importing, thanks @[jpeg729](https://github.com/jpeg729)
+* Setting to set maximum confidence fetch interval
+* Changed connection time out from 45 to 20 seconds
+* Updated Chinese translations
+* Updated Hungarian translation
+* Updated Slovak translation
+
+**Version 1.10.43 BETA**
+
+* Fixed exporting legacy settings
+* Fixed exporting default template
+* Updated Dutch translation
+* Updated Russian translation
+* Updated Ukrainian translation
+
+**Version 1.10.42 BETA**
+
+* Corrected submit ready message
+* Better error messages for import, export and fetch
+* Workaround for Google file chooser new URI format (KitKat)
+* Made tutorial translatable
+* Updated Chinese translations
+* Updated Lithuanian translation
+* Updated Polish translation
+* Updated Russian translation
+* Updated Ukrainian translation
+* Updated Vietnamese translation
+
+**Version 1.10.41 BETA**
+
+* Delete old restrictions on new application install, thanks @[jpeg729](https://github.com/jpeg729)
+* Delete application specific settings on application uninstall ([issue](https://github.com/M66B/XPrivacy/issues/901))
+* Replaced notification by 'toast' for fetch restrictions
+* Added application state colors to legend
+* Ask if sure when fetching
+* Display *Template applied* for new applications in the notification
+* Changed application state colors, thanks @[danielmmmm](https://github.com/danielmmmm)
+* Updated Android Support Library package
+* Added tutorial ([issue](https://github.com/M66B/XPrivacy/issues/890))
+* Reverted "Updated Italian translation" (update for another language)
+* Added Ukrainian translation
+* Updated Chinese translation
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Norwegian translation
+* Updated Russian translation
+* Updated Vietnamese translation
+
+**Version 1.10.40 TEST**
+
+* Fixed exporting of legacy settings
+
+**Version 1.10.39 TEST**
+
+* Fixed fetching unknown functions
+* Fixed restrictions of isolated processes on KitKat
+* Fixed importing wrong application specific settings
+* Color for state ([issue](https://github.com/M66B/XPrivacy/issues/887))
+* Added context menu to icon in application details view, thanks @[jpeg729](https://github.com/jpeg729)
+* Disabled fast scroll of application list, since it is buggy on KitKat
+* Added new restriction category *Overlay*
+* Less resource intensive export/import (export file format has changed)
+* Small performance improvement
+* Updated Arabic translation
+* Updated Chinese translation
+* Updated French translation
+* Updated Italian translation
+* Updated Polish translation
+* Updated Vietnamese translation
+
+**Version 1.10.38 BETA**
+
+* Fixed toggling all restrictions
+* Fixed template only being partially applied, thanks @[jpeg729](https://github.com/jpeg729)
+* Fixed index out of range in web view hook
+* Updated Italian translation
+* Updated Lithuanian translation
+
+**Version 1.10.37 BETA**
+
+* Fixed setting dangerous restrictions ([issue](https://github.com/M66B/XPrivacy/issues/876))
+* Fixed web view usage data
+* Attempt to fix user agent restriction for KitKat ([issue](https://github.com/M66B/XPrivacy/issues/825))
+* Show relative usage time
+* Filter application details on data usage
+* Notify if application needs restart, thanks @[jpeg729](https://github.com/jpeg729)
+* Chain new uncaught exception handlers
+* Send usage data on service destroy
+* Updated German translation
+* Updated Polish translation
+
+**Version 1.10.36 TEST**
+
+* Better titles for dialogs
+* Fixed error message fetch restrictions
+* Fixed canceling fetch all restrictions
+* Better title for toggle all restrictions, thanks @[jpeg729](https://github.com/jpeg729)
+* Run toggle all restriction in a background task, thanks @[jpeg729](https://github.com/jpeg729)
+* Updated Lithuanian translation
+
+**Version 1.10.35 EXPERIMENTAL**
+
+* Attempt to fix user agent restriction for KitKat ([issue](https://github.com/M66B/XPrivacy/issues/825))
+* Attempt to fix clipboard restriction for some devices ([issue](https://github.com/M66B/XPrivacy/issues/857))
+* Dynamic hooking of service managers for better compatibility
+* Progress reports while filtering, thanks @[jpeg729](https://github.com/jpeg729)
+* Updated Irish translation
+* Updated Russian translation
+* Updated Slovak translation
+* Updated Spanish translation
+
+**Version 1.10.34 TEST**
+
+* Fixed missing usage data
+* Send usage data on application close or force close (FC)
+* Progress reports while export is loading, thanks @[jpeg729](https://github.com/jpeg729)
+* Require Xposed version 2.4
+
+**Version 1.10.33 BETA**
+
+* Fixed missing usage data, thanks @[jpeg729](https://github.com/jpeg729)
+* Updated Chinese translations
+* Updated Japanese translation
+
+**Version 1.10.31 BETA**
+
+* Fixed ongoing notification of fetch restrictions
+* Attempt to fix non-aligned check boxes
+* New check mark images, thanks @[Looki75](http://forum.xda-developers.com/member.php?u=2468642)
+* Updated German translation
+
+**Version 1.10.30 BETA**
+
+* Caching of application information for better response times
+* Restriction of draw over / on top ([issue](https://github.com/M66B/XPrivacy/issues/830))
+* Modified tri-state check box implementation ([issue](https://github.com/M66B/XPrivacy/issues/833))
+* Fixed cancel import file select ([issue](https://github.com/M66B/XPrivacy/issues/837))
+* Updated Arabic translation
+* Updated Dutch translation
+* Updated Polish translation
+* Updated Russian translation
+
+**Version 1.10.29 TEST**
+
+* Fixed Android KitKat message permissions
+* Do not disable Android/extra usage data when not in expert mode
+* Separate setting to enable restricting dangerous functions, thanks @[jpeg729](https://github.com/jpeg729)
+* Show exported file name while sharing, thanks @[jpeg729](https://github.com/jpeg729)
+* Progress indication for export, import and fetch, thanks @[jpeg729](https://github.com/jpeg729)
+* Selected tab (categories, filter) in theme color, thanks @[jpeg729](https://github.com/jpeg729)
+* Added tri-state check box to legend ([issue](https://github.com/M66B/XPrivacy/issues/827))
+* Another method to restrict the browser user agent ([issue](https://github.com/M66B/XPrivacy/issues/825))
+* Updated Lithuanian translation
+* Updated Norwegian translation
+* Updated Slovak translation
+
+**Version 1.10.27 TEST**
+
+* Faster startup
+* Modified tri-state check box implementation
+* Improved application icon image quality
+* Allow Android / extra usage data setting without expert mode
+
+**Version 1.10.26 TEST**
+
+* Increase category selector drop down size
+* Display click effect to prevent unintended restriction changes
+* Added half state check box to application details view
+* Updated Arabic translation
+* Updated Polish translation
+* Updated Vietnamese translations
+
+**Version 1.10.25 TEST**
+
+* Display third state for categories not fully restricted ([issue](https://github.com/M66B/XPrivacy/issues/815))
+* Automatically open and scroll to category in application view
+* Updated Chinese translations
+
+**Version 1.10.23 BETA**
+
+* Allow fetching restrictions for system applications per application
+* Do not restrict the [Pro enabler](https://play.google.com/store/apps/details?id=biz.bokhorst.xprivacy.pro) on new install ([issue](https://github.com/M66B/XPrivacy/issues/812))
+* Samsung multi window support ([issue](https://github.com/M66B/XPrivacy/issues/816))
+* Updated Chinese translation
+* Updated Finnish translation
+* Updated Lithuanian translation
+* Updated Polish translation
+
+**Version 1.10.21 BETA**
+
+* Marked all functions in the system category as dangerous, except one
+* Don't return an empty gids list to prevent exception
+* Require [Pro enabler](http://play.google.com/store/apps/details?id=biz.bokhorst.xprivacy.pro) version 1.12
+* Leave randomize button enabled when randomize on boot is enabled, thanks @[jpeg729](https://github.com/jpeg729)
+* Changed title of usage data view
+* Fixed activity history ([issue](https://github.com/M66B/XPrivacy/issues/804))
+
+**Version 1.10.20 TEST**
+
+* Fixed opening usage data from application details ([issue](https://github.com/M66B/XPrivacy/issues/793))
+* Fixed refreshing application list during fetch restrictions
+* Workaround for PAC boot problem ([issue](https://github.com/M66B/XPrivacy/issues/785))
+* Moved selecting accounts to allow to free version
+* Moved settings Android usage data / extra usage data to expert mode
+* Removed dangerous categories, only functions can be dangerous
+* Made *inet*, *media*, *sdcard* dangerous
+* Always highlight dangerous functions ([issue](https://github.com/M66B/XPrivacy/issues/796))
+* Made Xposed Installer a system application
+* Added application name to title of application details view
+* Removed version warning for KitKat
+* Redesigned filters/categories, thanks @[jpeg729](https://github.com/jpeg729)
+* Redesigned settings dialog, thanks @[jpeg729](https://github.com/jpeg729)
+* Small performance improvements
+* Added Finnish translation
+* Updated German translation
+* Updated Chinese translation
+* Updated Lithuanian translation
+
+**Version 1.10.18 TEST**
+
+* Fixed opening wrong settings from notification (again) ([issue](https://github.com/M66B/XPrivacy/issues/777))
+* Draw border around application icon in application details view
+* Option to enable extra usage data ([issue](https://github.com/M66B/XPrivacy/issues/783)) ([issue](https://github.com/M66B/XPrivacy/issues/785)) ([issue](https://github.com/M66B/XPrivacy/issues/786))
+* Updated Arabic translation
+* Updated Chinese translation
+* Updated Slovak translation
+
+**Version 1.10.16 TEST**
+
+* Compatibility with Android 4.4 KitKat ([issue](https://github.com/M66B/XPrivacy/issues/733))
+* Draw border around application icons in main list
+* Updated Arabic translation
+* Updated Chinese translation
+* Updated German translation
+
+**Version 1.10.15 TEST**
+
+* Fixed empty/crashing template
+* Restrict input device descriptor ([issue](https://github.com/M66B/XPrivacy/issues/768))
+
+**Version 1.10.14 TEST**
+
+* Filter on permissions filters functions too ([issue](https://github.com/M66B/XPrivacy/issues/695))
+* Select applications to allow ([issue](https://github.com/M66B/XPrivacy/issues/686))
+* Require [Pro license](http://www.xprivacy.eu/) to allow individual accounts, applications and contacts
+* Build for Android 4.4 KitKat ([issue](https://github.com/M66B/XPrivacy/issues/733))
+* Added expert mode (disables dangerous restrictions) ([issue](https://github.com/M66B/XPrivacy/issues/716)) ([issue](https://github.com/M66B/XPrivacy/issues/724))
+* Updated Chinese translation
+* Updated French translation
+* Updated Lithuanian translation
+* Updated Polish language
+
+**Version 1.10.13 BETA**
+
+* Fixed crash on empty latitude/longitude ([issue](https://github.com/M66B/XPrivacy/issues/755))
+* Option to negate filter on restrictions ([issue](https://github.com/M66B/XPrivacy/issues/754))
+* Option to make XPrivacy device administrator (to prevent unwanted uninstall)
+* Updated Chinese translation
+* Updated Lithuanian translation
+
+**Version 1.10.12 BETA**
+
+* Fixed *java.lang.NoClassDefFoundError: de.robv.android.xposed.XposedHelpers*
+
+**Version 1.10.11 BETA**
+
+* Fixed rare null pointer exception ([issue](https://github.com/M66B/XPrivacy/issues/739))
+* Fixed flickering with black theme
+* Fixed setting global and randomize on boot settings
+* Fixed width settings dialog
+* Require Android 4.0.3 (minimum for Xposed)
+* Added settings for Advertisement ID (including randomization) ([issue](https://github.com/M66B/XPrivacy/issues/738))
+* Added settings for SSID (including randomization) ([issue](https://github.com/M66B/XPrivacy/issues/652))
+* Added setting to disable update notification (per application) ([issue](https://github.com/M66B/XPrivacy/issues/635))
+* Not filtering on restricted will filter on not restricted ([issue](https://github.com/M66B/XPrivacy/issues/682))
+* Option to randomize subscriber ID (IMSI) ([issue](https://github.com/M66B/XPrivacy/issues/690))
+* Added application icons to usage view ([issue](https://github.com/M66B/XPrivacy/issues/693))
+* Added traditional Chinese translation
+* Updated German translation
+* Updated Vietnamese translation
+
+**Version 1.10.8 TEST**
+
+* Fixed import of filter settings
+* Fixed up navigation (again) ([issue](https://github.com/M66B/XPrivacy/issues/681))
+
+**Version 1.10.7 TEST**
+
+* Mark categories dangerous in template
+* Permanently cache XPrivacy version and Android usage settings
+* Do not display number of packages in progress dialog
+* Show location for license file in about dialog
+* Fixed up navigation (again) ([issue](https://github.com/M66B/XPrivacy/issues/681))
+* Auto import pro license file ([issue](https://github.com/M66B/XPrivacy/issues/703))
+* Allow application specific disable of globally set randomization ([issue](https://github.com/M66B/XPrivacy/issues/706))
+* Compatibility with *MultiSimTelephonyManager* ([issue](https://github.com/M66B/XPrivacy/issues/732))
+* Restrict */sys/block/.../cid* and */sys/class/.../cid* ([issue](https://github.com/M66B/XPrivacy/issues/734))
+* Restrict system properties ending with *cid* ([issue](https://github.com/M66B/XPrivacy/issues/734))
+* Updated Slovak translation
+
+**Version 1.10.5 TEST**
+
+* Restrict access to sensors ([issue](https://github.com/M66B/XPrivacy/issues/723))
+* Restrict Google advertising ID ([issue](https://github.com/M66B/XPrivacy/issues/731))
+* Send more usage data and faster
+
+**Version 1.10.4 BETA**
+
+* Added setting to enable Android usage data (default disabled) ([issue](https://github.com/M66B/XPrivacy/issues/694))
+* Randomize settings at boot in separate thread ([issue](https://github.com/M66B/XPrivacy/issues/700))
+* Added dangerous restrictions to template ([issue](https://github.com/M66B/XPrivacy/issues/716), [issue](https://github.com/M66B/XPrivacy/issues/724))
+* Fixed opening correct application settings from notification ([issue](https://github.com/M66B/XPrivacy/issues/717))
+* Do not use current application context ([issue](https://github.com/M66B/XPrivacy/issues/722))
+* Handle all exceptions while processing package events ([issue](https://github.com/M66B/XPrivacy/issues/722))
+* Require Xposed 2.3.1
+* Updated Arabic translation
+* Updated German translation
+* Updated Italian translation
+
+**Version 1.10 stable**
+
+* Updated Catalan translation
+
+**Version 1.9.27 release candidate**
+
+* Restore previous up navigation, but disable up navigation if started from notification
+
+**Version 1.9.26 release candidate**
+
+* Fixed up navigation (again) ([issue](https://github.com/M66B/XPrivacy/issues/681))
+* Updated German translation
+* Updated Norwegian translation
+* Updated Simplified Chinese translation
+* Updated Swedish translation
+
+**Version 1.9.25 release candidate**
+
+* Fixed always asking for clear when tapping notification
+* Remove notification when selecting clear
+
+**Version 1.9.24 release candidate**
+
+* Option to clear restrictions from notification (if your Android version supports this)
+
+**Version 1.9.23 release candidate**
+
+* Fixed up navigation ([issue](https://github.com/M66B/XPrivacy/issues/681))
+* Ask if sure when clearing restrictions / applying template
+
+**Version 1.9.22 release candidate**
+
+* Group some application menu items (thanks @[tonymanou](https://github.com/tonymanou))
+* Prevent user/system application filter both being applied
+* Auto fix folder permissions
+* Added icon for user application filter, thanks @[Looki75](http://forum.xda-developers.com/member.php?u=2468642)
+* Display file name after export ([issue](https://github.com/M66B/XPrivacy/issues/680))
+* Updated Hindi translation
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Slovenian translation
+
+**Version 1.9.21 release candidate**
+
+* Fixed hang on boot / start application
+* Fixed filter on restrictions
+
+**Version 1.9.20 release candidate**
+
+* Fixed templates no longer applied ([issue](https://github.com/M66B/XPrivacy/issues/669))
+* Fixed wrong restrictions sometimes applied (possibly fixing [issue](https://github.com/M66B/XPrivacy/issues/627))
+* Updated French translation
+* Updated Simplified Chinese translation
+
+**Version 1.9.19 release candidate**
+
+* Revert *Use privacy provider 60 seconds after system ready for all packages*
+
+**Version 1.9.18 release candidate**
+
+* Allow uncheck half checked restrictions
+* Display application name in settings
+* Use privacy provider 60 seconds after system ready for all packages
+* Fixed system application getting restricted on update
+* Sort application names for same uid
+* Updated Arabic translation
+* Updated German translation
+* Updated Spanish translation
+* Updated Vietnamese translation
+
+**Version 1.9.17 BETA!**
+
+* Fixed true randomization setting ([issue](https://github.com/M66B/XPrivacy/issues/658))
+* Add filter on user applications
+* Updated German translation
+
+**Version 1.9.16 BETA!**
+
+* Retry read settings/restrictions
+* Updated Arabic translation
+* Updated Hindi translation
+* Updated Lithuanian translation
+* Updated Slovenian translation
+
+**Version 1.9.15 BETA!**
+
+* Make filter settings persistent
+* Simplified filtering on application type
+* Fixed default for randomize on boot
+* Fixed settings text width
+* Updated Simplified Chinese translation
+
+**Version 1.9.14 BETA!**
+
+* Application specific settings
+* True randomization (both global/per app)
+* Added clear button to settings
+* Auto fix file permissions by privacy provider (not in Zygote anymore)
+* Removed popup for pro license (not enabler)
+* Updated Danish translation
+* Updated French translation
+* Updated German translation
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+* Updated Vietnamese translation
+
+**Version 1.9.13 BETA!**
+
+* Auto fix file permissions ([issue](https://github.com/M66B/XPrivacy/issues/627))
+* Display new/update in notification ([issue](https://github.com/M66B/XPrivacy/issues/631))
+* Attempt to fix opening wrong settings from notification
+* Support for randomize at boot per application (no GUI yet)
+* Fetch restrictions for all user applications ([issue](https://github.com/M66B/XPrivacy/issues/514))
+* Added Estonian translation
+* Updated Arabic translation
+* Updated German translation
+* Updated Slovenian translation
+
+**Version 1.9.12 BETA!**
+
+* Fixed title randomize button
+* Broadcast intent *biz.bokhorst.xprivacy.action.ACTIVE* after boot ([issue](https://github.com/M66B/XPrivacy/issues/606))
+* Compiled for Xposed version 2.2
+* Removed update menu (Xposed 2.2 will take care of updates)
+* This is the [last release on goo.im](http://forum.xda-developers.com/showpost.php?p=45276849&postcount=3233)
+* Updated Arabic translation
+* Updated Czech translation
+* Updated Slovak translation
+* Updated Vietnamese translation
+
+**Version 1.9.11 BETA!**
+
+* Fixed FC at boot by reverting intent at boot
+
+**Version 1.9.10 BETA!**
+
+* Split restriction cache timeout (15 seconds) and settings cache timeout (30 seconds)
+* Prepare application specific settings / true randomization ([issue](https://github.com/M66B/XPrivacy/issues/540))
+* Fixed not handled restriction ([issue](https://github.com/M66B/XPrivacy/issues/610))
+* Fixed check for file manager ([issue](https://github.com/M66B/XPrivacy/issues/327))
+* Send intent *biz.bokhorst.xprivacy.action.ACTIVE* after boot ([issue](https://github.com/M66B/XPrivacy/issues/606))
+* Setting for browser user agent ([issue](https://github.com/M66B/XPrivacy/issues/608))
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Russian translation
+* Updated Turkish translation
+
+**Version 1.9.9 BETA!**
+
+* Fixed half state for applications with only dangerous restricted ([pull request](https://github.com/M66B/XPrivacy/pull/593))
+* Fixed empty app list on first launch ([pull request](https://github.com/M66B/XPrivacy/pull/595))
+* Fixed "has permission" filter not updating application list ([pull request](https://github.com/M66B/XPrivacy/pull/601))
+* Added Farsi translation
+* Updated Japanese translation
+* Updated Polish translation
+* Updated Slovak translation
+* Updated Vietnamese translation
+
+**Version 1.9.8 BETA!**
+
+* Updated Arabic translation
+* Updated German translation
+* Updated Hindi translation
+* Updated Lithuanian translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+
+Contributed by [tonymanou](https://github.com/tonymanou): ([pull request](https://github.com/M66B/XPrivacy/pull/586))
+
+* Added three-states checkboxes in main activity
+* Improved accessibility: clickable images are focusable with DPAD in filter frame
+* Added the ability to show apps of user/system/both (new strings to translate)
+* Added infos about the user/system/both icons in help section
+* Various fixes (bad margins on large screens, 9-patches ...)
+
+**Version 1.9.7 BETA!**
+
+* Setting for IP address ([issue](https://github.com/M66B/XPrivacy/issues/554))
+* Restrict browser user agent string ([issue](https://github.com/M66B/XPrivacy/issues/537))
+* Restrict /system/build.prop ([issue](https://github.com/M66B/XPrivacy/issues/575))
+* Fixed margins on large screens
+* Fixed restricting NFC ([issue](https://github.com/M66B/XPrivacy/issues/530))
+* Fixed exporting dangerous function exceptions ([issue](https://github.com/M66B/XPrivacy/issues/283))
+* Setting to enabled/disable logging (default disabled)
+* Add seconds to export file name ([issue](https://github.com/M66B/XPrivacy/issues/327))
+* Added Hindi translation
+* Updated Arabic translation
+* Updated French translation
+* Updated German translation
+* Updated Japanese translation
+* Updated Portuguese translation
+* Updated Simplified Chinese translation
+* Updated Slovenian translation
+* Updated Vietnamese translation
+
+**Version 1.9.6 BETA!**
+
+* Updated Arabic translation
+* Updated Catalan translation
+* Updated Czech translation
+* Updated Dutch/Flemish translation
+* Updated French translation
+* Updated German translation
+* Updated Italian translation
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Norwegian translation
+* Updated Polish translation
+* Updated Portuguese translation
+* Updated Simplified Chinese translation
+* Updated Slovenian translation
+* Updated Swedish translation
+* Updated Turkish translation
+* Updated Vietnamese translation
+
+Contributed by [tonymanou](https://github.com/tonymanou): ([pull request](https://github.com/M66B/XPrivacy/pull/566))
+
+* Added a circular progress bar when the filter is processing
+* Added stats: apps filtered / total apps
+* Moved *category* filter outside of the collapsible filter frame
+* Changed clickable images for filters to checkboxes
+* Added new strings for the filters
+* New card-like UI theme
+
+Note for the translators: be careful! A too long string will be cut on small screens ...
+
+**Version 1.9.5 BETA!**
+
+* Updated Greek translation
+* Updated Japanese translation
+
+Contributed by [tonymanou](https://github.com/tonymanou): ([pull request](https://github.com/M66B/XPrivacy/pull/534))
+
+* Fixed filter frame's hidden state that was not restored when restoring the instance state
+* Moved the filters 'hide system app' and 'filter by permission' from the settings to the filter frame
+* Bigger expand icon for filter section (asked on XDA)
+* Fixed alignment of the items in the filter section
+* Improved the design of the filter frame (asked on XDA) : the corners are less round, the background is now a gradient
+
+**Version 1.9.4 BETA!**
+
+* Restrict [NfcAdapter](http://developer.android.com/reference/android/nfc/NfcAdapter.html) ([issue](https://github.com/M66B/XPrivacy/issues/530))
+* Changed [ALL](http://en.wikipedia.org/wiki/255.255.255.255) into [ANY](http://en.wikipedia.org/wiki/0.0.0.0)
+* Updated Slovenian translation
+
+Contributed by [tonymanou](https://github.com/tonymanou): ([pull request](https://github.com/M66B/XPrivacy/pull/532))
+
+* Moved help button to the action bar
+* Moved the edit help (pen icon) into the help pop-up (only for the main activity)
+* Added scrollbars to the main help pop-up in order to avoid cut content on small screens
+* Added a frame around the filter section
+* Ability to show/hide the filter section (hidden when the application starts)
+
+**Version 1.9.3 BETA!**
+
+* Submit MD5 of android ID for more privacy
+* Layout/menu/text improvements, thanks [tonymanou](https://github.com/tonymanou)
+* Do not clear existing restrictions when no restrictions fetched ([issue](https://github.com/M66B/XPrivacy/issues/523))
+* Updated English translation
+* Updated Simplified Chinese translation
+
+**Version 1.9.2 BETA!**
+
+* Fixed fetching function exceptions ([issue](https://github.com/M66B/XPrivacy/issues/515))
+* Updated Czech translation
+* Updated French translation
+* Updated German translation
+* Updated Polish translation
+* Updated Portuguese translation
+* Updated Slovak translation
+* Updated Turkish translation
+
+**Version 1.9.1 BETA!**
+
+* Fetch crowd sourced restrictions (experimental)
+* Suppress warning in location manager
+* Updated Turkish translation
+
+**Version 1.9 stable**
+
+* Delete usage data when removing application
+* Updated Catalan translation
+* Updated Lithuanian translation
+* Updated Japanese translation
+* Updated Russian translation
+
+**Version 1.8.13 RC!**
+
+* Delete restrictions when removing application
+* Fixed exception logging of TelephonyManager
+* Wait 500 ms between sending usage data
+* Updated Arabic translation
+* Updated French translation
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Polish translation
+* Updated Portuguese translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+* Updated Swedish translation
+
+**Version 1.8.12 RC!**
+
+* Menu to clear all application restrictions
+* Wait 60 seconds after system ready before sending Android usage data ([issue](https://github.com/M66B/XPrivacy/issues/483))
+* Updated German translation
+* Updated Lithuanian translation
+
+**Version 1.8.11 BETA!**
+
+* Link application info to submitted restrictions
+* Ask if sure when submitting restriction data
+* Notify on start of submit
+
+**Version 1.8.10 BETA!**
+
+* Submit application name
+
+**Version 1.8.9 BETA!**
+
+* Submit data to central server (only in application details view) **Experimental!**
+* Updated Arabic translation
+* Updated German translation
+* Updated Japanese Translation
+
+**Version 1.8.8 BETA!**
+
+* Fixed a bug in location restriction ([issue](https://github.com/M66B/XPrivacy/issues/477))
+* Updated French translation
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Simplified Chinese translation
+
+**Version 1.8.7 BETA!**
+
+* Enable Android usage data 60 seconds after boot
+* Filter usage data for the last 24 hours
+* Option to set network/SIM operator name
+
+**Version 1.8.6 BETA!**
+
+* Always lock fallback restriction loading
+* Limit help icon size
+
+**Version 1.8.5 BETA!**
+
+* Disabled usage data for Android (results in slow/hanging Android start)
+* Updated French translation
+* Updated Polish translation
+
+**Version 1.8.4 ALPHA!**
+
+* Restrict serial number for Android again
+* Usage data for Android
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Slovak translation
+
+**Version 1.8.3**
+
+* Restrict *getNetworkType* and *getPhoneType* ([issue](https://github.com/M66B/XPrivacy/issues/441))
+* Updated Norwegian translation
+* Updated Russian translation
+
+**Version 1.8.2 BETA!**
+
+* Redesigned restriction storage (less resource usage)
+* Updated Catalan translation
+
+**Version 1.8.1**
+
+* Workaround for crash while importing in some situations / some devices
+* Updated source code borrowed from Android
+* Updated Hungarian translation
+
+**Version 1.8**
+
+* Randomization of: ([issue](https://github.com/M66B/XPrivacy/issues/418))
+ * Android ID
+ * Country
+ * GSF ID
+ * IMEI
+ * Location
+ * Phone number
+ * Serial#
+* Added hints to settings ([issue](https://github.com/M66B/XPrivacy/issues/422))
+* Updated Japanese Translation
+* Updated Polish translation
+* Updated Portuguese translation
+* Updated Swedish translation
+* Updated Simplified Chinese translation
+* Updated Vietnamese translation
+
+**Version 1.7.30 BETA!**
+
+* Fixed Skype crash ([issue](https://github.com/M66B/XPrivacy/issues/424))
+* Fixed navigate from usage view crash ([issue](https://github.com/M66B/XPrivacy/issues/426))
+* Intent for import/export ([issue](https://github.com/M66B/XPrivacy/issues/421))
+* Randomization of: ([issue](https://github.com/M66B/XPrivacy/issues/418))
+ * MAC address
+* Updated French translation
+* Updated German translation
+* Updated Lithuanian translation
+
+**Version 1.7.29 BETA!**
+
+* Go to method restriction from application usage view ([issue](https://github.com/M66B/XPrivacy/issues/409))
+* Fixed usage data for contacts ([issue](https://github.com/M66B/XPrivacy/issues/395))
+* Fixed navigation to application in wiki ([issue](https://github.com/M66B/XPrivacy/issues/394))
+* Better detection of sh / su command
+* Updated Czech translation
+* Updated French translation
+* Updated German translation
+* Updated Japanese Translation
+* Updated Norwegian translation
+* Updated Russian translation
+* Updated Slovak translation
+* Updated Swedish translation
+
+**Version 1.7.28 BETA!**
+
+* Export/import selected accounts/contacts *for the same device only* ([pro version](http://www.xprivacy.eu/) only)
+* Fixed crash while filtering ([issue](https://github.com/M66B/XPrivacy/issues/402))
+* Updated Simplified Chinese translation
+* Updated Slovenian translation
+
+**Version 1.7.27 BETA!**
+
+* Pre-load application icons again
+* Moved restricting statusbar notifications and C2DM to new category *Notifications*
+* Updated German translation
+
+**Version 1.7.26 BETA!**
+
+* Performance improvements
+ * Caching of fallback restrictions
+ * Usage private executors with normal priority for async tasks
+* Faster application details view by fetching data asynchronous
+* Faster usage view by applying the holder pattern
+* Revert "Run privacy provider in separate process" ([issue](https://github.com/M66B/XPrivacy/issues/384))
+* Moved clipboard restrictions for *System* to new *Clipboard* category ([issue](https://github.com/M66B/XPrivacy/issues/359))
+* Add restrictions to the *System* category: ([issue](https://github.com/M66B/XPrivacy/issues/373), [issue](https://github.com/M66B/XPrivacy/issues/387))
+ * android.intent.action.PACKAGE_CHANGED
+ * android.intent.action.PACKAGE_DATA_CLEARED
+ * android.intent.action.PACKAGE_FIRST_LAUNCH
+ * android.intent.action.PACKAGE_FULLY_REMOVED
+ * android.intent.action.PACKAGE_NEEDS_VERIFICATION
+ * android.intent.action.PACKAGE_VERIFIED
+ * android.intent.action.EXTERNAL_APPLICATIONS_AVAILABLE
+ * android.intent.action.EXTERNAL_APPLICATIONS_UNAVAILABLE
+ * com.google.android.c2dm.intent.REGISTRATION
+ * com.google.android.c2dm.intent.RECEIVE
+* New setting for serial number ([issue](https://github.com/M66B/XPrivacy/issues/388))
+* Updated Lithuanian translation
+* Updated Vietnamese translation
+
+**Version 1.7.25 BETA!**
+
+* Faster application list by fetching data asynchronous and using [these tricks](http://developer.android.com/training/improving-layouts/smooth-scrolling.html)
+* Reduce memory usage by limiting number of parallel usage data updates
+* Updated Bulgarian translation
+* Updated Catalan translation
+* Updated Slovak translation
+
+**Version 1.7.24 BETA!**
+
+* Fixed for Android 4.3 ([issue](https://github.com/M66B/XPrivacy/issues/372))
+* Updated French translation
+* Updated Japanese Translation
+* Updated Simplified Chinese translation
+* Updated Slovenian translation
+
+**Version 1.7.23 BETA!**
+
+* Run privacy provider in separate process
+* Updated Catalan translation
+
+**Version 1.7.22 BETA!**
+
+* Always show categories with data usage (even without permssions)
+* Performance improvements (enum hooks)
+* Updated Slovak translation
+
+**Version 1.7.21 BETA!**
+
+* Show permissions for indivudual functions
+* Restructured method hooking
+* Updated Portuguese translation
+
+**Version 1.7.20 BETA!**
+
+* Restructured meta data (restriction/function definitions)
+
+**Version 1.7.19 BETA!**
+
+* Restrict [BluetoothDevice](http://developer.android.com/reference/android/bluetooth/BluetoothDevice.html)
+* Restrict [ClipboardManager](http://developer.android.com/reference/android/content/ClipboardManager.html) (category *System*) ([issue](https://github.com/M66B/XPrivacy/issues/359))
+* 4.3: restrict [NotificationListenerService](http://developer.android.com/reference/android/service/notification/NotificationListenerService.html) (category *System*) ([issue](https://github.com/M66B/XPrivacy/issues/360))
+* Better fake offline state location providers
+* More accurate usage data (in case of Android denying permission)
+* Performance and compatibility improvements
+
+**Version 1.7.18 BETA!**
+
+* Option to show usage data from the application details view
+* Fixed usage data ([issue](https://github.com/M66B/XPrivacy/issues/364), [issue](https://github.com/M66B/XPrivacy/issues/365))
+* Revert 1.7.16 change
+
+**Version 1.7.17 BETA!**
+
+* Contacts: also check for raw contacts ([issue](https://github.com/M66B/XPrivacy/issues/361))
+
+**Version 1.7.16 BETA!**
+
+* Run provider in separate process to solve heap problems
+
+**Version 1.7.15 BETA!**
+
+* Performance improvements (the usage data will be reset because of this, but **not** the restrictions)
+* Disable Android version warning for version 4.3
+* Updated telephony function permissions ([issue](http://forum.xda-developers.com/showpost.php?p=43949917&postcount=1820))
+* Updated German translation
+* Updated Polish translation
+* Updated Russian translation
+* Updated Vietnamese translation
+
+**Version 1.7.14 BETA!**
+
+* Request large heap
+
+**Version 1.7.13 BETA!**
+
+* Filter usage data by restricted or not (menu)
+* Display icon if restricted in usage data view
+* Menu to refresh usage data
+* Less memory usage during import ([issue](https://github.com/M66B/XPrivacy/issues/329))
+* Export file name with date / import with file chooser ([issue](https://github.com/M66B/XPrivacy/issues/327))
+* Share exported file ([issue](https://github.com/M66B/XPrivacy/issues/337))
+* Updated target SDK version to 18 (Android 4.3)
+* 4.3: restrict [getGroupIdLevel1](http://developer.android.com/reference/android/telephony/TelephonyManager.html)
+* 4.3: restrict [ACTION_RESPOND_VIA_MESSAGE](http://developer.android.com/reference/android/telephony/TelephonyManager.html)
+* 4.3: restrict [getAccountsByTypeForPackage](http://developer.android.com/reference/android/accounts/AccountManager.html)
+* Performance improvements
+* Updated German translation
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Simplified Chinese translation
+
+**Version 1.7.10 BETA!**
+
+* Open application settings when clicking in the data usage view
+
+**Version 1.7.9 BETA!**
+
+* Performance improvements
+* Consider no Android permissions required as having Android permissions for a category
+* Added data usage view for debugging purposes
+* Updated Norwegian translation
+* Updated Slovak translation
+
+**Version 1.7.8 BETA!**
+
+* Performance improvements
+* Filter on internet permission
+* Transparent spinner background ([issue](https://github.com/M66B/XPrivacy/issues/323))
+* Attempt to fix select contacts crash (reported on XDA)
+* Display uid's (as discussed on XDA)
+* Added Vietnamese translation
+* Updated Catalan translation
+* Updated French translation
+* Updated Lithuanian translation
+* Updated Polish translation
+* Updated Turkish translation
+
+**Version 1.7.7**
+
+* Restrict [Google auth](https://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html)
+* Fetch accounts/contacts in the background
+* Show orange triangles for function usage
+* Display icon for frozen (not enabled) applications, thanks @[Looki75](http://forum.xda-developers.com/member.php?u=2468642) for the icon
+* Added Lithuanian translation
+* Updated Catalan translation
+* Updated French translation
+* Updated German translation
+* Updated Japanese translation
+* Updated Russian translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+
+**Version 1.7.6**
+
+* Added disclaimer on first run
+* Removed duplicate *getByName* in category *internet*
+
+**Version 1.7.5**
+
+* Show disabled applications when not filtering system applications
+* Marked *getActiveNetworkInfo* and *getNetworkInfo* as dangerous
+* Updated Italian translation
+
+**Version 1.7.4**
+
+* Rebuild application list on package change ([issue](https://github.com/M66B/XPrivacy/issues/226))
+* Fake offline location providers (not enabled by default) ([issue](https://github.com/M66B/XPrivacy/issues/266))
+* Use existing settings when installing an application again ([issue](https://github.com/M66B/XPrivacy/issues/295))
+* Added Serbian translation
+* Updated Dutch translation
+* Updated French translation
+* Updated Portuguese translation
+* Updated Slovenian translation
+
+**Version 1.7.3**
+
+* Updated Spanish translation
+* Fixed YouTube crash ([issue](https://github.com/M66B/XPrivacy/issues/297))
+
+**Version 1.7.2**
+
+* Better hide internet connectivity, thanks @[sorgelig](https://github.com/sorgelig)
+* Fixed exporting dangerous functions ([issue](https://github.com/M66B/XPrivacy/issues/283))
+* Location through Google Play services restricted (function *connect*) ([issue](https://github.com/M66B/XPrivacy/issues/233))
+* Added Portuguese translation
+* Updated Czech translation
+* Updated Hebrew translation
+* Updated Greek translation
+* Updated Spanish translation
+
+**Version 1.7**
+
+* Restrict access to /proc (fixed again)
+* Restrict package change notifications ([issue](https://github.com/M66B/XPrivacy/issues/256))
+* Restrict *addGeofence* and *getLastLocation* (hidden function)
+* Restrict *getWifiApConfiguration* (hidden function), thanks @[vipere](https://github.com/vipere)
+* Restrict DNS in category *Internet*, thanks @[sorgelig](https://github.com/sorgelig) ([issue](https://github.com/M66B/XPrivacy/issues/132))
+* Marked *location/getScanResults* as dangerous
+* Higher resolution launcher icons ([source](http://openiconlibrary.sourceforge.net/gallery2/?./Icons/mimetypes/tango-style/application-pgp-signature.png))
+* Sort function names
+* Fixed leaking SSID on Android 4.2+
+* Fixed notification icons
+* Updated Catalan translation
+* Updated French translation
+* Updated German translation
+* Updated Japanese translation
+* Updated Simplified Chinese translation
+* Updated Slovenian translation
+* Updated Swedish translation
+
+**Version 1.6.6**
+
+* Reverted "Restrict access to /proc" (again)
+* Updated Arabic translation
+* Update French translation
+* Updated Polish translation
+
+**Version 1.6.5**
+
+* Explicitly allow /proc for Android
+
+**Version 1.6.4**
+
+* User interface improvements
+* Stability improvements
+* Restrict access to /proc (fixed)
+* Updated Catalan translation
+* Updated Simplified Chinese translation
+* Updated Slovak trabnslation
+
+**Version 1.6.3**
+
+* Fixed toggling all in main view
+* Add Catalan translation
+
+**Version 1.6.2**
+
+* Do not apply dangerous restriction categories to new applications / all
+* Add legend for colors in help
+* Fixed filtering after switching theme
+
+**Version 1.6.1**
+
+* Reverted "Restrict access to /proc"
+* Integrate clear icon into application name filter
+* Updated Polish translation
+
+**Version 1.6**
+
+* Restrict access to /proc ([issue](https://github.com/M66B/XPrivacy/issues/227))
+* New internet icon, thanks @[Looki75](http://forum.xda-developers.com/member.php?u=2468642)
+* Replace expert mode by color coding, thanks @[Looki75](http://forum.xda-developers.com/member.php?u=2468642) for the colors
+* Always allow drilling down in the application details view
+* Fixed registering property names
+* Added Swedish translation
+* Updated French translation
+* Updated Polish translation
+* Updated Simplified Chinese translation
+
+**Version 1.5**
+
+* User interface improvements
+* Performance improvements
+* More generic matching of system properties
+* Move categories internet, storage and system to expert mode ([issue](https://github.com/M66B/XPrivacy/issues/213), [issue](https://github.com/M66B/XPrivacy/issues/214))
+* Setting to filter system applications ([issue](https://github.com/M66B/XPrivacy/issues/215))
+* Option to set a template for new applications / application all menu ([issue](https://github.com/M66B/XPrivacy/issues/17))
+* New colored icon set, thanks @[Looki75](http://forum.xda-developers.com/member.php?u=2468642) ([issue](https://github.com/M66B/XPrivacy/issues/206))
+* Menu to select allowed contacts for an application ([issue](https://github.com/M66B/XPrivacy/issues/41))
+* Increase length of ICCID to 20 digits ([issue](https://github.com/M66B/XPrivacy/issues/222))
+* Filter categories by permission in the details view ([issue](https://github.com/M66B/XPrivacy/issues/225))
+* Fixed checking for E-mail permission
+* Fixed restricting recording in some situations ([issue](https://github.com/M66B/XPrivacy/issues/209))
+* Fixed navigation of application detailed view ([issue](https://github.com/M66B/XPrivacy/issues/205))
+* Fixed clearing export/import done notification
+* Added Danish translation
+* Updated Hungarian translation
+* Updated Japanese translation
+* Updated Norwegian translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+* Updated Turkish translation
+
+**Version 1.4**
+
+* Menu to select allowed accounts for an application
+* Enable navigate up again
+* Added info icon to application view
+* Menu to restrict all applications ([issue](https://github.com/M66B/XPrivacy/issues/172))
+* Restrict E-mail provider ([issue](https://github.com/M66B/XPrivacy/issues/199))
+* Restrict application provider (category system)
+* Fixed geocoding name feedback ([issue](https://github.com/M66B/XPrivacy/issues/198))
+* Updated Japanese translation
+* Updated Polish translation
+* Updated Simplified Chinese translation
+
+**Version 1.3**
+
+* Dark and light holo theme, thanks @[Looki75](http://forum.xda-developers.com/member.php?u=2468642) for the icons and reviewing
+* Filter on used AND name AND restricted
+* Icon to clear text filter
+* Display application version number in new/updated notification
+* Increased maximum length of MNC to three digits ([issue](https://github.com/M66B/XPrivacy/issues/178))
+* Some performance improvements
+* Fixed storage/internet restriction sometimes not working ([issue](https://github.com/M66B/XPrivacy/issues/174))
+* Fixed shell commands starting with *sh* and *su*, like *show*, thanks @[Tungstwenty](https://github.com/Tungstwenty)
+* Fixed stuck notification bar while exporting ([issue](https://github.com/M66B/XPrivacy/issues/170))
+* Updated Arabic translation
+* Updated simplified Chinese translation
+* Updated Czech translation
+* Updated French translation
+* Updated Hungarian translation
+* Updated Japanese translation
+* Updated Norwegian translation
+* Updated Polish translation
+* Updated Slovak translation
+* Updated Slovenian translation
+* Updated Turkish translation
+
+**Version 1.2**
+
+* Setting for SIM serial# ([ICCID](http://en.wikipedia.org/wiki/ICCID#ICCID)) ([issue](https://github.com/M66B/XPrivacy/issues/167))
+* Fixed possible location listener leak, thanks @[Tungstwenty](https://github.com/Tungstwenty)
+* Fixed MAC address for network info
+* Fixed application list leak ([issue](https://github.com/M66B/XPrivacy/issues/157))
+
+**Version 1.1**
+
+* *All* view (disabled check box means *some* restrictions) ([issue](https://github.com/M66B/XPrivacy/issues/154))
+* Filter applications by permissions (default enabled)
+* Restrict activity manager (running/recent processes/services/tasks) ([issue](https://github.com/M66B/XPrivacy/issues/157))
+* Restrict app widget manager ([issue](https://github.com/M66B/XPrivacy/issues/157))
+* Add Wi-Fi scan result to location category (Google Maps)
+* Setting for subscriber ID ([IMSI](http://en.wikipedia.org/wiki/International_mobile_subscriber_identity)) ([issue](https://github.com/M66B/XPrivacy/issues/166))
+* Filter disabled applications ([issue](https://github.com/M66B/XPrivacy/issues/165))
+* Fixed switching filtering
+* Fixed empty default settings (empty MCC, MNC, country, etc)
+* Fixed navigate up (ICS)
+* Added Hungarian translation
+* Updated Polish translation
+* Updated simplified Chinese translation
+* Updated Slovak translation
+
+**Version 1.0**
+
+* Display geocoded address
+* Setting for GSF ID, thanks @[vipere](https://github.com/vipere) ([issue](https://github.com/M66B/XPrivacy/issues/149))
+* Settings for [MCC](https://en.wikipedia.org/wiki/Mobile_country_code), [MNC](https://en.wikipedia.org/wiki/Mobile_Network_Code) and country ([ISO 3166-1](http://en.wikipedia.org/wiki/ISO_3166-1))
+* Delete existing settings before import
+* Fixed switching between filtering selected/used
+* Added Italian translation
+* Updated Polish translation
+* Updated Slovenian translation
+
+**Version 0.43**
+
+* Split media/sdcard storage restriction (expert only) ([issue](https://github.com/M66B/XPrivacy/issues/125))
+* Move shell restriction out of expert mode, load/Library by default not restricted
+* Move XPrivacy files to the folder .xprivacy ([pro version](http://www.xprivacy.eu/) only) ([issue](https://github.com/M66B/XPrivacy/issues/27))
+* Fake disconnected state for internet restriction ([issue](https://github.com/M66B/XPrivacy/issues/132))
+* Fake unmounted state for storage restriction (external storage only)
+* Fake Google services framework ID, not restricted by default, thanks @[vipere](https://github.com/vipere) ([issue](https://github.com/M66B/XPrivacy/issues/134))
+* Progress bar while loading applications, thanks @[Tungstwenty](https://github.com/Tungstwenty)
+* Removed boot restriction
+* Check package manager service, Wi-Fi info and activity thread for compatibility
+* [Geocoding](http://en.wikipedia.org/wiki/Geocoding) of location names ([issue](https://github.com/M66B/XPrivacy/issues/139))
+* Fixed internet/storage restriction for ICS ([issue](https://github.com/M66B/XPrivacy/issues/123))
+* Fixed keyboard popup, thanks @[vipere](https://github.com/vipere)
+* Fixed and improved fake phone data ([issue](https://github.com/M66B/XPrivacy/issues/116), see also [Restrictions](https://github.com/M66B/XPrivacy#restrictions))
+* Fixed fake SSID for Android 4.2+ ([issue](https://github.com/M66B/XPrivacy/issues/116))
+* Fixed rebuilding application list on orientation change
+* Added Czech translation
+* Added Norwegian translation
+* Added Turkish translation
+* Updated German translation
+* Updated Japanese translation
+* Updated Polish translation
+* Updated Russian translation
+* Updated Simplified Chinese translation
+* Updated Slovak translation
+* Updated Slovenian translation
+
+**Version 0.42**
+
+* Display notification when XPrivacy is not enabled also when Xposed installer is not present
+* Better ICS compatibility ([issue](https://github.com/M66B/XPrivacy/issues/108))
+* Fixed usage data for Build.SERIAL
+* Fixed crash on back ([issue](https://github.com/M66B/XPrivacy/issues/112))
+* Added Russian translation
+* Updated French translation
+* Updated German translation
+* Updated Japanese translation
+* Updated Polish translation
+* Updated Slovenian translation
+
+**Version 0.41**
+
+* Filter applications by used data ([issue](https://github.com/M66B/XPrivacy/issues/79))
+* Display notification when XPrivacy is not enabled in Xposed after boot ([issue](https://github.com/M66B/XPrivacy/issues/101))
+* **Experimental** support for Android ICS 4.0.x
+* Attempt to fix delay when applying boot restriction
+* Added Polish translation
+* Updated Slovak translation
+
+**Version 0.40**
+
+* Restrict NFC discovery
+* Restrict access to (internal) media storage
+
+**Version 0.39**
+
+* Restrict user dictionary ([issue](https://github.com/M66B/XPrivacy/issues/89))
+* Notification for updated applications (restrictions will be left alone) ([issue](https://github.com/M66B/XPrivacy/issues/96))
+
+**Version 0.38**
+
+* Added check box to filter restricted applications ([issue](https://github.com/M66B/XPrivacy/issues/79))
+* Options to set IMEI and phone number ([issue](https://github.com/M66B/XPrivacy/issues/39))
+* Use set MAC address for ro.boot.btmacaddr/ro.boot.wifimacaddr
+* Removed info icon from methods
+* Updated Slovak translation
+
+**Version 0.37**
+
+* Use fastscroll for application browser (thanks @[Tungstwenty](https://github.com/Tungstwenty))
+* Application option menu *Launch*, *Settings* and *Play Store* (thanks @[Tungstwenty](https://github.com/Tungstwenty))
+* Restrict LocationManager.sendExtraCommand (aGPS data)
+* Info links to [wiki](http://wiki.faircode.eu/index.php?title=XPrivacy) ([issue](https://github.com/M66B/XPrivacy/issues/65))
+* Fixed potential resource leak in phone state listener
+* Fixed incompatible location manager message ([issue](https://github.com/M66B/XPrivacy/issues/83))
+* Fixed incompatible telephony manager message ([issue](https://github.com/M66B/XPrivacy/issues/82))
+* Increased thread priority to fetch app list
+* Added Spanish translation
+* Updated Japanese translation
+* Updated Slovenian translation
+
+**Version 0.36**
+
+* Forgot to remove debug code
+
+**Version 0.35**
+
+* Speed up import ([pro version](http://www.xprivacy.eu/) only) ([issue](https://github.com/M66B/XPrivacy/issues/70))
+* Remove pro menu when pro version activated
+* Send support information for detected incompatibilities ([issue](https://github.com/M66B/XPrivacy/issues/82), [issue](https://github.com/M66B/XPrivacy/issues/83))
+* Fixed potential account data leak ([issue](https://github.com/M66B/XPrivacy/issues/75))
+* Fixed potential resource leak in location listener
+* Updated German translation
+* Updated simplified Chinese translation
+
+**Version 0.34**
+
+* Show edit icon in category browser
+
+**Version 0.33**
+
+* Option to switch between light/dark theme
+
+**Version 0.32**
+
+* Move *Shell* category to expert mode
+* Export/import function restrictions ([pro version](http://www.xprivacy.eu/) only)
+* Ongoing notification while exporting/importing
+* Added link to restrictions in help
+* Prevent application details reached from notification to show up in recent
+* Added Japanese translation
+
+**Version 0.31**
+
+* Show storage folder in about
+* Support for XPrivacy Pro from Google play
+* Fixed Skype crash ([issue](https://github.com/M66B/XPrivacy/issues/50))
+
+**Version 0.30**
+
+* Option to set MAC address
+* Workaround Skype crash ([issue](https://github.com/M66B/XPrivacy/issues/50))
+* Fixed notification for uninstalled apps ([issue](https://github.com/M66B/XPrivacy/issues/51))
+* Attemp to fix initial lag ([issue](https://github.com/M66B/XPrivacy/issues/59))
+* Added Romanian translation
+
+**Version 0.29**
+
+* Fixed initial display of restrictions
+
+**Version 0.28**
+
+* Fixed wrong usage data in app list
+
+**Version 0.27**
+
+* Register more usage data (orange triangle)
+* Display time of last usage (application restriction details)
+* Highlight system applications (in expert mode)
+* New expander symbol
+* Menu *All* in application details to toggle all check boxes
+* Action bar navigate up ([issue](https://github.com/M66B/XPrivacy/issues/12))
+* Refresh application list when toggling expert mode
+* Basic application search/filter ([issue](https://github.com/M66B/XPrivacy/issues/13))
+* Added French translation
+* Added Slovak translation
+* Added simplified Chinese translation
+* Updated Greek translation
+
+**Version 0.26**
+
+* Restrict process builder (shell, superuser) ([issue](https://github.com/M66B/XPrivacy/issues/44))
+
+**Version 0.25**
+
+* Fixed network usage data
+* Fixed text wrapping application info
+* Fixed to strict network restrictions (network state available now)
+* Fixed to strict system restrictions (start activity available now)
+* Fixed multiple installation notifications ([issue](https://github.com/M66B/XPrivacy/issues/42))
+* Restrict bluetooth MAC / devices
+* More compatibility checks
+* Granular restrictions in expert mode only
+* Hide indicator when no functions in restriction group
+* Start application from application details icon
+* Restrict shell commands, including superuser
+* Restrict loading libraries (category shell)
+
+**Version 0.24**
+
+* Display application version
+* More granular restrictions
+* Restrict system properties:
+ * ro.gsm.imei
+ * net.hostname
+ * ro.boot.serialno
+ * ro.boot.wifimacaddr
+ * ro.boot.btmacaddr
+ * Let me know if there more should be restricted
+* Fixed location battery drain ([issue](https://github.com/M66B/XPrivacy/issues/38))
+
+**Version 0.23**
+
+* Location range check
+* Other location input method
+* Simplified user interface
+* Added Hebrew translation
+
+**Version 0.22**
+
+* Renamed category *Actions* to *Calling* again
+* Moved opening links to new category *View*
+* Export/import settings, like expert, location (export/import features [pro version](http://www.xprivacy.eu/) only)
+
+**Version 0.21**
+
+* Settings for latitude/longitude (Christmas Island is at latitude -10.5, longitude 105.667)
+* Undo existing restrictions for apps when importing restrictions (only for apps with exported settings)
+
+**Version 0.20**
+
+* Consider XPrivacy as system app (for expert mode)
+* Fixed category browser ([issue](https://github.com/M66B/XPrivacy/issues/30), [fix](https://github.com/M66B/XPrivacy/pull/28))
+* Notify when new application installed ([feature request](https://github.com/M66B/XPrivacy/issues/10))
+* Notify when new system application is installed in expert mode (default allow)
+
+**Version 0.19**
+
+* More environment checks when starting
+* More privacy (fallback procedure when low memory)
+
+**Version 0.18**
+
+* Basic check for updates (manually)
+* Link to [pro version](http://www.xprivacy.eu/)
+* Renamed category *Calling* to *Actions* and moved opening browsers links into this category
+
+**Version 0.17**
+
+* User interface improvements
+* Display system apps in expert mode only
+* Restrict opening links ([issue](https://github.com/M66B/XPrivacy/issues/15))
+* Restrict serial number (system/build properties)
+* Export/import ([issue](https://github.com/M66B/XPrivacy/issues/18)) ([pro version](http://www.xprivacy.eu/) only)
+
+**Version 0.16**
+
+* Removed XPrivacy from *Manage apps*
+* Added application list to XPrivacy
+
+**Version 0.15**
+
+* Restrict Android (expert mode)
+* Restrict Google Service Framework (see also [limitations](https://github.com/M66B/XPrivacy#limitations))
+* Restrict Wi-Fi BSSID, IP and SSID
+* Restrict network info
+* No default deny for updated apps
+
+**Version 0.14**
+
+* Restrict calling (untested)
+* Restrict sending SMS
+* Restrict sending MMS (untested)
+* Fixed setting restrictions in the app list
+
+**Version 0.13**
+
+* Internet restriction (revoke permission)
+* Remove restrictions/audit trail when uninstalling an app
+* Custom write permission for privacy provider
+* Restriction caching (Play store installed app browse should be fast again)
+
+**Version 0.12**
+
+* Android version check
+* Check if XPrivacy is enabled
+* Async app list fetch
+* Several user interface improvements
+* Expert mode: prevent app start
+* Added Dutch/Flemish translation
+* Added Bulgarian translation, thanks [borislavba](https://github.com/borislavba)
+* Added German translation, thanks [NosferatuAlucard](https://github.com/NosferatuAlucard)
+* Added Greek translation, thanks [mikeNG](https://github.com/mikeNG)
+* Added Slovenian translation, thanks [kv1dr](https://github.com/kv1dr)
diff --git a/src/XPrivacy-master/XPrivacy-master/CHANGELOG.md b/src/XPrivacy-master/XPrivacy-master/CHANGELOG.md
new file mode 100644
index 0000000..87935fb
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/CHANGELOG.md
@@ -0,0 +1,693 @@
+Changelog
+=========
+
+**Release types**
+
+* UNSUPPORTED: only install if you know how to fix things
+* EXPERIMENTAL: only install if you know how to fix things
+* TEST: new or updated features with a higher risk for bugs
+* BETA: new or updated features with a lower risk for bugs
+* STABLE: all known bugs are fixed; low risk for bugs
+
+**Downloads**
+
+* [Xposed module repository](http://repo.xposed.info/module/biz.bokhorst.xprivacy) (stable versions)
+* [GitHub releases](https://github.com/M66B/XPrivacy/releases) (test and beta versions)
+
+**Important**
+
+* **Please send the support info if XPrivacy asks for it**
+
+**Next release**
+
+* Updated Russian translation
+
+[Open issues](https://github.com/M66B/XPrivacy/issues?state=open)
+
+**Version 3.6.19 STABLE**
+
+* Fixed IPC restrictions for Lollipop (compatibility mode only)
+
+**Version 3.6.18 STABLE**
+
+* Fixed location restrictions in AOSP mode on Android Lollipop ([issue](/../../issues/2219))
+
+**Version 3.6.17 STABLE**
+
+* Fixed bootloop in some cases for Android versions before Lollipop ([issue](/../../issues/2209))
+
+**Version 3.6.16 BETA**
+
+* Fixed crash on clear cache (flush) on Lollipop
+* Fixed translation of isolated process uids (debug info)
+* Reading property *xprivacy.options=ignoreselinux* from */system/build.prop* to ignore SELinux
+ * Settings this property enables reading of these files again, but might result in a bootloop for some:
+ * */data/system/xprivacy/disabled*
+ * */data/system/xprivacy/aosp*
+ * This file can be created/deleted by toggling the main setting *AOSP mode*
+
+**Version 3.6.15 BETA**
+
+* Fixed privacy service not running with older Xposed releases ([issue](/../../issues/2206))
+
+**Version 3.6.14 BETA**
+
+* Fixed on demand restricting for some custom ROMs (OPPO)
+* Fixed (telephony) restrictions for Android versions before Lollipop ([issue](/../../issues/2202))
+* Running XPrivacy in compatibility mode on Android 5.x, except for stock ROMs ([issue](/../../issues/2201))
+
+**Version 3.6.13 BETA**
+
+* Fixed *getDeviceId* (IMEI) restriction for Android 5.0.x ([issue](/../../issues/2200))
+* Added an second folder for importing the pro license
+
+**Version 3.6.12 BETA**
+
+* Fixed Android 5.x *getDeviceId* (IMEI) restriction ([issue](/../../issues/2198))
+* Added Android 5.x multi-SIM restriction support
+
+**Version 3.6.11 TEST**
+
+* Fixed Android 5.x restrictions ([issue](/../../issues/2195))
+
+**Version 3.6.10 TEST**
+
+* Android 5.x compatibility
+
+Big thanks to [dk-zero-cool](https://github.com/dk-zero-cool) !
+
+**Version 3.6.9 STABLE**
+
+**This release does not fix anything for Android 5.x**
+
+**Please read the [release announcement](http://forum.xda-developers.com/showpost.php?p=60176107&postcount=14481)**
+
+* Fixed all problems reported through the debug info
+* Fixed restrictions *getToken* and *getTokenWithNotification* ([issue](/../../issues/2169))
+* Fixed restriction *AdvertisingId* ([issue](/../../issues/2166))
+* Added restriction *GMS5.getCurrentPlace*
+* Updated Norwegian translation
+
+**Version 3.6.8 UNSUPPORTED**
+
+* Running in compatibility mode on Lollipop
+* Updated to SDK 22 (Android 5.1)
+
+**Version 3.6.7 UNSUPPORTED**
+
+* Fixed need for editing kernel image by using an SELinux loophole
+* Fixed bootloop caused by accessing */data/data* in SELinux restrictive mode
+
+**Version 3.6.6 UNSUPPORTED**
+
+* Android 5.x (Lollipop) support
+* Reverted "Manage white/black lists from usage data" ([issue](/../../issues/2093))
+* Added menu *Manage whitelists* to usage data view for a single application ([issue](/../../issues/2093))
+* Updated Czech translation
+
+**Version 3.6.5 BETA**
+
+* Use application whitelist for *getPackagesForUid* and *Srv_getPackagesForUid* ([issue](/../../issues/2116))
+* Manage white/black lists from usage data ([issue](/../../issues/2093))
+ * Long pressing the uid will toggle the whitelist entry and show the whitelist manager
+
+**Version 3.6.2 STABLE**
+
+* Block *ACTION_NEW_OUTGOING_CALL* and *ACTION_PHONE_STATE_CHANGED* instead of faking phone number ([issue](/../../issues/2132))
+* Renamed restriction *View.WebView* into *View.initUserAgentString*
+* Added restriction *View.postUrl*
+* Changed restriction *View.loadUrl* to restrict loading URLs instead of restriction the user agent string ([issue](/../../issues/2123))
+ * Existing *loadUrl* restrictions will be reset and set to ask
+
+**Version 3.6.1 STABLE**
+
+* Fixed location restriction in AOSP mode ([issue](/../../issues/2129))
+
+**Version 3.6 STABLE**
+
+* Stable re-release of version 3.5.11
+
+**Version 3.5.11 BETA**
+
+* Prevent opening wrong application details ([issue](/../../issues/2109))
+* Fixed restriction *USB.getSerialNumber*
+* Added restriction *Cast.getDeviceId* and *Cast.getIpAddress* ([issue](/../../issues/2108))
+
+**Version 3.5.10 BETA**
+
+* Fixed disabling location updates in compatibility mode ([issue](/../../issues/2105))
+* Removed Cydia Substrate library
+* Updated Hindi translation
+* Updated Slovak translation
+
+**Version 3.5.9 BETA**
+
+* Prevent accidental application icon/name clicks ([issue](/../../issues/2095))
+* Scale application icons ([issue](/../../issues/2095))
+
+**Version 3.5.8 BETA**
+
+* Disabled application icon caching ([issue](/../../issues/2094))
+* Removed Cydia Substrate support ([issue](/../../issues/2087))
+
+**Version 3.5.7 BETA**
+
+* Fixed allowing applications
+* Updated Catalan translation
+
+**Version 3.5.6 TEST**
+
+KitKat or before:
+
+* Added restriction *Srv_getAccountsForPackage*
+* Added account type parameter for *Srv_getAccounts* and *Srv_getAccountsAsUser*
+* Added restrictions for [LinkProperties](http://developer.android.com/reference/android/net/LinkProperties.html)
+* Added quirk *nousage* to disable usage data for specific applications ([issue](/../../issues/2085))
+* Updated support library
+* Updated Catalan translation
+* Updated Slovak translation
+
+Lollipop:
+
+* Added restriction *Srv_startActivityAsCaller* ([issue](/../../issues/1757))
+* Check external storage directory for *open* restriction ([issue](/../../issues/1757))
+* Added restriction *getInstalledProvidersForProfile* ([issue](/../../issues/1757))
+* Allow white listing / show parameter of *getExternalStorageState* ([issue](/../../issues/1757))
+* Added restrictions for [UsageStatsManager](https://developer.android.com/reference/android/app/usage/UsageStatsManager.html) ([issue](/../../issues/1757))
+* Added restrictions *IpPrefix.getAddress* and *IpPrefix.getRawAddress* ([issue](/../../issues/1757))
+* Added restrictions *InetAddress.getAllByNameOnNet* and *InetAddress.getByNameOnNet* ([issue](/../../issues/1757))
+* Added restriction *Srv_getCurrentSyncsAsUser* ([issue](/../../issues/1757))
+* Added restrictions *Srv_addGpsMeasurementsListener* and *Srv_addGpsNavigationMessageListener* ([issue](/../../issues/1757))
+* Added restrictions *getCarrierConfigValues* and *sendMultimediaMessage* ([issue](/../../issues/1757))
+* Added restrictions *Srv_getImei*, *Srv_getIsimIst* and *Srv_getIsimPcscf* ([issue](/../../issues/1757))
+* Added restrictions *Srv_enableLocationUpdatesForSubscriber*, *Srv_getCdmaMdn*, *Srv_getCdmaMin*, *getLine1AlphaTagForDisplay* and *Srv_getLine1NumberForDisplay* ([issue](/../../issues/1757))
+
+**Version 3.5.5 BETA**
+
+* Silently allow *Srv_getPackageInfo*/*Srv_getApplicationInfo* for own packages again
+
+**Version 3.5.4 BETA**
+
+* Broadcast *biz.bokhorst.xprivacy.action.EXCEPTION* if the database could not be read ([issue](/../../issues/2081))
+* Fixed all problems reported through the debug info
+* Allow querying information about own package in most cases ([issue](/../../issues/2079))
+* Updated French translation
+* Updated Indonesian translation
+* Updated Polish translation
+
+**Version 3.5.3 BETA**
+
+* Restart notification for *requestLocationUpdates*, *requestSingleUpdate* and *Srv_requestLocationUpdates*
+* Notify and do not send the intent *biz.bokhorst.xprivacy.action.ACTIVE* when the privacy database was corrupt (discussed on XDA)
+
+**Version 3.5.2 BETA**
+
+* Fixed global *freeze* quirk
+
+**Version 3.5.1 BETA**
+
+* Show parameter to *getPackagesForUid*/*Srv_getPackagesForUid*
+* Fixed renaming long template names ([issue](/../../issues/2052))
+* Fixed using *Srv_requestLocationUpdates* in compatibility mode ([issue](/../../issues/2050))
+* Allow quirk *freeze* per application
+
+[Open issues](https://github.com/M66B/XPrivacy/issues?state=open)
+
+**Version 3.5 STABLE**
+
+* Material design
+* New icon, thanks @[Primokorn](http://forum.xda-developers.com/member.php?u=4958579)
+
+**Version 3.4.14 BETA**
+
+* Fixed all problems reported through the debug info
+* Added support for Android TV
+* Using accent color for in view progress bar
+* New icon, thanks @[daniel_m](http://forum.xda-developers.com/member.php?u=4885896)
+* Added Korean translation
+* Updated Arabic translation
+* Updated Norwegian translation
+
+**Version 3.4.13 BETA**
+
+* Fixed search by reverting to holo search ([issue](/../../issues/2043))
+
+**Version 3.4.12 BETA**
+
+* Usage data for functions which cannot be restricted
+* Fixed double tap search
+* Allow more identification functions to be restricted for XPrivacy itself
+* Updated French translation
+
+**Version 3.4.11 BETA**
+
+* Use material design toolbar
+* Updated Lithuanian translation
+
+**Version 3.4.10 BETA**
+
+* Progress dialog bar in accent color
+
+**Version 3.4.9 BETA**
+
+* Changed accent color to orange
+
+**Version 3.4.8 TEST**
+
+* Use material design switch in application details view
+
+**Version 3.4.7 TEST**
+
+* Using teal as material design colors
+
+**Version 3.4.6 TEST**
+
+* Use accent color for custom check boxes and list item press
+
+**Version 3.4.5 TEST**
+
+* Fixed search view ([issue](/../../issues/2037))
+
+**Version 3.4.4 TEST**
+
+* Custom material design colors
+
+**Version 3.4.3 TEST**
+
+* Fixed settings save/cancel action
+
+**Version 3.4.2 TEST**
+
+* Fixed all problems reported through the debug info
+* Updated Android support library project
+* Using Android SDK CardView library
+* Material design
+* Use subtitle for operation name
+* Updated Norwegian translation
+
+**Version 3.4.1 BETA**
+
+* Fixed all problems reported through the debug info
+* Fixed warning *Native call method*
+* Fixed documentation icons not appearing when opening from notification ([issue](/../../issues/2025))
+* Added title to original value in usage data
+* Added support for [Omega ROM](http://omegadroid.co/omega-roms/)
+* Updated Indonesian translation
+* Updated Russian translation
+* Updated Slovak translation
+* Updated Vietnamese translation
+
+**Version 3.4 STABLE**
+
+* Fixed all problems reported through the debug info
+* Updated French translation
+* Updated German translation
+* Updated Japanese translation
+
+**Version 3.3.4 BETA**
+
+* Strip IP address from IP address / domain name pair for better wildcards ([issue](/../../issues/2014))
+* Added Welsh translation
+
+**Version 3.3.3 BETA**
+
+* Fixed displaying applications with the same name once in select to allow list ([issue](/../../issues/2013))
+
+**Version 3.3.2 BETA**
+
+* Improved IP address / host name parsing
+
+**Version 3.3.1 BETA**
+
+* Fixed all problems reported through the debug info
+* Strip leading slash from IP address for improved wildcards
+* Better [Cydia Substrate](http://www.xda-developers.com/android/cydia-substrate-released-by-saurik-for-android/) support
+* Updated Malay translation
+* Updated Polish translation
+* Updated Russian translation
+
+**Version 3.3 STABLE**
+
+* Display legend on first run
+* Updated Japanese translation
+* Updated Lithuanian translation
+
+**Version 3.2.5 BETA**
+
+* Fixed all problems reported through the debug info
+* Updated Indonesian translation
+* Updated Slovak translation
+
+[Open issues](https://github.com/M66B/XPrivacy/issues?state=open)
+
+**Version 3.2.4 TEST**
+
+* Persist/show original values for: ([pro license](http://www.xprivacy.eu/) only) ([issue](/../../issues/1297))
+ * advertisement ID
+ * phone number
+ * Android ID
+ * Persisting/showing fake values would require an extra call to the privacy service, which would impact performance
+* Added settings menu to usage data view
+* Using [CardView library](https://github.com/yongjhih/CardView)
+ * There are no rounded corners when using the dark theme
+* Added [Material Design](https://developer.android.com/preview/material/index.html) styles (this will **not** work on Android KitKat and before)
+
+**Version 3.2.3 TEST**
+
+* Persist/show original values ([pro license](http://www.xprivacy.eu/) only) ([issue](/../../issues/1297))
+ * Persisting/showing fake values would require an extra call to the privacy service, which would impact performance
+ * Proof of concept with *SERIAL*
+* Flush local application caches too
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Indonesian translation
+* Updated Japanese translation
+* Updated Slovak translation
+
+**Version 3.2.2 BETA**
+
+* Added option to rename templates ([issue](/../../issues/1723))
+* Restored select all ([issue](/../../issues/1977)) ([issue](/../../issues/1986))
+* Updated Dutch translation
+
+**Version 3.2.1 BETA**
+
+* Fixed details view tutorial header
+* Made disabled main list entries clickable
+* Show half check box only to expert users
+* Always show default for on demand restricting time out
+* Updated Dutch translation
+* Updated German translation
+* Updated traditional Chinese translation
+
+**Version 3.2 STABLE**
+
+* Updated Slovak translation
+* Updated Spanish translation
+
+**Version 3.1.5 BETA**
+
+* Select all enabled applications ([issue](/../../issues/1977))
+
+**Version 3.1.4 BETA**
+
+* Added help text to application specific settings ([issue](/../../issues/1968))
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Indonesian translation
+
+**Version 3.1.3 BETA**
+
+* Mark application as changed / update last modification time when white/black listing
+* Updated Slovak translation
+
+**Version 3.1.2 BETA**
+
+* Fixed all problems reported through the debug info
+* Added usage data white/black list help text
+* Mark application as changed / update last modification time when white/black listing
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated Indonesian translation
+* Updated Japanese translation
+
+**Version 3.1.1 STABLE**
+
+* Fixed all problems reported through the debug info
+* Showing message when enabling expert mode / using an expert function
+* Scroll view for toggle restrictions radio buttons
+* Updated Dutch translation
+* Updated Indonesian translation
+
+**Version 3.1 STABLE**
+
+* Showing appropriate main and details help ([issue](/../../issues/1921))
+* Showing application name above usage data ([issue](/../../issues/1949))
+* Showing category help ("i"-icon application list) in web view ([issue](/../../issues/1943))
+* Showing category help ("i"-icon application details) in dialog
+* Removed menu *Check for updates*
+
+**Version 3.0.3 BETA**
+
+* Improved settings layout ([pull request](/../../issues/1946))
+* Improved function help layout ([pull request](/../../issues/1947))
+
+**Version 3.0.2 BETA**
+
+* Layout improvements
+* Fixed tutorial header
+* Fixed Indonesian translation
+* Updated Lithuanian translation
+
+**Version 3.0.1 BETA**
+
+* Improved database locking ([pull request](/../../issues/1939))
+* Changed settings dialog to settings activity ([pull request](/../../issues/1938))
+* Moved flush button to expert mode section ([issue](/../../issues/1934))
+* Added category merge/reset ([issue](/../../issues/1909))
+* Display introductory tutorial only on first run after *About* ([issue](/../../issues/1942))
+* Moved search to action bar ([issue](/../../issues/1918))
+* Added Indonesian translation
+* Updated simplified Chinese translation
+
+**Version 3.0 STABLE**
+
+Main changes since stable version 2.2.1:
+
+* Reviewed all about 250 restrictions, resulting in numerous changes, mainly visible as performance improvements
+* Added about 150 new restrictions to fix the unhook vulnerability, see [FAQ #68](https://github.com/M66B/XPrivacy#FAQ68) for details
+* Reorganized menus, action bar items and other user interface elements to improve usability
+* Fixed all reported bugs and implemented lots of requested features
+* See for all details the changelogs of version 2.99.x
+
+Other changes:
+
+* Updated Italian translation
+* Updated Japanese translation
+* Updated Norwegian translation
+
+**Version 2.99.43 BETA**
+
+* Layout improvement ([pull request](/../../issues/1933))
+* Show usage statistics as subtitle
+
+**Version 2.99.42 BETA**
+
+* Layout and text improvements
+* Updated Arabic translation
+* Updated French translation
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Slovak translation
+
+**Version 2.99.41 BETA**
+
+* Replaced *Play* action by *Operations* menu
+* Moved *Help* action bar item to *Legend* menu
+* Renamed filter button *Clear all* to *Default* ([issue](/../../issues/1920))
+* Updated Dutch translation
+* Updated Japanese translation
+
+**Version 2.99.40 BETA**
+
+* Fixed long application names not showing
+
+**Version 2.99.39 BETA**
+
+* Moved clear all data to settings dialog
+
+**Version 2.99.38 BETA**
+
+* Clear filters will reset the filters to their default state
+* Changed on demand restricting progress bar to holo style
+* Clicking the application name will open the application details view
+* Changed multiple selection background color
+* Reorganized menus and action bar items
+* Updated French translation
+* Updated German translation
+* Updated Lithuanian translation
+* Updated Russian translation
+* Updated Slovak translation
+
+**Version 2.99.37 BETA**
+
+* Clear will also clear usage data and application specific settings
+* Changed application specific fake values icon to a star ([issue](/../../issues/1831))
+* Showing changelog if new version installed
+* Updated Arabic translation
+* Updated Italian translation
+* Updated Japanese translation
+
+**Version 2.99.36 BETA**
+
+* Displaying AOSP mode setting for KitKat and later only
+* Added help texts
+* Added option to merge template to reset functions (not categories)
+* Updated German translation
+* Updated Japanese translation
+* Updated Lithuanian translation
+* Updated Norwegian translation
+* Updated simplified Chinese translation
+* Updated traditional Chinese translation
+
+**Version 2.99.35 BETA**
+
+* Added support for [Mahdi ROM](https://plus.google.com/u/0/communities/116540622179206449806)
+* Added option to enable/disable AOSP mode
+* Updated in application documentation
+* Updated Dutch translation
+* Updated French translation
+* Updated German translation
+* Updated traditional Chinese translation
+
+**Version 2.99.34 BETA**
+
+* Displaying if an application has specific fake values ([issue](/../../issues/1831))
+* Allow own package name for *Srv_getPackageInfo* and *Srv_getApplicationInfo*
+* Updated Dutch translation
+
+**Version 2.99.33 BETA**
+
+* Fixed crash caused by legacy restrictions ([issue](/../../issues/1893))
+* Updated Slovak translation
+
+**Version 2.99.32 BETA**
+
+* Added parameter package name to *Srv_getPackageInfo* and *Srv_getApplicationInfo*
+* Added support for [Android Revolution HD](http://forum.xda-developers.com/showthread.php?t=1925402)
+* Fixed all problems reported through the debug info
+* Updated French translation
+* Updated German translation
+
+**Version 2.99.31 BETA**
+
+* Flush will clear the asked once cache too
+* Display if update service is busy in reboot layout ([issue](/../../issues/1887))
+* Fixed asking again in some cases ([issue](/../../issues/1885))
+* Performance improvement (caching category restrictions)
+* Updated Dutch translation
+* Updated French translation
+* Updated Slovenian translation
+
+**Version 2.99.30 BETA**
+
+* Added help items to template ([issue](/../../issues/1827))
+* Added restrictions *Srv_getPackageInfo* and *Srv_getApplicationInfo* ([issue](/../../issues/1834))
+
+**Version 2.99.29 BETA**
+
+* Added application specific quirks ([issue](/../../issues/1844))
+* Added intent for update check ([issue](/../../issues/1867))
+* Changed the default to *noresolve* and added quirk *resolve*
+* Fixed all problems reported through the debug info
+* Updated Simplified Chinese translation
+
+**Version 2.99.27 BETA**
+
+* Added restriction *registerListener* to the *Sensors* category, which will limit the rate of the gyroscope to 100 Hz to prevent eavesdropping ([issue](/../../issues/1878))
+* Added restriction [GMS5.view](https://developer.android.com/reference/com/google/android/gms/appindexing/AppIndexApi.html) ([issue](/../../issues/1778))
+* Updated French translation
+* Updated Slovenian translation
+
+**Version 2.99.26 BETA**
+
+* Added restriction *GMS5.getLastLocation* and *GMS5.requestLocationUpdates* ([issue](/../../issues/1774))
+* Added restriction *GMS.requestActivityUpdates* ([issue](/../../issues/1774))
+
+**Version 2.99.25 BETA**
+
+* Performance optimizations
+
+**Version 2.99.24 BETA**
+
+* Fixed asking again for allow/deny once longer than 15 seconds ([issue](/../../issues/1873))
+* Force drop down mode for on demand duration
+
+**Version 2.99.23 BETA**
+
+* Fixed a problem reported through the debug info
+ * *Unknown method=Camera.stopPreview*
+* Updated Dutch translation
+* Updated Japanese translation
+
+**Version 2.99.22 BETA**
+
+* Option to select duration to allow/deny once ([issue](/../../issues/1873))
+
+**Version 2.99.21 BETA**
+
+* Restored restriction *Camera.setPreviewCallback*
+* Added restrictions *Camera.setPreviewCallbackWithBuffer*, *Camera.setPreviewDisplay*, *Camera.setPreviewTexture* and *Camera.setOneShotPreviewCallback*
+* Handling *Camera.stopPreview*
+* Handling *MediaRecorder.prepare* and *MediaRecorder.stop*
+* Handling *Audio.stop*
+
+**Version 2.99.20 BETA**
+
+* Restored restriction *MediaRecorder.setOutputFile* ([issue](/../../issues/1874))
+
+**Version 2.99.19 BETA**
+
+* Local transient values only
+
+**Version 2.99.18 BETA**
+
+* Fixed hooking contacts and telephony providers
+
+**Version 2.99.17 BETA**
+
+* Fixed support info warning (transient values)
+
+**Version 2.99.16 BETA**
+
+* Better browser provider compatibility
+
+**Version 2.99.15 BETA**
+
+* Added support for [Dirty Unicorns](http://www.teamdirt.me/)
+* Added support for [Liquid Smooth](http://liquidsmooth.net/)
+* Added support for some CyanogenMod based ROMs, like Spirit ROM
+* Moved *getAllByName*, *getByAddress* and *getByName* to *internet*
+ * Since these functions were moved recently, it is not possible to automatically update them
+* Performance optimizations (introduced transient values)
+* Fixed all problems reported through the support data
+* Allow own uid for *getPackagesForUid* and *queryContentProviders* ([issue](/../../issues/1871))
+* Updated Dutch translation
+* Updated Italian translation
+
+**Version 2.99.14 BETA**
+
+* Fixed restriction *WiFi.Srv_getConnectionInfo*
+* Fixed restriction *WiFi.Srv_getDhcpInfo*
+* Fixed restriction *BrowserProvider2*
+
+**Version 2.99.13 BETA**
+
+* Added support for [Carbon ROM](https://carbonrom.org/)
+* Updated Dutch translation
+
+**Version 2.99.12 BETA**
+
+* Removed restrictions *MapV1.getLatitudeE6* and *MapV1.getLongitudeE6*, since these are not needed and bad for performance ([issue](/../../issues/1862))
+* Handling *MapV1.disableMyLocation* when *MapV1.enableMyLocation* is restricted
+
+**Version 2.99.11 TEST**
+
+* Added support for [SlimKat](http://www.slimroms.net/)
+
+**Version 2.99.10 TEST** (only available for testers)
+
+* Added icon for unsafe restrictions
+* Added system property restrictions *Srv_Default_DNS* and *Srv_WiFi_Country*
+* Added restriction *Bluetooth.Srv_getName*
+* Added restriction *Srv_getCompleteVoiceMailNumber*
+* Added restriction *WiFi.Srv_getBatchedScanResults*
+* Replaced unsafe restrictions by safe restrictions where possible (not in legacy mode)
+* Updated German translation
+* Updated Slovak translation
+
+
+For XPrivacy version 2.x, see the [older changelogs](CHANGELOG-LEGACY.md)
diff --git a/src/XPrivacy-master/XPrivacy-master/DATABASE.md b/src/XPrivacy-master/XPrivacy-master/DATABASE.md
new file mode 100644
index 0000000..4675f0f
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/DATABASE.md
@@ -0,0 +1,181 @@
+WARNING: MODIFYING THE DATABASES DIRECTLY MAY CAUSE ISSUES (INCLUDING BOOT LOOPS) WITH YOUR DEVICE. PROCEED AT YOUR OWN RISK AND ALWAYS PERFORM A BACKUP BEFORE CHANGING ANYTHING!
+
+Introduction
+
+XPrivacy utilizes 2 databases (xprivacy.db and usage.db ), both are located in /data/system/xprivacy . Making a file backup of the database cannot safely be done in a running system and should be done from recovery!
+XPrivacy checks both the xprivacy database and usage database at system boot for integrity (using 'PRAGMA integrity_check'). If a database is found to be corrupt, the database is deleted, because repairing an sqlite database is mostly not possible (and Android doesn't have the tools for it installed). This can happen to the database of any application, but for XPrivacy it is of course a greater concern. Given the support info I receive, this fortunately happens rarely to the xprivacy database, but more to the usage database. The cause for this difference is that the usage database is set to asynchronous mode for speed reasons (using 'PRAGMA synchronous=OFF').
+The usage database is just an aid and not critical for the operation of XPrivacy. Both the xprivacy and usage database are compacted at boot (using 'VACUUM'). This saves space and is good for performance, but the disadvantage is that twice the size of the database on disk space is temporarily needed.
+A full disk (/data/system is mounted on internal memory) is fatal for XPrivacy, because the database will become corrupt in this situation. Again looking at the support info, this also rarely happens.
+All mentioned sqlite commands are properly documented on the SQLite website
+
+Accessing the databases:
+
+From a PC:
+
+adb shell
+su
+sqlite3 /data/system/xprivacy/xprivacy.db
+
+From a Terminal Emulator within Android:
+
+su
+
sqlite3 /data/system/xprivacy/xprivacy.db
+*Note: You may need to install sqlite3 binaries
+
+xprivacy.db consists of two relevant tables
+
+TABLE:restriction
+
+| FIELD | TYPE | NULLABLE |
+|-------------|---------|----------|
+| uid | INTEGER | NOT NULL |
+| restriction | TEXT | NOT NULL |
+| method | TEXT | NOT NULL |
+| restricted | INTEGER | |
+
+The restriction table holds information pertaining to the restriction and onDemand settings on a per UID basis.
+The 'restriction' field always lists the restriction category (Accounts, Browser, Calendar, etc.).
+The method field lists the restriction methods (addOnAccountsUpdateListener, blockingGetAuthToken, getAccounts, etc.)
+Entries where the method field is blank always pertain to the restriction category.
+If a restriction category is set to block or allow the entire category, the individual methods will not be listed (with the exception of dangerous methods).
+The 'restricted' field lists the status of the restrictions settings, the possible values are 0-3.
+The meaning of the 'restricted' field depends on whether the restriction pertains to a category or a method:
+
+For category:
+
+| Value | as seen in XPrivacy| Meaning |
+|-------|--------------------|-----------------------|
+| 0 | [ ] [?] | not restricted, ask |
+| 1 | [x] [?] | restricted, ask |
+| 2 | [ ] [ ] | not restricted, asked |
+| 3 | [x] [ ] | restricted, asked |
+
+For method:
+
+| Value | as seen in XPrivacy| Meaning |
+|-------|--------------------|-----------------------|
+| 0 | [x] [?] | restricted, ask |
+| 1 | [ ] [?] | not restricted, ask |
+| 2 | [x] [ ] | restricted, asked |
+| 3 | [ ] [ ] | not restricted, asked |
+
+
+*NOTE: Although the 'method' field doesn't always contain data, it is still NOT NULL. To query empty entries: WHERE method=''
+
+*NOTE: Changes to the restriction table require a flush of the server side cache to take effect, this can be achieved with a reboot, using the option 'Flush cache' found in Menu - Settings, or by sending the intent am startservice -a biz.bokhorst.xprivacy.action.FLUSH
. The intent can either be sent with root privileges or from an app which has permission biz.bokhorst.xprivacy.MANAGE_XPRIVACY
. For more info see here and here
+
+TABLE:setting
+
+The setting table holds information pertaining to settings on a global (uid=userID; 0 for the main user) and per UID basis, as well as the white/blacklists.
+
+| Field | Type | NULLABLE |
+|-------|---------|----------|
+| uid | INTEGER | NOT NULL |
+| name | TEXT | NOT NULL |
+| value | TEXT | |
+| type | TEXT | |
+
+*Note: WHERE name='State' and value='0'
means ‘restrictions need attention’ (orange), WHERE name='State' and value='1'
means ‘restrictions are changed’ (grey), WHERE name='State' and value='2'
means ‘restrictions are submitted’ (green)
+*Note: WHERE uid='0' and type='Template'
contains the values designated in the restrictions template
+*Note: WHERE type IN (Command, Filename, IPAddress, Library, Proc, Url)
pertain to the white/blacklist entries
+
+usage.db consists of one relevant table
+
+TABLE:usage
+
+The usage database holds information regarding used restrictions by apps.
+The 'restriction' field lists the restriction category (Accounts, Browser, Calendar, etc.).
+The 'method' field lists the restriction methods (addOnAccountsUpdateListener, blockingGetAuthToken, getAccounts, etc.)
+The 'extra' field holds the parameter information (when applicable)
+The 'restricted' field indicates whether the restriction was allowed '0' or denied '1'
+The 'time' field holds a UNIX timestamp indicating when the restriction was last accessed.
+
+| Field | Type | NULLABLE |
+|-------------|---------|----------|
+| uid | INTEGER | NOT NULL |
+| restriction | TEXT | NOT NULL |
+| method | TEXT | NOT NULL |
+| extra | TEXT | NOT NULL |
+| restricted | INTEGER | NOT NULL |
+| time | INTEGER | NOT NULL |
+| value | TEXT | NOT NULL |
+
+NOTE: Although the 'extra' field doesn't always contain data, it is still NOT NULL. To query empty entries: WHERE extra=''
+
+QUERY EXAMPLES:
+
+xprivacy.db
+
+SELECT * FROM setting WHERE uid='0';
+
+This will show all global XPrivacy settings (including those not visible within the app)
+
+SELECT * FROM restriction WHERE uid='1000';
+
+This will show all restriction settings for UID 1000
+
+SELECT * from setting WHERE name='OnDemand' and value='false';
+
+This will list all apps where onDemand is not active
+
+SELECT * from restriction WHERE restriction='internet' and method='' and restricted='2' ORDER BY uid;
+
+This will list all apps that have unrestricted access to the Internet category, ordered by UID
+
+SELECT * FROM restriction WHERE method='inet' and restricted='3';
+
+This will list all apps that have unrestricted Internet/Inet access
+
+SELECT * FROM setting WHERE type='Contact' ORDER BY uid;
+This will list all allowed contacts, ordered by UID. Note that contact value corresponds to the same entry in /data/data/com.android.providers.contacts/databases/contacts2.db:raw_contacts:contact_id (Location may very depending on your ROM)
+
+SELECT * FROM setting WHERE type='Application' ORDER BY uid;
+
This will list all allowed applications, ordered by UID.
+
+UPDATE setting SET value='true' where name='OnDemand' and uid IN (10001,10002,10003);
+
+This will enable onDemand for apps listed in the IN ()
+
+UPDATE restriction SET restricted='0' WHERE uid IN (10001,10002,10003) and method='connect';
+
+This will turn on onDemand for Internet/Connect with a time out default to deny for apps listed in the IN ()
+
+UPDATE restriction SET restricted='3' WHERE uid IN (10001,10002,10003) and method='open';
+
+This will allow unrestricted access to Storage/Open for the listed apps
+
+SELECT uid, restricted FROM restriction WHERE method='loadLibrary' and restricted IN (0,1,3) ORDER BY uid;
+
+This will list all apps that can load native libraries, either permanently or onDemand
+
+SELECT s.uid, s.name, r.restricted FROM setting s JOIN restriction r on s.uid=r.uid WHERE (r.method='inet' and r.restricted IN (0,1,3)) and (s.type='Library' and s.value='true') ORDER BY s.uid, s.name;
+
+This will list UID, native library name and INET permission value for all apps that have INET access (onDemand or permanent) as well as white listed native libraries
+
+UPDATE setting SET value='true' WHERE name='Log';
+
+This will enabled debug logging
+
+UPDATE setting SET value='false' WHERE name LIKE 'Dangerous%';
+
+This will remove all 'dangerous restrictions' from the template
+
+UPDATE setting SET value='false' WHERE name = 'RestrictSystem';
+
+This will disable restricting of system components
+
+usage.db
+
+SELECT * FROM usage ORDER BY time DESC;
+
+This will show all usage data ordered by TIME (newest entries first)
+
+DELETE FROM usage where uid='1000';
+
+This will delete all usage entries for UID 1000
+
+DELETE FROM usage;
+
+THIS WILL DELETE ALL USAGE DATA
+
+*This page was kindly contributed by [an0n981](https://github.com/an0n981)*
diff --git a/src/XPrivacy-master/XPrivacy-master/LICENSE.txt b/src/XPrivacy-master/XPrivacy-master/LICENSE.txt
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/LICENSE.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+ .
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/src/XPrivacy-master/XPrivacy-master/MENU.md b/src/XPrivacy-master/XPrivacy-master/MENU.md
new file mode 100644
index 0000000..1e35146
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/MENU.md
@@ -0,0 +1,124 @@
+XPrivacy Menus
+
+Menu - App list
+ * Tutorial - this will open the tutorial
+ * Usage data - this will show the usage data for all apps for all categories, or the category selected in the category selection drop down
+ * Menu - Usage data
+ * Toggle filter - this will toggle between all and only-denied restrictions
+ * Refresh - this will refresh the current view
+ * Clear - this will clear the entire usage data list
+ * Toggle restrictions - this will allow you to apply a template to selected apps for either one or all categories
+ * Category drop down - here you can select to which category to apply the change
+ * Clear - this will clear restrictions for the selected category
+ * Restrict (categories) - this will restrict the selected category
+ * Apply template (categories) - this will apply the selected template to the selected category
+ * Apply template (categories+functions) - this will apply the selected template to selected category and subfunctions
+ * Enable on demand restriction - this will enable on demand for the selected apps
+ * Disable on demand restrictions - this will disable on demand for the selected apps
+ * Clear all XPrivacy data - this will delete all restrictions, settings, and whitelists; use with caution
+ * Export - this will create a restriction and settings backup of all or the selected apps *1
+ * Import - this will import restrictions and settings from a backup for all or the selected apps *1
+ * Submit restrictions - this will submit restrictions for the selected apps to the crowd server
+ * Fetch restrictions - this will fetch restrictions for the selected apps from the crowd server *1
+ * Report issue - this will open a broswer to submit a new issue on GitHub
+ * Switch theme - this will switch the UI between the light and dark themes
+ * Template - this will allow you set restrictions for the default and alternate templates
+ * Template selector drop down - here you can select which template you want to adjust
+ * Note - functions marked as 'dangerous' are indicated with a red background (predefined) or an orange background (user-defined); long-pressing on a function will change its 'dangerous' status
+ * Settings - here you can set global settings as well as global fake values
+ * Update notifications - this will enable/disable update noticification for all app updates
+ * Restrict on demand - this will enable/disable on demand for all apps
+ * Show application usage data - this will toggle usage data logging on/off for all apps
+ * Show parameters of usage data - this will show parameters when viewing usage data; it does not affect what is actually logged; it only affects what is displayed
+ * Show values of usage data - this will show values when viewing usage data; it does not affect what is actually logged; it only affects what is displayed
+ * Debug log (requires reboot) - this will turn on additional logging for troubleshooting
+ * Expert mode
+ * Restrict system components (Android) - this will toggle restrictions for core android components (UID less than 10000) on/off
+ * Use secure connections - this will enable/disable whether or not communications with the XPrivacy server use the HTTPS protocol
+ * FAKE DATA
+ * Randomize on boot - this will randomize all global fake values on boot
+ * Randomize now - this will randomize all global fake values
+ * Clear - this will clear all global fake values and all 'Randomize on access' check marks
+ * Flush cache - this will clear the server-side restrictions cache
+ * Randomize on access - here you can check which values should be randomized each time it access by an app
+ * About - this will show information about the current XPrivacy version, as well as license status
+
+Menu - App detail view
+ * Tutorial - this will open the tutorial
+ * Usage data - this will show the usage data for the selected app
+ * Menu - Usage data
+ * Toggle filter - this will toggle between all and only-denied restrictions
+ * Refresh - this will refresh the current view
+ * Clear - this will clear the usage data list for the selected app
+ * Apply template - this will allow you to apply a template to the selected app for either one or all categories
+ * Category drop down - here you can select to which category to apply the change
+ * Clear - this will clear restrictions for the selected category
+ * Restrict (categories) - this will restrict the select selected category
+ * Aplly template (categories) - this will apply the selected template to the selected category
+ * Apply template (categories+functions) - this will apply the selected template to selected category and subfunctions
+ * Enable on demand restriction - this will enable on demand for the selected app
+ * Disable on demand restrictions - this will disable on demand for the selected app
+ * Clear - this will allow you to clear the restrictions, settings, and whitelists of the selected app
+ * Export - this will create a restrictions and setting backup of the selected app *1
+ * Import - this will import restrictions and settings for the selected app *1
+ * Submit restrictions - this will submit restrictions for the selected app to the crowd server
+ * Fetch restrictions - this will fetch crowd restrictions for the seleted app *1
+ * Select accounts to allow - this can be used to allow certain accounts access to the account category while restricting it for others *1
+ * Select applications to allow - this will allow the app to see user-specified apps while restricting others *1
+ * Select contacts to allow - this will allow the apps to see user-specified contacts while restricting others *1
+ * Manage whitelists - here previously defined white/blacklist items can be allowed/denied or removed from the list *1
+ * Category drop down - here you can select which white list category you want to manange
+ * Settings - here you can set app-specific settings and fake values
+ * Update notifications - this will enable/disable update noticification for app updates to the selected app
+ * Restrict on demand - this will enable/disable on demand for the selected app
+ * FAKE DATA
+ * Randomize on boot - this will randomize app specific fake values on boot
+ * Randomize now - this will randomize all app specific fake values
+ * Clear - this will clear all app specific fake values and all 'Randomize on access' check marks
+ * Randomize on access - here you can check which values should be randomized each time it access by the selected app
+
+Application list buttons
+* Select all - this will select/unselect all filtered apps
+* Sort by - here you can chose how the apps will be sorted
+ * By name - this will sort by name A-Z
+ * By uid- this will sort by UID number
+ * By date installed - this will sort by installation date
+ * By date updated - this will sort by update date
+ * By date modified (XPrivacy) - this will sort by restriction modification time
+ * Invert sort order - this will invert the above selected order (i.e. by name will be shown Z-A)
+* Filter - here you can filter the app list
+ * Filter on data usage - this will filter on global data usage or data usage for the selected category (category drop down)
+ * Filter on internet access - this will filter on apps which have requested internet access in android
+ * Filter on permission - this will filter on apps that have requested permissions, either globally or for the selected category (category drop down)
+ * Filter on restriction - this will filter on apps that have restrictions set, either globally or for the selected category (category drop down)
+ * Negate - this will show apps without restrictions
+ * Filter by on-demand - this will filter on apps that have on demand enabled, either globally or for the selected category (category drop down)
+ * Negate - this will show apps where on demand is disabled
+ * Filter on user applications
+ * Filter on system appications
+ * Clear all - this will clear all filters
+* ? - this will show the help screen
+* Category drop down - this will show category restrictions in the app list for the selected category
+* Info button - this will open the XPrivacy GitHub page in a browser
+* Search box - here you can search for a specific app by name or UID
+* Restriction check mark - this will restrict/unrestict all or the selected category (category drop down) for an app
+* On demand check mark - this will enable/disable on demand for an app or apply on demand to selected category (category drop down)
+
+Application detail view buttons
+
+* ? - this will show the help screen
+* Info button - this will open the the crowd sourced restrictions for the selected app in a browser
+* On/Off toggle- this will toggle restrictions for the selected app on/off without deleting the restriction settings
+* On demand ? - this will toggle on demand restrictions for the selected app
+* Category drill down - this will show or hide the individual functions of a category
+* Category info icon - this will open the category restrcions info on GitHub in a browser
+* Function book icon - this will show additional information about the function, possibly with a link to the Google documentation
+* Category restriction check mark - this will restrict/unrestrict the category for the selected app
+* Category on demand check mark - this will enable/disable on demand popups to the functions in the cateogry for the selected app
+* Function restrction check mark - this will restrict/unrestrict the individual function
+* Functions on demand check mark - this will enable/disable on demand popups for the individual function
+* Manage white list icon - this will be shown if a function has white/blacklist entries, pressing it will open the white list manager to the specific list *1
+
+*1 - Pro feature (see [Xprivacy.eu](http://xprivacy.eu) for more info)
+
+*This page was kindly contributed by [an0n981](https://github.com/an0n981)*
diff --git a/src/XPrivacy-master/XPrivacy-master/README.md b/src/XPrivacy-master/XPrivacy-master/README.md
new file mode 100644
index 0000000..668b85c
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/README.md
@@ -0,0 +1,1601 @@
+XPrivacy
+========
+
+The ultimate, yet easy to use, privacy manager for Android
+
+**You can use the successor [XPrivacyLua](https://forum.xda-developers.com/xposed/modules/xprivacylua6-0-android-privacy-manager-t3730663) on Android 6.0 Marshmallow and later.**
+
+
+
+[Publication](http://www.blackducksoftware.com/news/releases/black-duck-announces-open-source-rookies-year-winners)
+
+Index
+-----
+
+* [Description](#description)
+* [Features](#features)
+* [Screenshots](#screenshots)
+* [Restrictions](#restrictions)
+* [Limitations](#limitations)
+* [Compatibility](#compatibility)
+* [Installation](#installation)
+* [Upgrading](#upgrading)
+* [Usage](#usage)
+* [Permissions](#permissions)
+* [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq)
+* [Support](#support)
+* [Changelog](https://github.com/M66B/XPrivacy/blob/master/CHANGELOG.md)
+* [Similar Solutions](#similar-solutions)
+* [In The Media](#in-the-media)
+* [Contributing](#contributing)
+* [License](#license)
+
+Description
+-----------
+
+XPrivacy can prevent applications from leaking privacy-sensitive data
+by restricting the categories of data an application can access.
+XPrivacy feeds applications fake data or no data at all.
+It can restrict several data categories, such as *contacts* or *location*.
+For example, if you restrict an application's access to contacts,
+that application will receive an empty contacts list (don't try this with the contacts application itself without a backup).
+Similarly, restricting an application's access to your location will send a fake location to that application.
+
+XPrivacy doesn't revoke or block permissions from an application,
+so most applications will continue to work as before and won't force close (crash).
+There are two exceptions: access to the internet and to external storage (typically an SD-card)
+are restricted by denying access (revoking permissions).
+There is no other way to restrict such access
+because Android delegates handling these permissions to the underlying Linux network/file system.
+XPrivacy can fake an offline (internet) and unmounted (storage) state,
+but some applications still try to access the internet and storage,
+potentially resulting in crashes or error messages.
+If restricting a category of data for an application causes functional limitations,
+XPrivacy can once again allow access to the data category to solve the issue.
+There is a convenient on/off toggle switch for all restrictions for each application.
+
+By default, all newly installed applications cannot access any data category,
+which prevents a new application from leaking sensitive data right after installing it.
+Shortly after installing a new application,
+XPrivacy will ask which data categories you want the new application to have access to.
+XPrivacy comes with an application browser
+that allows you to quickly enable or disable applications' access to any data category.
+You can edit all of an application's data categories.
+
+To help you identify potential data leaks,
+XPrivacy monitors all applications' attempts to access sensitive data.
+XPrivacy displays an orange warning triangle icon when an application has attempted to access data.
+If an application has requested Android permissions to access data, XPrivacy displays a green key icon.
+XPrivacy also displays an internet icon if an application has internet access,
+which clarifies that the application poses a risk of sharing data with an external server.
+
+XPrivacy is built using the [Xposed framework](http://forum.xda-developers.com/xposed/xposed-installer-versions-changelog-t2714053),
+which it uses to tap into a vast number of carefully selected Android functions.
+Depending on the function, XPrivacy skips execution of the original function
+(for example, when an application tries to set a proximity alert)
+or alters the result of the original function (for example, to return an empty message list).
+
+XPrivacy has been tested with Android version 4.0.3 - 6.0.1 (Ice Cream Sandwich, Jelly Bean, KitKat, Lollipop, Marshmallow),
+and is reported to work with most Android variants, including stock ROMs.
+Root access is needed to install the Xposed framework.
+
+
+**XPrivacy was a lot of work, so please support this project.**
+
+If you want to donate, see [here](http://www.xprivacy.eu/) for all options.
+
+**Use XPrivacy entirely at your own risk.**
+
+Features
+--------
+
+* Simple to use
+* No need to patch anything (no source, no [smali](https://github.com/JesusFreke/smali) or anything else)
+* For any stock variant of Android version 4.0.3 - 6.0.1 (ICS, Jelly Bean, KitKat, Lollipop, Marshmallow)
+* Newly installed applications are restricted by default
+* Displays data actually used by an application
+* Option to restrict on demand
+* Free and open source
+* Free from advertisements
+
+Screenshots
+-----------
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Restrictions
+------------
+
+For easy usage, data is restricted by category:
+
+
+* Accounts
+ * return an empty account list
+ * return an empty account type list
+ * return fake account info
+ * return empty authorization tokens
+ * return an empty list of synchronizations
+
+* Browser
+ * return an empty bookmark list
+ * return an empty download list
+ * return empty search history
+
+* Calendar
+ * return an empty calendar
+
+* Calling
+ * prevent calls from being placed
+ * prevent SIP calls from being placed
+ * prevent SMS messages from being sent
+ * prevent MMS messages from being sent
+ * prevent data messages from being sent
+ * return an empty call log
+
+* Clipboard
+ * prevent paste from clipboard (both manual and from an application)
+
+* Contacts
+ * return an empty contact list
+ * content://com.android.contacts
+ * content://com.android.contacts/contacts
+ * content://com.android.contacts/data
+ * content://com.android.contacts/phone_lookup
+ * content://com.android.contacts/profile
+ * SIM card
+
+* Dictionary
+ * return an empty user dictionary
+
+* E-mail
+ * return an empty list of accounts, e-mails, etc (standard)
+ * return an empty list of accounts, e-mails, etc (Gmail)
+
+* Identification
+ * return a fake Android ID
+ * return a fake device serial number
+ * return a fake host name
+ * return a fake Google services framework ID
+ * return file not found for folder [/proc](http://linux.die.net/man/5/proc)
+ * return a fake Google advertising ID
+ * return a fake system property CID (Card Identification Register = SD-card serial number)
+ * return file not found for /sys/block/.../cid
+ * return file not found for /sys/class/.../cid
+ * return a fake input device descriptor
+ * return a fake USB ID/name/number
+ * return a fake Cast device ID / IP address
+
+* Internet
+ * revoke permission to internet access
+ * revoke permission to internet administration
+ * revoke permission to internet bandwidth statistics/administration
+ * revoke permission to [VPN](http://en.wikipedia.org/wiki/Vpn) services
+ * revoke permission to [Mesh networking](http://en.wikipedia.org/wiki/Mesh_networking) services
+ * return fake extra info
+ * return fake disconnected state
+ * return fake supplicant disconnected state
+
+* IPC
+ * Binder
+ * Reflection
+
+* Location
+ * return a random or set location (also for Google Play services)
+ * return empty cell location
+ * return an empty list of (neighboring) cell info
+ * prevents geofences from being set (also for Google Play services)
+ * prevents proximity alerts from being set
+ * prevents sending NMEA data to an application
+ * prevent phone state from being sent to an application
+ * Cell info changed
+ * Cell location changed
+ * prevent sending extra commands (aGPS data)
+ * return an empty list of Wi-Fi scan results
+ * prevent [activity recognition](http://developer.android.com/training/location/activity-recognition.html)
+
+* Media
+ * prevent recording audio
+ * prevent taking pictures
+ * prevent recording video
+ * you will be notified if an application tries to perform any of these actions
+
+* Messages
+ * return an empty SMS/MMS message list
+ * return an empty list of SMS messages stored on the SIM (ICC SMS)
+ * return an empty list of voicemail messages
+
+* Network
+ * return fake IP's
+ * return fake MAC's (network, Wi-Fi, bluetooth)
+ * return fake BSSID/SSID
+ * return an empty list of Wi-Fi scan results
+ * return an empty list of configured Wi-Fi networks
+ * return an empty list of bluetooth adapters/devices
+
+* NFC
+ * prevent receiving NFC adapter state changes
+ * prevent receiving NDEF discovered
+ * prevent receiving TAG discovered
+ * prevent receiving TECH discovered
+
+* Notifications
+ * prevent applications from receiving [statusbar notifications](https://developer.android.com/reference/android/service/notification/NotificationListenerService.html) (Android 4.3+)
+ * prevent [C2DM](https://developers.google.com/android/c2dm/) messages
+
+* Overlay
+ * prevent draw over / on top
+
+* Phone
+ * return a fake own/in/outgoing/voicemail number
+ * return a fake subscriber ID (IMSI for a GSM phone)
+ * return a fake phone device ID (IMEI): 000000000000000
+ * return a fake phone type: GSM (matching IMEI)
+ * return a fake network type: unknown
+ * return an empty ISIM/ISIM domain
+ * return an empty IMPI/IMPU
+ * return a fake MSISDN
+ * return fake mobile network info
+ * Country: XX
+ * Operator: 00101 (test network)
+ * Operator name: fake
+ * return fake SIM info
+ * Country: XX
+ * Operator: 00101
+ * Operator name: fake
+ * Serial number (ICCID): fake
+ * return empty [APN](http://en.wikipedia.org/wiki/Access_Point_Name) list
+ * return no currently used APN
+ * prevent phone state from being sent to an application
+ * Call forwarding indication
+ * Call state changed (ringing, off-hook)
+ * Mobile data connection state change / being used
+ * Message waiting indication
+ * Service state changed (service/no service)
+ * Signal level changed
+ * return an empty group identifier level 1
+
+* Sensors
+ * return an empty default sensor
+ * return an empty list of sensors
+ * restrict individual sensors:
+ * acceleration
+ * gravity
+ * heartrate
+ * humidity
+ * light
+ * magnetic
+ * motion
+ * orientation
+ * pressure
+ * proximity
+ * rotation
+ * step
+ * temperature
+
+* Shell
+ * return I/O exception for Linux shell
+ * return I/O exception for Superuser shell
+ * return unsatisfied link error for load/loadLibrary
+
+* Storage
+ * revoke permission to the [media storage](http://www.doubleencore.com/2014/03/android-external-storage/)
+ * revoke permission to the external storage (SD-card)
+ * revoke permission to [MTP](http://en.wikipedia.org/wiki/Media_Transfer_Protocol)
+ * return fake unmounted state
+ * prevent access to provided assets (media, etc.)
+
+* System
+ * return an empty list of installed applications
+ * return an empty list of recent tasks
+ * return an empty list of running processes
+ * return an empty list of running services
+ * return an empty list of running tasks
+ * return an empty list of widgets
+ * return an empty list of applications (provider)
+ * prevent package add, replace, restart, and remove notifications
+
+* View
+ * prevent links from opening in the browser
+ * return fake browser user agent string
+ * *Mozilla/5.0 (Linux; U; Android; en-us) AppleWebKit/999+ (KHTML, like Gecko) Safari/999.9*
+
+Limitations
+-----------
+
+#### General
+
+* [*/proc*](http://linux.die.net/man/5/proc), CID, system (build) properties, serial number, IMEI, and MAC addresses cannot be restricted for Android itself, because restricting these will result in bootloops
+* */proc/self/cmdline* will not be restricted by */proc*, because it will result in instability
+* The phone number cannot be restricted for the standard phone application
+* The browser bookmarks and history cannot be restricted for the browser itself
+* Internet and storage can only be restricted for applications, providers, and services started by the Android package manager
+* There is no usage data for *inet*, *media* and *sdcard*, since this is not technically possible
+* Because it is static, [*Build.SERIAL*](http://developer.android.com/reference/android/os/Build.html#SERIAL) can only be randomized when an application starts, and there is no usage data
+* Due to a bug in Chromium, the user agent cannot be restricted in all cases ([issue](https://github.com/M66B/XPrivacy/issues/825))
+* Due to a custom implementation, the clipboard cannot be restricted on some Samsung stock ROMs ([issue](https://github.com/M66B/XPrivacy/issues/857))
+* It is not possible to restrict external hardware MAC addresses or the external IP address, see also [FAQ 33](#FAQ33)
+* You cannot restrict *Configuration.MCC/MNC* on demand
+* Allowing contacts for SIM-contacts isn't supported (who is using these anymore?)
+* Calendars and contacts cannot be restricted for specific accounts; it is all or nothing; however, it is possible to allow individual contacts with a [pro license](http://www.xprivacy.eu/)
+* It is possible to unhook methods in user space using native libraries, see for more details [FAQ 68](#FAQ68)
+* In some situations, the on demand restricting dialog freezes, notably when using volume keys. This cannot be fixed due to Android limitations.
+* In some situations, the on demand restricting dialog is overlayed by other windows, notably notifications. This cannot be fixed due to Android limitations.
+* Restricting *Internet/connect* and/or *View/loadURL* for the stock browser doesn't prevent loading of pages ([issue](https://github.com/M66B/XPrivacy/issues/1685))
+* Android System Webview cannot be restricted on Android Lollipop
+
+#### XPrivacy
+
+* You cannot restrict some functions in the *Identification* category, because it is used for submitting restrictions
+ * The Android ID is salted with the serial number and MD5 hashed before communicating with the crowd sourced restrictions server
+ * This means that the crowd sourced restrictions server never gets the serial number nor the Android ID
+* You cannot restrict *IPC* because it is needed for internal checks
+* You cannot restrict *Storage* because it is needed to read the pro license file
+* You cannot restrict *System* because it is needed to get the application list
+* You cannot restrict *View* because it is needed to open links to the [crowd sourced restrictions](http://crowd.xprivacy.eu/)
+
+You can restrict the XPrivacy app's access to accounts, contacts, and other things.
+
+Compatibility
+-------------
+
+* XPrivacy has been tested on Android versions 4.0.3 - 6.0.1 (ICS, Jelly Bean, KitKat, Lollipop, Marshmallow).
+It is reported to work with most Android variants, including stock ROMs.
+
+* **XPrivacy is incompatible with LBE Security Master** ([issue](https://github.com/M66B/XPrivacy/issues/1231)).
+
+* **XPrivacy is incompatible with the security center of MIUI** ([issue](https://github.com/M66B/XPrivacy/issues/1940)).
+See [here](http://forum.xda-developers.com/showpost.php?p=55810186&postcount=12178) for a solution.
+
+* You need to use the quirk 'noresolve' when using [GoPro](https://play.google.com/store/apps/details?id=com.gopro.smarty)
+and some other wireless cameras, like the Sony QX1/10/30/100 ([issue](https://github.com/M66B/XPrivacy/issues/1751)).
+
+* Candy Crush is known to crash on some ROMs, see [here](http://forum.xda-developers.com/showpost.php?p=58722199&postcount=13666).
+
+* Applications with overlay windows crash on MIUI 8, see for a solution ([here](https://github.com/M66B/XPrivacy/issues/2374)).
+
+Installation
+------------
+
+Installation may seem lengthy, but you can do it quickly:
+
+1. Requirements:
+ * Android version 4.0.3 - 6.0.1 (ICS, Jelly Bean, KitKat, Lollipop, Marshmallow); verify via *System Settings* > *About phone* > *Android version*
+ * Read about [compatibility](#compatibility) before installing
+1. **Make a backup**
+1. If you haven't already, root your device; the rooting procedure depends on your device's brand and model.
+ * You can find a guide [here](http://www.androidcentral.com/root) for most devices
+1. Enable *System settings* > *Security* > *Unknown sources*
+1. Install the [Xposed framework](http://forum.xda-developers.com/xposed)
+ * The Xposed fix is **not** needed anymore
+ * For Android 4.0.3 through 4.4.4 see [this XDA thread](http://forum.xda-developers.com/xposed/xposed-installer-versions-changelog-t2714053). If this does not work for you (red error text in Xposed Installer -> Framework), see [this XDA thread](http://forum.xda-developers.com/xposed/xposed-android-4-4-4-t3249895)
+ * For Android 5.x see [this XDA thread](http://forum.xda-developers.com/showthread.php?t=3034811)
+ * For Android 5.0.x Touchwiz ROMs see [this XDA thread](http://forum.xda-developers.com/xposed/unofficial-xposed-samsung-lollipop-t3113463)
+ * For Android 5.1 Touchwiz ROMs see [this XDA thread](http://forum.xda-developers.com/xposed/unofficial-xposed-samsung-lollipop-t3180960)
+ * For Android 6.0.x see [this XDA thread](http://forum.xda-developers.com/showthread.php?t=3034811)
+1. Download and install XPrivacy from [here](http://repo.xposed.info/module/biz.bokhorst.xprivacy)
+ * Alternatively, download it from [here](https://github.com/M66B/XPrivacy/releases)
+1. Enable XPrivacy in the Xposed installer
+1. Start XPrivacy one time
+1. Reboot
+
+I do not recommend using XPrivacy in combination with any of the
+[similar solutions](#similar-solutions),
+because this could result in conflicts and potential data leaks.
+
+There is an unofficial backported Gingerbread version available [here](http://forum.xda-developers.com/showpost.php?p=44034334).
+Please note that only the official version is supported.
+
+If you want to uninstall XPrivacy, you have two options:
+
+1. Disable XPrivacy in the Xposed installer
+1. Uninstall the XPrivacy application
+
+In either case, don't forget to reboot.
+
+To save space, you can delete the folder */data/system/xprivacy* after uninstalling.
+
+Upgrading
+---------
+
+* **Make a backup**
+* **Do not remove the previous version** (else you will lose your settings)
+* Download the new version (with a [pro license](http://www.xprivacy.eu/) you can use the menu *Help ...* > *Check for updates*)
+* Install the new version over the previous version
+* Wait until the Xposed installer recognizes the update (else XPrivacy might not be enabled)
+* Start the new version once (else Android will not send the *Boot Completed* event)
+* Reboot your device
+* Wait until the XPrivacy update service has been completed (showing 100%)
+
+When following this procedure, your data will not leak because the Xposed part of XPrivacy keeps running.
+
+Usage
+-----
+
+#### Brief tutorial
+
+* Find the application to restrict in the main application list
+* Tap on the application icon
+* Tap the first check box of any category you want to restrict
+
+Use common sense when restricting; don't expect internet access if you restricted the internet category, etc.
+
+Get used to XPrivacy before using more advanced features, like function exceptions.
+
+#### Detailed tutorial
+
+XPrivacy starts in the main view, where a data category can be selected at the top.
+By ticking one or more check boxes in the list below, you can restrict the selected data category for the chosen applications.
+The default category is *All*, meaning that all data categories will be restricted.
+
+Tapping on an application icon shows the detailed view where you can manage each of the data categories for the selected application.
+This view will also appear when you tap on the notification that appears after installing or updating an application.
+By default, all data categories will be restricted for newly installed applications to prevent leaking privacy-sensitive data.
+You can change which data categories will be restricted by changing the *Template* available from the main menu.
+
+Data categories make it easier to manage restrictions.
+You can drill down the data categories in the detailed view to reveal individual functions.
+If the category is restricted, you can un-restrict individual functions by clearing the function's check box.
+
+To see restrictions in action, try restricting the category *Identification* for
+[Android Id Info](https://play.google.com/store/apps/details?id=com.bzgames.androidid).
+
+**Applying some restrictions requires restarting applications.**
+
+You can turn on and off all restrictions for an application using the on/off toggle switch.
+
+Since version 1.99, you can also restrict on demand.
+This means you will be asked to allow or deny a category/function
+when the category/function is used by an application.
+Restricting on demand is the default for newly installed applications (when using the default template).
+You can turn on and off restricting on demand in the application details view
+using either the settings or the check box to the right of the on/off toggle switch.
+You can turn on and off restricting on demand for individual categories and functions
+using the second column of check boxes.
+
+If an application has requested Android permissions for a data category,
+the category will be marked with a green key icon.
+If an application has used or tried to use data, the data category will be marked with an orange warning triangle icon.
+If an application has internet permissions, a world globe icon will be shown to the left of the application name.
+These icons are just guidelines because an application can still access some privacy-sensitive data without Android permissions,
+such as your device's serial number, and because it is not possible to monitor data usage in each and every situation,
+such as access to the internet or external storage.
+Be aware that an application can still access the internet through other (sister) applications.
+
+Restricting internet or storage means blocking access to the internet and to external storage (typically the SD-card), respectively.
+Either of these may result in error messages and even cause applications to force close (crash).
+
+Function restrictions considered 'dangerous' are marked with a reddish background color.
+These 'dangerous' functions are more likely to cause applications to crash if you restrict them.
+'Dangerous' functions can be turned into normal functions by long-clicking them in the default template. This is only recommended for experienced users who know how to identify the cause of a crash in the logcat!
+
+Global settings and application specific settings are accessible from the application list's menu
+and from the menu of the application's detailed view. The global settings,
+such as randomized or set latitude/longitude, apply to all applications
+unless you override them with specific application settings.
+But saving an empty set of specific application settings (you can use the clear button)
+will erase all application specific settings so that the global settings will again be in force.
+
+The default restrictions template (in the main menu) is applied automatically to newly installed applications
+and manually via the menu item 'Apply template' in the application's detailed view.
+
+You can find a **very useful overview of all menu items** [here](https://github.com/M66B/XPrivacy/blob/master/MENU.md).
+
+**Use XPrivacy entirely at your own risk.**
+
+Permissions
+-----------
+
+XPrivacy asks for the following Android permissions:
+
+* Accounts: to be able to restrict applications' access to accounts
+* Contacts: to be able to restrict applications' access to contacts
+* Boot: to be able to check if XPrivacy is enabled
+* Internet: to be able to submit and fetch [crowd sourced restrictions](http://crowd.xprivacy.eu/)
+* Storage: to be able to read the pro license file and to be able to export XPrivacy's settings to the SD-card (only with a [pro license](http://www.xprivacy.eu/))
+* Wakelock: to keep the processor running during batch operations
+
+If desired, you can even restrict XPrivacy from accessing any of the above,
+but there are some [limitations](#limitations).
+
+Please note that any Xposed module basically has root permissions and therefore can circumvent any Android permission.
+
+ Frequently Asked Questions (FAQ)
+--------------------------------
+
+
+**(1) Will XPrivacy make my device slower?**
+
+Maybe a little bit, but you probably won't notice.
+
+If you run comparison benchmarks, please submit them.
+
+But my device is slow with XPrivacy!
+It appeared that in some cases this was caused by the TRIM bug.
+See [here](http://forum.xda-developers.com/showthread.php?t=2104326) for more information and a solution.
+
+
+**(2) Does XPrivacy use a lot of memory and battery?**
+
+Almost nothing.
+
+
+**(3) Can you help me with rooting my device?**
+
+There are many [guides](http://www.androidcentral.com/root) to help you to root your device.
+Use your favorite search engine to find one.
+
+
+**(4) How can I reset an application's XPrivacy settings?**
+
+While viewing an application's restrictions, select *Menu* > *Clear*, then reboot.
+
+
+**(5) Can I backup XPrivacy's restrictions, settings, and usage data?**
+
+Starting with version 1.11.13, you can no longer backup XPrivacy's data with standard backup tools, such as Titanium Backup.
+This is because the database is no longer stored in the XPrivacy data folder, but in a system folder.
+I have tried to store the database in the XPrivacy data folder, but this leads to all kinds of permission problems.
+
+The best practice is to use XPrivacy's export function (*Main Menu* > *Export*) to backup XPrivacy data,
+but please note that this requires a [pro license](http://www.xprivacy.eu/).
+
+You can automate backups by sending an intent:
+
+```
+adb shell am start -a biz.bokhorst.xprivacy.action.EXPORT
+```
+
+If you want to specify a file name for the backup:
+
+```
+adb shell am start -a biz.bokhorst.xprivacy.action.EXPORT -e FileName /sdcard/test.xml
+```
+
+You can do this with [Tasker](https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm), for example:
+
+* New task: Any name you like
+* Action Category: Misc/Send Intent
+* Action: biz.bokhorst.xprivacy.action.EXPORT
+* Target: Activity
+* Extra: FileName:/sdcard/test.xml (optional, to specify an export location and file name)
+
+
+**(6) Precisely which functions can XPrivacy restrict?**
+
+Many. See [here](https://github.com/M66B/XPrivacy/blob/master/src/biz/bokhorst/xprivacy/Meta.java) for details.
+
+
+**(7) How safe is XPrivacy?**
+
+Great care has been taken to develop XPrivacy. Nevertheless, on rare occasions, data can leak and applications can crash.
+
+
+**(8) What does "An internal check failed..." error message mean?**
+
+An internal check of XPrivacy failed, resulting in potential data leakage.
+Please press *OK* to send me the support information so I can look into it.
+
+
+**(9) What is the procedure to update a ROM?**
+
+Assuming you don't wish to wipe data, and that Xposed and XPrivacy are already installed before updating the ROM, the best procedure to update a ROM is:
+
+1. Export XPrivacy settings
+1. Enable airplane/flight mode
+1. Use the menu option in XPrivacy to clear all data
+1. Reboot to recovery
+1. Flash ROM
+1. Flash Google apps (optional)
+1. Re-activate Xposed using [Xposed toggle](http://forum.xda-developers.com/showpost.php?p=45188739)
+1. Reboot to Android
+1. Restore the android ID (when needed. For example, with [Titanium backup](https://play.google.com/store/apps/details?id=com.keramidas.TitaniumBackup))
+1. Import XPrivacy settings
+1. Disable airplane/flight mode
+1. Fake the network type (Wi-Fi, mobile)
+
+If you skip the export, clear, or import steps above, some system applications can end up with the wrong restrictions because the ROM update might have changed these applications' UID's.
+
+To import and export XPrivacy's data, you need a [pro license](http://www.xprivacy.eu/).
+
+
+**(10) Can I restrict root access?**
+
+Yes, via *Shell* > *su*,
+but be aware that applications can acquire root privileges through native libraries too.
+An example is [Android Terminal Emulator](https://play.google.com/store/apps/details?id=jackpal.androidterm).
+
+
+**(11) Will restrictions be applied immediately?**
+
+Changes to restrictions may require up to 15 seconds to take effect because of caching. Changing internet and storage restrictions requires restarting the application. Please note that in many cases pressing *back* within target applications merely moves the application to the background.
+
+
+**(12) Does XPrivacy include a firewall?**
+
+You can restrict internet access for any application. But if you want to partly enable internet, for example for Wi-Fi only, you will have to use a firewall application, such as [AFWall+](http://forum.xda-developers.com/showthread.php?t=1957231). XPrivacy works within Android,
+and detailed firewall rules can only be applied within the Linux kernel.
+
+The latest versions of XPrivacy allow you to white and black list IP addresses and host names.
+
+
+**(13) What does the "Unable to parse package." message mean?**
+
+This means XPrivacy's apk file is corrupt. Try disabling your popup blocker or downloading using another device.
+
+
+**(14) How do I make a logcat?**
+
+The simplest way is to use an application like [Logcat Extreme](https://play.google.com/store/apps/details?id=scd.lcex) or [Catlog](https://play.google.com/store/apps/details?id=com.nolanlawson.logcat),
+but logcats captured this way are not always sufficient. The best way to capture a logcat is:
+
+* Install the [Android SDK](http://developer.android.com/sdk/index.html) (Click *Download for other platforms* for a minimal download)
+* Make sure you can connect to your device via USB (see [here](http://developer.android.com/sdk/win-usb.html) for drivers and instructions)
+* **Enable XPrivacy debug logging in the main settings**
+* Power off your device
+* Start logging by entering this command in the command line: *adb logcat >log.txt*
+* Power on your device
+* Reproduce the problem
+
+If you need a logcat from system start, you can run this command on your device (this will force an Android restart):
+
+```
+killall system_server; logcat | grep -i xprivacy
+```
+
+Upload the captured logcat somewhere, for example to Google Drive,
+and link to it from the issue you created.
+Don't forget to mention the *UID* of the application to look into, when relevant.
+
+
+**(15) Where does XPrivacy store its settings?**
+
+XPrivacy's restrictions, settings, and usage data are stored in an sqlite3 database in this folder:
+
+```
+/data/system/xprivacy
+```
+
+
+**(16) Why doesn't clearing the check box for a data category also clear the functions inside that category?**
+
+In the application details view, it will. In the main list view, you are protected against losing the restriction settings inside a data category by accidentally unchecking that category's check box. The restriction settings inside a category only apply when that category is restricted.
+
+
+**(17) How can I export/import my settings?**
+
+You need a [pro license](http://www.xprivacy.eu/) to import your settings. Exported settings are stored in the folder *.xprivacy* in the file *XPrivacy.xml*. You can copy this file to the same place on any other device. When importing, settings are only applied to user and system applications that actually exist on both devices.
+
+The export file will contain all restrictions and settings, but note that allowed accounts and contacts (not the accounts and contacts themselves) can only be imported when the Android ID is the same.
+
+Also see the [above FAQ](#FAQ9) about what to do when updating your ROM.
+
+
+**(18) Why does a GPS status icon still appear after I have restricted locations?**
+
+This is by design. XPrivacy only replaces the real location with a fake location. It even uses the real location to randomize the fake location. The idea is that everything should appear as normal as possible to an application.
+
+See [here](http://forum.xda-developers.com/showpost.php?p=57417209&postcount=13097) for some addtional details.
+
+
+**(19) How about multi-user support?**
+
+Secondary users can install and use XPrivacy the same way as the primary user.
+The primary user cannot manage the restrictions of secondary users.
+This is because Android totally separates the environments of the users
+(which is a good thing, from a security perspective).
+Each user has its own set of settings, so each user can define its own template and global fake values.
+
+* Only the primary user can clear all data
+* Only the primary user can define 'dangerous' functions
+* Only the primary user can enable/disable debug logging
+* The primary user can see all usage data
+* Secondary users can only see their own usage data
+* The pro license needs to be individually activated for each user
+
+
+**(20) Why is the *Settings* > *Fake data* > *Search* button disabled?**
+
+Because some Google components are not installed.
+
+
+**(21) Do I still need root after installing Xposed?**
+
+No, root is only required to install Xposed one time.
+
+
+**(22) Why isn't XPrivacy available in the Google Play Store anymore?**
+
+Because Google removed it. Read the explanation [here](http://forum.xda-developers.com/showpost.php?p=44427089&postcount=2433).
+
+
+**(23) What is "Template" used for?**
+
+XPrivacy uses the default template to apply restrictions to newly installed applications. Templates can also be used when you select "*Apply template*" from the menu inside the application detail view.
+
+
+**(24) Will there be iOS or Windows Phone versions?**
+
+No. Because they are not open source, it's too difficult to implement something like XPrivacy on these OS's.
+
+
+**(25) Will you restrict...?**
+
+* device brand/manufacturer
+* device model/product name
+* device (phone) type
+* network type (mobile, Wi-Fi, etc.)
+* synchronization state
+* screen locking
+* display settings (DPI, resolution, etc.)
+* Wi-Fi settings
+* Bluetooth settings
+* shortcuts
+* autostarting
+* starting other applications
+* Android version
+* vibration
+* checks for root
+* lockscreen
+* time(zone), alarm
+* nag-screens, popups
+* statusbar notifications
+* installing shortcuts
+* wake ups / wakelocks
+
+No, because I don't consider this information to be privacy-sensitive data (i.e. able to identify you and collect data about you). I am happy to add new restrictions for data that is really privacy-sensitive.
+
+* Calendars by account
+* Contacts by account
+
+For the few users who will be using this, it is too much work to implement.
+The [calendar](http://developer.android.com/guide/topics/providers/calendar-provider.html)
+and [contacts](http://developer.android.com/guide/topics/providers/contacts-provider.html) API are quite complicated.
+There is also a better way to accomplish this.
+You can use different users on your device with different accounts.
+To enable multiple users for a phone you can follow [these instructions](http://www.pocketables.com/2013/03/how-to-enable-multiple-user-mode-on-cyanogenmod-10-1-and-some-other-android-4-2-2-roms.html)
+or install [this Xposed mod](http://forum.xda-developers.com/xposed/modules/xposed-multiple-users-phone-t2676516).
+Note that the user selector on the lockscreen works in landscape only.
+
+
+**(26) Will you revoke permissions?**
+
+Android permissions cover only a part of the functions that leak privacy-sensitive information.
+Revoking permissions will make quite a few applications unusable/crash.
+XPrivacy feeds applications with fake or no data, which keeps most applications working.
+In other words, XPrivacy is not a permission manager, but a privacy manager.
+If you need a permission manager, there are several Xposed modules that offer this functionality.
+
+
+**(27) Does XPrivacy work with SELinux (Fort Knox)?**
+
+Yes, I develop XPrivacy on a device with SELinux in restrictive mode.
+
+
+**(28) How does the tri-state check box work?**
+
+The tri-state check box works this way:
+
+* unchecked = **no** items in the category are restricted
+* solid square = **some** items in the category are restricted
+* check mark = **all** items in the category are restricted
+
+Note: By default, categories and functions are filtered by permission, so you may not see all of them. The check box state is independent of this.
+
+
+**(30) What should I do if an application force closes (crashes) or something doesn't work?**
+
+Inspect the application's usage view, via the main menu item *Usage data* to see which restrictions were enforced.
+Restrict and unrestrict one by one until you have found which one causes the application to force close.
+Wait 15 seconds after each change to let the XPrivacy cache time-out.
+Help others by submitting your working set of restrictions.
+
+See also [this FAQ item](#FAQ63).
+
+
+**(31) Can XPrivacy handle non-Java applications?**
+
+In general, due to Android's isolated virtual machine architecture, calls to native libraries and binaries are via Java and so XPrivacy can restrict them. XPrivacy can cover any route to a native library or binary.
+
+XPrivacy cannot hook into native libraries, but can prevent native libraries from loading. This can break applications such as Facebook, but can prevent malware from doing its work.
+
+XPrivacy can also restrict access to the Linux shell (including superuser) to prevent native binaries from running. You can find these restrictions in the *Shell* category.
+
+Starting with version 2.0, XPrivacy can protect against direct interprocess communication (IPC).
+
+
+**(32) Why do I see data usage when an application does not have the corresponding Android permission?**
+
+Many functions do not require Android permissions, so this is quite normal. Sometimes an application tries to access a function for which it doesn't have an Android permission. Since XPrivacy usually runs prior to the function, such access will be noted.
+
+If you filter on permissions, and an application tries to use a function without having permission, the application will still be shown.
+
+If you think a function requires permissions while XPrivacy shows it doesn't, please report it.
+
+
+**(33) How can I restrict the hardware, external MAC, IP, and IMEI number?**
+
+You can restrict the (internal) IP and MAC addresses and IMEI number for any application.
+
+The external IP is assigned by your provider and cannot be changed. You could use a [VPN](http://en.wikipedia.org/wiki/Virtual_private_network) or [TOR](http://en.wikipedia.org/wiki/Tor_\(anonymity_network\)) to hide your external IP to a certain extent.
+
+The hardware MAC address can be changed on some devices, but this is device-dependent and can only be done at the driver or kernel level. XPrivacy only works on the Android level and is device-independent.
+
+The same applies to the IMEI number, additionally complicated by legal issues in most countries.
+
+
+**(34) What is the logic behind on demand restricting?**
+
+* The on demand restricting dialog will appear if:
+ * On demand restricting is enabled in the main settings
+ * On demand restricting is enabled in the application settings
+ * The category and the function are marked with question marks
+ * However a few functions are exempted from prompting (only *Phone/Configuration.MCC/MNC*)
+ * Prompts will not be shown for 'dangerous' functions
+ * An exception are functions with white/black lists
+ * Prompts will not be shown for System applications
+* *Apply to entire category* will:
+ * Set the entire category according to your choice (deny/allow)
+ * Existing settings for individual functions are forgotten
+* When applying to a function only (*Apply to entire category* not checked):
+ * The function is set according to your choice
+* The default after dialog timeout is taken from the current restriction settings
+* There are four possibilities for the restriction / on demand checkboxes:
+ 1. ☐ ☐ You will not receive an on demand popup, the permission will always be allowed
+ 2. ☐ [?] You will receive an on demand popup, if this times out or the screen is locked the permission will be allowed once
+ 3. ☑ [?] You will receive an on demand popup, if this times out or the screen is locked the permission will be denied once
+ 4. ☑ ☐ You will not receive an on demand popup, the permission will always be denied
+* Be aware that the on demand popups are global, which could be an issue if your device has multiple users. Unfortunately, this cannot be changed.
+
+
+**(37) Do I need to have the Google Play Store/services installed for the pro version?**
+
+Only for the [pro license fetcher](https://play.google.com/store/apps/details?id=biz.bokhorst.xprivacy.license), not for a pro license acquired through a PayPal donation.
+The pro license fetcher needs the Google Play Store/services for fetching a pro license, but not for using a pro license.
+
+
+**(38) What does the update service do?**
+
+The update services runs after upgrading XPrivacy and after each boot.
+It takes care of migrating settings, randomization of fake data, and upgrading settings for new versions.
+
+
+**(46) Why do I need to register to submit restrictions?**
+
+To prevent a malicious application author from automatically submitting many *allow* restrictions to outvote the legitimate users.
+
+
+**(47) What is IPC?**
+
+It is an acronym for **I**nter-**P**rocess **C**ommunication. See [here](http://forum.xda-developers.com/showpost.php?p=50274730&postcount=7006) and [here](http://forum.xda-developers.com/showpost.php?p=50352683&postcount=7206) for more information.
+
+
+**(48) Can XPrivacy be detected by other application?**
+
+Yes, but I don't see this as a problem,
+since [security through obscurity](http://en.wikipedia.org/wiki/Security_through_obscurity) is not a good principle.
+
+
+**(49) Why do I keep getting a 'Restart required' message?**
+
+Things to do / check:
+
+* Ensure the Xposed framework is (still) installed using the Xposed installer
+* Ensure the XPrivacy application is stored on the internal storage and not moved to the SD-card or somewhere else
+ * Fairphone users, see [here](https://fairphone.zendesk.com/hc/en-us/articles/201154666-How-can-I-see-all-the-different-places-where-information-is-stored-on-my-phone-SD-Card-Internal-Storage-and-Phone-Storage-)
+* Ensure LBE Security Master is not installed (disabling is not enough)
+* Ensure the security center of MIUI is disabled (see [here](http://forum.xda-developers.com/showpost.php?p=55810186&postcount=12178))
+* In the Xposed installer, disable XPrivacy, wait a few seconds, and then enable it again. Then reboot.
+* Clear the (Dalvik) cache using the device's recovery
+
+The most common problem seems to be the storage location of the XPrivacy application.
+
+If these suggestions don't help, please create an issue and provide a logcat (see [*Support*](#support)).
+
+
+**(50) Do you have suggestions about additional privacy-related software?**
+
+IMHO, in addition to XPrivacy, you should at least install an ad blocker and a firewall:
+* [AdAway](https://free-software-for-android.github.io/AdAway//) ([source code](https://github.com/Free-Software-for-Android/AdAway))
+* [AFWall+](https://play.google.com/store/apps/details?id=dev.ukanth.ufirewall) ([source code](https://github.com/ukanth/afwall))
+
+Here is a list of additional privacy-related software:
+* [CrappaLinks](http://forum.xda-developers.com/showthread.php?t=2603868) ([source code](https://github.com/GermainZ/CrappaLinks))
+* [PlayPermissionsExposed](http://forum.xda-developers.com/xposed/modules/playpermissionsexposed-fix-play-store-t2783076) ([source code](https://github.com/GermainZ/PlayPermissionsExposed))
+* [Xabber](https://play.google.com/store/apps/details?id=com.xabber.android) ([source code](https://github.com/redsolution/xabber-android))
+* [Wi-Fi Privacy Police](https://play.google.com/store/apps/details?id=be.uhasselt.privacypolice)
+
+Please note that none of these applications are written by me, so please be sure to contact their respective authors for support questions.
+
+
+**(51) What does the on/off toggle switch do in the application details view?**
+
+It turns all restrictions for the application on or off, but still allows you to change the restrictions.
+
+
+**(52) Why was my issue closed?**
+
+I have really spent a lot of time developing XPrivacy and I am happy to look into any issue,
+but I am asking you to properly document your issue.
+*It doesn't work* or *it crashes* is not sufficient!
+So, please *help me help you* by describing the exact steps to reproduce the problem and/or provide a logcat.
+
+See [*Support*](#support) for more details.
+
+
+**(53) What happens if I make XPrivacy a device administrator?**
+
+This will ensure that other applications cannot uninstall XPrivacy without your knowledge.
+
+
+**(54) Why do exporting and importing take so long?**
+
+There are more than 400 restrictions per application.
+Additionally, there can be quite a few application specific settings
+(for example, when you use white/black lists).
+So, yes, exporting and importing restrictions and settings can take quite some time.
+The default is to export restrictions for all applications, since the export is meant to be a full backup.
+However, it is possible to filter the applications whose restrictions you want to export using the filter icon in the action bar
+(for example, only user applications with restrictions),
+and then to select only these applications using the action bar *select all* (first icon).
+
+
+**(56) How can I recover from a bootloop?**
+
+For devices with a custom recovery (TWRP/CWM) you can flash the [Xposed-Disabler-Recovery.zip](http://forum.xda-developers.com/attachment.php?attachmentid=2568891&d=1391958634). Alternatively, (on most devices) press the volume down button 5 times during boot (there will be a vibration with each press when done correctly).
+
+See [here](https://github.com/M66B/XPrivacy/blob/master/DATABASE.md#xprivacydb) on how to enable debug logging without XPrivacy activated in Xposed.
+
+
+**(57) How does *Expert mode* work?**
+
+Expert mode has the following sub-options which can be toggled individually:
+
+* *Restrict system components (Android)*
+ * Enabling this option allows you to restrict applications which have a UID less than 10000 (Android System, Bluetooth Share, Dialer, NFC, Phone, etc.). Restricting these core functions is quite dangerous, and can easily lead to bootloops. Always make a backup (export/nandroid) before changing these restrictions.
+* *Use secure connections*
+ * Enabling this option (default), forces communications with the crowd sourced restrictions server (submitting/fetching, device registration) to travel through a secure socket. This option can only be disabled by first enabling *Expert mode*.
+* *Maximum fetch confidence interval*
+ * Increasing this value will result in fetching less-reliable crowd sourced restrictions.
+* *Quirks*
+ * Used to fix some application compatibility issues or to enable special or expert features
+ * *freeze*: show the on demand restriction dialog, even if there is the possibility it will freeze
+ * *resolve*, *noresolve*: enable/disable resolving IP addresses to names for usage data / on demand restricting
+ * *test*: allow the XPrivacy update checker to also check for test versions
+ * *safemode*: hide unsafe function restrictions
+* *Clear cache* will clear settings and restrictions caches for all applications and the privacy service
+* *Clear all data* will erase **all** settings and restrictions. Use with care!
+
+
+**(58) Can I write a thesis about XPrivacy?**
+
+Yes, you can. I will even help you with it.
+However, I will not write or review code or text for you. Nevertheless, I will try to answer any questions you have.
+XPrivacy is open source (see the [license](#license)) and all code you write needs to be contributed back to the project.
+To help you, I want to see an e-mail from your professor with a confirmation he or she has read and agrees to this README.
+
+
+**(59) Will you implement multiple profiles?**
+
+No, because privacy is not something that is optional.
+It makes no sense to restrict something during the day and not during the night, or at work and not at home.
+
+
+**(60) Why is the upgrade notification stuck at 100%?**
+
+This is by design, so you can see the upgrade has completed successfully.
+You can swipe away the notification after you have seen it.
+
+
+**(61) Can the default on demand restricting time-out be increased?**
+
+Unfortunately this is not possible.
+The on demand restricting dialog is holding up system processes,
+and Android may reboot automatically if too much time has passed without a response.
+Recent versions of XPrivacy have a reset button; use at your own risk.
+
+
+**(62) How can I 'toggle' multiple applications?**
+
+Multiple selection works as in any Android application.
+Tap and hold down on an application in the application list to start selecting,
+and tap other applications to select more applications.
+Toggle restrictions will work on the selected applications.
+
+You can use this as a powerful way to apply a template to multiple applications.
+
+You can also use the filters to show the applications you want to act on,
+since toggle restrictions works on the visible applications by default.
+There is one exception to this: exporting will be done for all applications by default,
+since the export is intended to be a full backup.
+
+
+**(63) How can I troubleshoot an issue believed to be caused by XPrivacy?**
+
+* Always make sure you have a backup (XPrivacy export, or nandroid)
+* Most issues are caused by a "bad" restriction, so try to reproduce the issue and check the main usage data
+* Verify that the issue is actually caused by XPrivacy
+ * Turn on airplane/flight mode
+ * Disable XPrivacy in the Xposed installer (don't forget to reboot)
+ * Check if the issue is still present; if yes, XPrivacy is not causing the issue
+* Finding the culprit:
+ * Clear all XPrivacy restrictions (don't forget to reboot)
+ * Check if the issue is still present
+ * Import half of your restrictions, check if the issue is still present
+ * If yes, clear again and import only half of these restrictions
+ * Continue this process until you have found the "bad" restriction
+* If following these steps fails to find the issue, please follow the [*Support*](#support) instructions
+
+
+**(64) Is the on demand dialog always shown?**
+
+That depends on your ROM version.
+On stock ROM 4.4.4 (Nexus 5), the on demand dialog is always shown.
+On older or customized ROMs, the on demand dialog is almost always shown,
+except sometimes for the functions *inet*, *sdcard* and *media*,
+and sometimes for restrictions triggered by the hardware buttons (for example, the volume buttons).
+This is to prevent the on demand dialog from freezing (locking up), caused by an internal Android lock.
+This freeze cannot be fixed by XPrivacy.
+
+If you want to have the on demand dialog always shown, then you can add the *quirk* "freeze".
+
+
+**(65) Why is my data is still visible?**
+
+The data might be cached by the application, so you might have to wait a while until the cache is updated.
+It may even be necessary to restart the application or reboot your device to clear the cache.
+
+The Google Maps view can look like a part of an application, but is in fact not.
+Even if your current position is shown on the map, it doesn't mean the application knows your current position.
+
+
+**(66) How can I directly start ... ?**
+
+See [question #5](#FAQ5) for how to start an export and for details on Tasker.
+
+Similarly you can start other activities:
+
+* Settings
+
+```
+am start -a biz.bokhorst.xprivacy.action.SETTINGS
+am start -a biz.bokhorst.xprivacy.action.SETTINGS --ei Uid 10123
+```
+
+* Application details view
+
+```
+am start -a biz.bokhorst.xprivacy.action.APPLICATION --ei Uid 10123
+am start -a biz.bokhorst.xprivacy.action.APPLICATION --ei Uid 10123 --ei Action 1
+am start -a biz.bokhorst.xprivacy.action.APPLICATION --ei Uid 10123 --ei Action 2
+am start -a biz.bokhorst.xprivacy.action.APPLICATION --ei Uid 10123 -e RestrictionName location
+am start -a biz.bokhorst.xprivacy.action.APPLICATION --ei Uid 10123 -e RestrictionName location -e MethodName GMS.addGeofences
+```
+
+Action 1 means clear; action 2 means settings.
+
+* Usage data
+
+```
+am start -a biz.bokhorst.xprivacy.action.USAGE
+am start -a biz.bokhorst.xprivacy.action.USAGE --ei Uid 10123
+```
+
+* Export, import, submit, fetch, toggle
+
+```
+am start -a biz.bokhorst.xprivacy.action.EXPORT
+am start -a biz.bokhorst.xprivacy.action.EXPORT --eia UidList 10123,10124 --ez Interactive true
+am start -a biz.bokhorst.xprivacy.action.IMPORT
+am start -a biz.bokhorst.xprivacy.action.IMPORT --eia UidList 10123,10124 --ez Interactive true
+am start -a biz.bokhorst.xprivacy.action.SUBMIT --eia UidList 10123,10124 --ez Interactive true
+am start -a biz.bokhorst.xprivacy.action.FETCH --eia UidList 10123,10124 --ez Interactive true
+am start -a biz.bokhorst.xprivacy.action.TOGGLE --eia UidList 10123,10124 --ez Interactive true
+```
+
+* Flush cache, check for updates
+
+These actions require root or the permission *biz.bokhorst.xprivacy.MANAGE_XPRIVACY*.
+
+```
+am startservice -a biz.bokhorst.xprivacy.action.FLUSH
+am startservice -a biz.bokhorst.xprivacy.action.UPDATE
+```
+
+With Tasker, you can create shortcuts on your homescreen:
+
+* Create a task and give it a name (Tasker)
+* Create a shortcut on your homescreen (launcher)
+* Choose shortcut: "Task Shortcut" (launcher)
+* Task Selection: "your_usage_data_task" (Tasker)
+* Task Shortcut Icon: tap the *Image Select* button (lower right) and choose an icon (for example the XPrivacy icon) (Tasker)
+* Create icon: tap the back button to finish creating the shortcut (Tasker)
+
+
+**(67) Why do I get 'refused', 'forbidden', or an error while submitting/fetching/navigating the crowd sourced restrictions?**
+
+This probably means your IP address has been blacklisted.
+Typically, this is because of spamming or other kind of abuses.
+TOR exit nodes and VPS servers are often blacklisted.
+It is possible your device is infected with malware, and is sending spam without your knowledge.
+
+You can check if [your IP address](http://www.whatismyip.com/) is blacklisted by checking if it is mentioned on one of these lists:
+
+* [Spamhaus DROP List](http://www.spamhaus.org/drop/drop.lasso)
+* [Spamhaus EDROP List](http://www.spamhaus.org/drop/edrop.lasso)
+* [Stop Forum Spam](http://www.stopforumspam.com/search) (30 days or less)
+
+Another potential cause is documented [here](http://forum.xda-developers.com/showpost.php?p=56034808&postcount=12293).
+
+
+**(68) What are unsafe restrictions?**
+
+Unsafe restrictions can be disabled by removing the Xposed method hook using a native library.
+See [here](https://github.com/cernekee/WinXP) for a proof of concept.
+You can prevent this by not allowing native libaries to load, which will, unfortunately, often result in a crash.
+
+XPrivacy 3 does partly address this problem for [vanilla Android KitKat](https://source.android.com/)
+and some other frequently used ROMs (see below).
+This is done by hooking into the Android counterparts of the user space functions.
+Unfortunately, not all user space functions have an Android counterpart,
+meaning that this cannot be done for all restrictions.
+Nevertheless, the most sensitive data, like contacts and your location, can safely be protected by XPrivacy 3.
+
+*XPrivacy 3 modes*
+
+* AOSP mode = vanilla (Google) Android KitKat or one of these KitKat based ROMs:
+ * [OmniROM](http://omnirom.org/)
+ * [CyanogenMod](http://www.cyanogenmod.org/) (based)
+ * [MIUI](http://en.miui.com/)
+ * [SlimKat](http://www.slimroms.net/)
+ * [Carbon ROM](https://carbonrom.org/)
+ * [Dirty Unicorns](http://www.teamdirt.me/)
+ * [Liquid Smooth](http://liquidsmooth.net/)
+ * [Paranoid Android](http://paranoidandroid.co/)
+ * [Android Revolution HD](http://forum.xda-developers.com/showthread.php?t=1925402)
+ * [Mahdi ROM](https://plus.google.com/u/0/communities/116540622179206449806)
+ * [Omega ROM](http://omegadroid.co/omega-roms/)
+* AOSP mode = vanilla (Google) Android Lollipop
+* Compatibility mode = all other earlier/later Android versions/variants
+
+*About* will show if XPrivacy 3 is running in compatibility mode, which means XPrivacy 3 is behaving as XPrivacy 2.
+If there is no message about compatibility mode, XPrivacy 3 is running in AOSP mode.
+XPrivacy 3 will always run in compatibility mode on Android versions before KitKat.
+
+You can force XPrivacy 3 into AOSP mode using the main settings.
+This will work on Lollipop when SELinux is disabled, or in permissive mode, or if you add this build property:
+
+```
+xprivacy.options=ignoreselinux
+```
+
+There is no need to force AOSP mode if XPrivacy recognizes your ROM as a compatible ROM.
+
+If you force AOSP mode, privacy-sensitive data may leak.
+XPrivacy has many internal checks, so if something is going wrong,
+you will probably sooner or later get a debug info popup.
+
+For the benefit of others, please report if XPrivacy 3 works for the ROM you are using
+(also post a screenshot of the *About* of XPrivacy, so I can see how the ROM is recognized).
+
+
+**(69) What do the state colors mean, and when do they change?**
+
+* **Grey**: three cases:
+ 1. after clearing restrictions for an application
+ 1. after setting any restriction for an application
+ 1. after you perform an XPrivacy import
+* **Orange**: four cases:
+ 1. application is new
+ 1. application is updated
+ 1. after you delete all regular (not on demand) restrictions for an application
+ 1. after you fetch restrictions from the crowd sourced XPrivacy server for an application
+* **Green**: after you submit restriction changes to the crowd sourced XPrivacy server for an application
+
+
+**(70) Why do I get a '429 Too Many Requests' message?**
+
+This can happen when checking for updates using the main menu.
+Everybody can download a new version of XPrivacy five times in 12 hours.
+After this limit, you will get '*429 Too Many Requests*'.
+This is to limit the bandwidth of the server to acceptable levels.
+Simply wait 12 hours after the last download, and you can download again.
+Please note that I will not make exceptions to this, because the limit is there for a reason.
+
+
+**(71) Why don't I see the changelog**
+
+Make sure you have an internet connection and that XPrivacy has internet access (check your firewall).
+The changelog is an in-app display of [this page](https://github.com/M66B/XPrivacy/blob/master/CHANGELOG.md)
+
+
+**(72) Can you make XPrivacy available on F-Droid, Amazon, or other stores/repositories?**
+
+I don't want to publish XPrivacy in dozens of places, because it is extra work that doesn't add any value.
+The current download locations,
+the [Xposed repo](http://repo.xposed.info/module/biz.bokhorst.xprivacy)
+and [GitHub](https://github.com/M66B/XPrivacy/releases),
+should be accessible to almost everybody.
+
+[F-Droid](https://f-droid.org/) also doesn't allow me to sign the APK with my own signature.
+
+
+**(74) Why do I not see a specific application in the application list?**
+
+XPrivacy allows you to restrict each and every application. XPrivacy even allows you to restrict
+itself as well as core Android system components, although there are a few [limitations](#limitations).
+These limitations are for your own safety (for example, to prevent a bootloop or to keep XPrivacy usable in all circumstances).
+
+The application you are searching for is most likely filtered, for example because it is a system application.
+You can change the filters by using the main menu *Filter*.
+By default, system applications and applications without permissions for the selected category are filtered.
+
+Some applications (components) share data, which means they share the same UID.
+These applications are shown only once in XPrivacy (this cannot be changed).
+An example is the Dolphin browser and its plugins/addons.
+
+
+**(76) What happened to the import/export enabler?**
+
+Please read [here](http://forum.xda-developers.com/xposed/modules/xprivacy-ultimate-android-privacy-app-t2320783/page1281#post57091458).
+
+
+**(77) Why does my pro license not work?**
+
+* Make sure that the license file name and contents were not altered while downloading the file (for example, by a virus scanner or your e-mail client). The **most common problem** is that some e-mail clients rename the file.
+* Make sure that you have put the license file into the root folder of the SD-card (this is the folder you will see when you connect your Android device to a PC).
+* After starting XPrivacy, the license file will be imported, which means the license file will be removed from the root folder of the SD-card, and that the about dialog will show *Licensed*.
+
+If your device doesn't have an SD-card, you will need to put the license file into the root folder of the external storage folder.
+This is the folder you will see if you connect your Android device to a PC. When in doubt, you can use the menu *Help*, *About* to see the correct folder name.
+
+If it still does not work, try to put the license file in the alternate location as shown in the *About* dialog.
+
+
+**(78) Why do I get 'The Play store says not licensed' message when I try to fetch a license?**
+
+This message basically means that the Google Play Store thinks you didn't pay for the [pro license fetcher](https://play.google.com/store/apps/details?id=biz.bokhorst.xprivacy.license).
+
+Please make sure you are using the original Google Play Store application, and that the Google Play Store and Google Play services have internet access (mind your firewall).
+Make sure you are not using *Lucky Patcher*, *Freedom*, or similar applications.
+Also make sure you didn't restrict the Google Play Store, Google Play services, or Pro License Fetcher using XPrivacy.
+
+Start the Google Play Store and wait about a minute so it can synchronize with the Google servers.
+
+Try to fetch a license again. If you keep having this problem, please contact me.
+
+
+**(79) How can I disable restrictions at boot (experts only)**
+
+By creating this file:
+
+*/data/system/xprivacy/disabled*
+
+Each line should either contain a category name or a category name and function name separated by a slash (/).
+See [here](https://github.com/M66B/XPrivacy/blob/master/src/biz/bokhorst/xprivacy/Meta.java#L47) for the correct category and function names.
+
+If SELinux is restrictive, you need to add this build property:
+
+```
+xprivacy.options=ignoreselinux
+```
+
+
+**(80) Why do I get 'Privacy service version mismatch' error?**
+
+When installed, XPrivacy has two parts: the Xposed module part and the application part. This error means the Xposed module part and the application part have different version numbers.
+If a reboot doesn't solve this problem, try disabling and then enabling XPrivacy in the Xposed installer, and reboot again.
+
+
+**(81) Why does restricting a category not restrict all of its functions? What are 'dangerous' functions?**
+
+Some functions are marked 'dangerous' (red background) because they frequently cause applications to crash when they are restricted. When a category is restricted, the 'dangerous' functions within this category will not be restricted. These functions can be restricted directly, if needed.
+Experienced users can change a 'dangerous' function into a normal function by long-clicking it in the default template. Usually, the restriction that caused an application to crash can be identified in the logcat. Again, restricting 'dangerous' functions is only recommended for experienced users and will cause crashes more frequently!
+
+
+**(82) Do whitelists override function restrictions?**
+
+Yes, whitelists always override function restrictions.
+
+
+**(83) Do whitelists override the 'Deny' button?**
+
+Yes, whitelists will always override the 'Deny' button.
+
+
+**(84) What does the 'Don't know' button do?**
+
+Nobody knows. That is why it has that name.
+
+Actually, pressing 'Don't know' will, for 15 seconds, deny non-dangerous restrictions and allow dangerous restrictions.
+
+For a non-dangerous restriction with a whitelist, the whitelist will always override the complete denial.
+
+Support
+-------
+
+*Please read everything below first!*
+
+#### General
+
+**Do not use my personal or XDA e-mail for bug reports, feature requests, or questions.**
+
+It is okay to use my personal or XDA e-mail for things that cannot be shared in public, such as security reports.
+
+**There is only support for official XPrivacy releases.**
+
+**There is no support for versions prior to the latest stable release.**
+
+It is already enough work to support the latest stable official version.
+
+There is no support for XPrivacy on Ice Cream Sandwich (ICS) or Jelly Bean anymore.
+There is limited support for XPrivacy on KitKat.
+Limited support means I will try to fix bugs, but only if it doesn't take much time.
+
+**I will not look into issues of applications that cost money or have root access.**
+
+**There is no support for anything other than privacy (no support for game cheating, root cloaking, etc.)**
+
+Please check [the limitations](#limitations) before reporting a bug, requesting a feature, or asking a question.
+
+#### Bugs
+
+**First ask if other people have encountered the same bug!** (see questions below)
+
+If you encounter a bug, please [create an issue](https://github.com/M66B/XPrivacy/issues).
+
+Please describe the exact steps to reproduce the issue, including the wrong and expected result,
+and include information about your device type, and Android and XPrivacy versions.
+
+To increase the chance I can find and fix the bug, please read [here](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html).
+
+Include a [logcat](#FAQ14) when relevant (use [gist](https://gist.github.com/) or a similar service).
+Try to keep the logcat as brief as possible, include just the crash/problem and a few dozen lines around it.
+I have looked into many long logcats in the past, too often without any result.
+Therefore I will not look into long logcats anymore.
+
+**One bug report per issue please!**
+
+**Do not forget to enable XPrivacy debug logging using the settings menu!**
+
+**Before submitting any issue, please make sure you are running the latest version of XPrivacy.**
+
+**Before submitting any issue, please make sure XPrivacy is causing the problem by temporarily disabling XPrivacy and seeing if that resolves the issue.**
+
+#### Feature requests
+
+If you have a feature request, please [create an issue](https://github.com/M66B/XPrivacy/issues).
+
+New features are only considered for implementation when requested on GitHub with a detailed description of the feature and only if there are ten +1's within two weeks.
+You can promote your feature request on XDA, but for a maximum of two times only. Feature requests promoted more than two times will be closed and not be considered for implementation anymore.
+See [here](http://forum.xda-developers.com/showpost.php?p=51574315&postcount=8776) for some more information.
+
+Please read [here](http://forum.xda-developers.com/showpost.php?p=52644313&postcount=9241) before voting.
+
+Implementation of new features is dependent on contributions to the XPrivacy project.
+Please read [here](http://forum.xda-developers.com/xposed/modules/xprivacy-ultimate-android-privacy-app-t2320783/post57469136#post57469136) for more information.
+
+**One feature request per issue please!**
+
+#### Questions
+
+If you have any questions, please leave a message in the [XDA XPrivacy thread](http://forum.xda-developers.com/showthread.php?p=42488236).
+More people follow the support thread than the GitHub issue tracker, which increases your chance of receiving a helpful answer.
+Moreover, the answers given might be beneficial to more people than you alone.
+
+**Answering questions on XDA is left to the community.**
+You can read [here](http://forum.xda-developers.com/showpost.php?p=54391559&postcount=10814) why.
+
+For questions about Xposed, please use [the Xposed XDA thread](http://forum.xda-developers.com/xposed).
+
+**Please do not ask questions on GitHub!**
+
+GitHub issues are for bug reports and feature requests.
+
+Changelog
+---------
+
+The changelog is [here](https://github.com/M66B/XPrivacy/blob/master/CHANGELOG.md).
+
+Similar Solutions
+-----------------
+
+* [PDroid](http://forum.xda-developers.com/showthread.php?t=1357056)
+* [PDroid 2.0](http://forum.xda-developers.com/showthread.php?t=1923576)
+* [OpenPDroid](http://forum.xda-developers.com/showthread.php?t=2098156)
+* [LBE Privacy Guard](https://play.google.com/store/apps/details?id=com.lbe.security.lite) (now LBE Security Master)
+* [CyanogenMod Incognito Mode](https://plus.google.com/100275307499530023476/posts/6jzWcRR6hyu) (now Paranoid Android Privacy Guard)
+* [Per App Settings Module](http://forum.xda-developers.com/showthread.php?t=2072081)
+* [Android 4.3+ Permission Manager](http://www.androidpolice.com/2013/07/25/app-ops-android-4-3s-hidden-app-permission-manager-control-permissions-for-individual-apps/)
+* [SRT AppGuard](http://www.srt-appguard.com/en/)
+* [DonkeyGuard](http://forum.xda-developers.com/showthread.php?t=2831556)
+
+The *PDroid* family provides fake or no data, more or less in the same way as XPrivacy does.
+A difference is that you need to patch Android and that there is (therefore) only limited stock ROM support.
+The PDroid family is open source. The *PDroid* family is not supported anymore.
+
+*LBE Privacy Guard* revokes permissions, which will make some applications unusable.
+LBE Privacy Guard also features malware protection and data traffic control.
+Some consider the closed source code of Chinese origin to be a problem.
+
+The members of the PDroid family and XPrivacy hardly use any memory, but LBE Privacy Guard does.
+
+The *CyanogenMod Incognito Mode* seems not to be fine grained and provides only privacy for personal data,
+like contacts, if the associated content provider chooses to do so.
+
+The *Per App Settings Module* revokes permissions like LBE Privacy Guard does.
+This modules offers many other interesting features.
+
+The *Android 4.3+ Permission Manager* is like *CyanogenMod Incognito Mode*.
+
+*SRT AppGuard* does not require root, and therefore revokes permissions by uninstalling the application to be monitored
+and reinstalling a modified version. Without a backup, application data will be lost in this process.
+Compared to XPrivacy, permission control is not as fine grained and comprehensive.
+System applications cannot be restricted.
+
+After over a year of silence, the author of PDroid 2.0 released *DonkeyGuard*.
+*DonkeyGuard* is not open source.
+
+XPrivacy can restrict more data than any of the above solutions,
+even for closed source applications and libraries, like Google Play services.
+Unlike any other solution, XPrivacy has [crowd sourced restrictions](http://crowd.xprivacy.eu/).
+
+I do not recommend using XPrivacy in combination with any of the similar solutions; this could result in conflicts and potential data leaks.
+
+I need all my time developing XPrivacy, so I will not test XPrivacy alongside any of the similar solutions.
+If you test XPrivacy alongside any of the similar solutions, you can probably help others by reporting your test results.
+
+ In The Media
+------------
+
+* [Manage Individual App Permissions with XPrivacy - XDA Developer](http://www.xda-developers.com/android/manage-individual-app-permissions-with-xprivacy/) (June 20, 2013)
+* [XPrivacy Gives You Massive Control Over What Your Installed Apps Are Allowed To Do - Android Police](http://www.androidpolice.com/2013/06/23/xprivacy-gives-you-massive-control-over-what-your-installed-apps-are-allowed-to-do/) (June 23, 2013)
+* [Protect Your Privacy with XPrivacy - XDA Developer TV](http://www.xda-developers.com/android/protect-your-privacy-with-xprivacy-xda-developer-tv/) (July 17, 2013)
+* [Black Duck Announces Open Source Rookies of the Year Winners - Black Duck Software](http://www.blackducksoftware.com/news/releases/black-duck-announces-open-source-rookies-year-winners) (January 28, 2014)
+* [The Open Source Rookies of the Year Awards - InfoWorld](http://www.infoworld.com/d/open-source-software/the-open-source-rookies-of-the-year-awards-235116) (January 28, 2014)
+* [XPrivacy تطبيق](http://waleedhassan.wordpress.com/2014/01/31/xprivacy/) (January 31, 2014)
+* [Out in the Open: How to Protect Your Secrets From Nosey Android Apps - Wired](http://www.wired.com/2014/03/x-privacy/) (March 31, 2014)
+* [Android privacy tool feeds fake data to prying apps - Wired UK](http://www.wired.co.uk/news/archive/2014-04/01/x-privacy-android-app) (April 1, 2014)
+* [Internet Vandaag](http://www.bnr.nl/radio/bnr-internet-vandaag/708487-1404/internet-vandaag-74) (April 7, 2014)
+* [Protecting Your Privacy: App Ops, Privacy Guard, and XPrivacy - XDA Developers](http://www.xda-developers.com/android/protecting-your-privacy-app-ops-privacy-guard-and-xprivacy/) (June 11, 2014)
+* [XPrivacy – Android ohne Google?! Teil6](http://www.kuketz-blog.de/xprivacy-android-ohne-google-teil6/) (September 23, 2014)
+
+Contributing
+------------
+
+Translations:
+
+* Translations to other languages are welcomed
+* Check if the language [is supported by Android](http://stackoverflow.com/questions/7973023/what-is-the-list-of-supported-languages-locales-on-android) and find its locale
+* Copy [this file](https://github.com/M66B/XPrivacy/blob/master/res/values/strings.xml) to the correct locale folder
+* Translate the strings in the copied file and omit all lines with **translatable="false"**
+* Create a [pull request](https://help.github.com/articles/using-pull-requests) for the new/updated translation
+* If you don't know how to create a pull request, you can send the translated file [via XDA PM](http://forum.xda-developers.com/member.php?u=2799345)
+
+Current translations:
+
+1. Bulgarian (bg)
+1. Catalan (ca)
+1. Czech (cs)
+1. Croatian (hr)
+1. Danish (da)
+1. Dutch/Flemish (nl)
+1. English
+1. Estonian (ee)
+1. Farsi (Persian) (fa)
+1. Finnish (fi)
+1. French (fr)
+1. German (de)
+1. Greek (el)
+1. Hebrew (he/iw)
+1. Hindi (hi)
+1. Hungarian (hu)
+1. Indonesian (in)
+1. Irish (ga)
+1. Italian (it)
+1. Japanese (ja)
+1. Korean (ko)
+1. Kurdish (ku-rIR, ku-rIQ)
+1. Lithuanian (lt)
+1. Malay (ms)
+1. Norwegian (nb-rNO, nn-rNO, no-rNO)
+1. Polish (pl)
+1. Portuguese (pt)
+1. Romanian (ro)
+1. Russian (ru)
+1. Serbian (sr)
+1. Simplified Chinese (zh-rCN)
+1. Slovak (sk)
+1. Slovenian (sl)
+1. Spanish (es)
+1. Swedish (sv)
+1. Tagalog (tl-PH)
+1. Traditional Chinese (zh-rTW)
+1. Turkish (tr)
+1. Ukrainian (ua)
+1. Vietnamese (vi)
+1. Welsh (cy-rGB)
+
+Restrict new data:
+
+* Find the package/class/method that exposes the data (look into the Android documentation/sources)
+* Create a class that extends [XHook](https://github.com/M66B/XPrivacy/blob/master/src/biz/bokhorst/xprivacy/XHook.java)
+* Hook the methods in [XPrivacy](https://github.com/M66B/XPrivacy/blob/master/src/biz/bokhorst/xprivacy/XPrivacy.java)
+* Write a before and/or after method to restrict the data
+* Do a [pull request](https://help.github.com/articles/using-pull-requests) if you want to contribute
+
+Using [Eclipse](http://www.eclipse.org):
+
+* Download and install the [ADT Bundle](http://developer.android.com/sdk/index.html)
+* Clone the GitHub project to a temporary location
+* Import the GitHub project into Eclipse, copy the files
+* Close Eclipse and copy the project from the temporary location over the imported project
+ * Make sure you copy all hidden files and folders (especially the .git folders)
+ * This step might not be necessary anymore for recent Eclipse releases
+
+Testing:
+
+* [XPrivacy Tester](https://github.com/M66B/XPrivacyTester) (developers only)
+* [Elixir 2](https://play.google.com/store/apps/details?id=com.bartat.android.elixir)
+* [Network Info II](https://play.google.com/store/apps/details?id=aws.apps.networkInfoIi)
+
+The goal of the XPrivacy project is to provide a free and open source privacy solution for Android to as many as possible people.
+
+To keep XPrivacy maintainable, hooking into private/internal classes and methods is undesirable,
+since these vary considerably in different Android versions
+and are often customized/modified by manufacturers and custom ROM builders.
+
+To prevent applications from crashing, fake data should be returned whenever possible.
+Empty values (*null*) should not be replaced by fake values to prevent misuse.
+The same applies to creating new fake data (for example, an account).
+There is no need to apply restrictions in situations where the user is presented a dialog first (for example, to pick an account).
+Setting data (in contrast to getting data) should never be restricted; this is outside the goal of XPrivacy.
+
+Application-specific code is undesirable, because it could result in maintenance and support problems.
+
+XPrivacy is intended to restrict applications, but is not intended to restrict Android itself
+(although this is often possible as a side effect).
+
+See [here](https://www.openhub.net/p/xprivacy/) for XPrivacy code metrics.
+
+Please note that you agree to the license below by contributing, including the copyright.
+
+License
+-------
+
+[GNU General Public License version 3](http://www.gnu.org/licenses/gpl.txt)
+
+Copyright (c) 2013-2015 Marcel Bokhorst ([M66B](http://forum.xda-developers.com/member.php?u=2799345))
+
+All rights reserved
+
+This file is part of XPrivacy.
+
+XPrivacy is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your discretion) any later version.
+
+XPrivacy is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with XPrivacy. If not, see [http://www.gnu.org/licenses/](http://www.gnu.org/licenses/).
diff --git a/src/XPrivacy-master/XPrivacy-master/SUPPORT.md b/src/XPrivacy-master/XPrivacy-master/SUPPORT.md
new file mode 100644
index 0000000..6ed8dfb
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/SUPPORT.md
@@ -0,0 +1 @@
+Before submitting a new issue, please read the [support section](https://github.com/M66B/XPrivacy#support) first
diff --git a/src/XPrivacy-master/XPrivacy-master/TODO.md b/src/XPrivacy-master/XPrivacy-master/TODO.md
new file mode 100644
index 0000000..5089601
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/TODO.md
@@ -0,0 +1,14 @@
+To do
+=====
+
+For interested developers:
+
+* Accessibility: *android:labelFor="..."*
+* [Open issues](https://github.com/M66B/XPrivacy/issues?state=open)
+* Revoke BLUETOOTH, NFC, USE_SIP
+
+Android source code
+-------------------
+
+git clone https://android.googlesource.com/platform/libcore -b master
+git clone https://android.googlesource.com/platform/frameworks/base -b l-preview
diff --git a/src/XPrivacy-master/XPrivacy-master/XposedBridgeApi-20150213.jar b/src/XPrivacy-master/XPrivacy-master/XposedBridgeApi-20150213.jar
new file mode 100644
index 0000000..2f4458d
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/XposedBridgeApi-20150213.jar differ
diff --git a/src/XPrivacy-master/XPrivacy-master/assets/XPrivacy_public_key.txt b/src/XPrivacy-master/XPrivacy-master/assets/XPrivacy_public_key.txt
new file mode 100644
index 0000000..a73ef31
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/assets/XPrivacy_public_key.txt
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwUTkTUZ/FeRO0IszOPLW
+xN4iABx9zhX34AOntRdcTEhlvh/Iu4WjQRMgPm2JnRj0HEA7WH3FHbqgKjzZghXu
+aV7Lwv6TYTuLKhPPWYDVkFapWE3PjqEei3XDWPl1wUS0eOtscQIR3/Wz/UFHatgS
+lO0jnWa1jBOYNzAC1CoUoj+MF2SQ1IWHcCQve7DjKSiEq8hiQxNqn2+URW1G6hDt
+i/vtXdMIvkzCbKxBePdQBQFEjjwciC42wRy0vsAGzeF2S6KG/ewqplhwqFHa6HUx
+uooPZ92nt4C8U5ZF9HWwGHZ7Ug4/e9x6IuLjeAoRsjprsLf0flWm2Qcjvv3FIZlC
+JQIDAQAB
+-----END PUBLIC KEY-----
diff --git a/src/XPrivacy-master/XPrivacy-master/assets/xposed_init b/src/XPrivacy-master/XPrivacy-master/assets/xposed_init
new file mode 100644
index 0000000..d100c48
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/assets/xposed_init
@@ -0,0 +1 @@
+biz.bokhorst.xprivacy.XPrivacy
diff --git a/src/XPrivacy-master/XPrivacy-master/ic_launcher-promo-big.png b/src/XPrivacy-master/XPrivacy-master/ic_launcher-promo-big.png
new file mode 100644
index 0000000..bf5fdad
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/ic_launcher-promo-big.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/ic_launcher-promo.png b/src/XPrivacy-master/XPrivacy-master/ic_launcher-promo.png
new file mode 100644
index 0000000..3592d1e
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/ic_launcher-promo.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/ic_launcher-web.png b/src/XPrivacy-master/XPrivacy-master/ic_launcher-web.png
new file mode 100644
index 0000000..4f2ff45
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/ic_launcher-web.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/lint.xml b/src/XPrivacy-master/XPrivacy-master/lint.xml
new file mode 100644
index 0000000..bd12520
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/lint.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/proguard-project.txt b/src/XPrivacy-master/XPrivacy-master/proguard-project.txt
new file mode 100644
index 0000000..7215808
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/proguard-project.txt
@@ -0,0 +1,32 @@
+# To enable ProGuard in your project, edit project.properties
+# to define the proguard.config property as described in that file.
+#
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${sdk.dir}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the ProGuard
+# include property in project.properties.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+#Line numbers
+-renamesourcefileattribute SourceFile
+-keepattributes SourceFile,LineNumberTable
+
+#Xposed
+-libraryjars XposedBridgeApi-20150213.jar
+
+#XPrivacy
+-keep class biz.bokhorst.xprivacy.XPrivacy {*; }
+-keepnames class biz.bokhorst.xprivacy.X* { }
+-keepclassmembers class biz.bokhorst.xprivacy.Util { public static boolean isXposedEnabled(); }
diff --git a/src/XPrivacy-master/XPrivacy-master/project.properties b/src/XPrivacy-master/XPrivacy-master/project.properties
new file mode 100644
index 0000000..ac8b8df
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/project.properties
@@ -0,0 +1,17 @@
+# This file is automatically generated by Android Tools.
+# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
+#
+# This file must be checked in Version Control Systems.
+#
+# To customize properties used by the Ant build system edit
+# "ant.properties", and override values to adapt the script to your
+# project structure.
+#
+# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
+proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
+
+# Project target.
+target=android-22
+android.library=false
+android.library.reference.1=../../sdk/extras/android/support/v7/appcompat
+android.library.reference.2=../../sdk/extras/android/support/v7/cardview
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/ic_arrow.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/ic_arrow.png
new file mode 100644
index 0000000..defc5ea
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/ic_arrow.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/ic_launcher.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/ic_launcher.png
new file mode 100644
index 0000000..218b724
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/ic_launcher.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/icon_filter.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/icon_filter.png
new file mode 100644
index 0000000..3e225b2
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/icon_filter.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/icon_sort.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/icon_sort.png
new file mode 100644
index 0000000..f0c1bee
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-hdpi/icon_sort.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-ldpi/ic_launcher.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-ldpi/ic_launcher.png
new file mode 100644
index 0000000..37f3169
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-ldpi/ic_launcher.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/ic_launcher.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/ic_launcher.png
new file mode 100644
index 0000000..920c488
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/ic_launcher.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/icon_filter.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/icon_filter.png
new file mode 100644
index 0000000..8fff420
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/icon_filter.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/icon_sort.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/icon_sort.png
new file mode 100644
index 0000000..a8dbd95
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-mdpi/icon_sort.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/card_light.9.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/card_light.9.png
new file mode 100644
index 0000000..1d35088
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/card_light.9.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/checkmark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/checkmark.png
new file mode 100644
index 0000000..f051cd1
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/checkmark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/checkmark_outline.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/checkmark_outline.png
new file mode 100644
index 0000000..517cc80
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/checkmark_outline.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/questionmark_outline.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/questionmark_outline.png
new file mode 100644
index 0000000..66434f4
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-nodpi/questionmark_outline.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/ic_arrow.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/ic_arrow.png
new file mode 100644
index 0000000..4d619f1
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/ic_arrow.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/ic_launcher.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..f92752a
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/ic_launcher.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/icon_filter.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/icon_filter.png
new file mode 100644
index 0000000..ec9947d
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/icon_filter.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/icon_sort.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/icon_sort.png
new file mode 100644
index 0000000..700b976
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-xhdpi/icon_sort.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/ic_launcher.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..e6b2138
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/ic_launcher.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/icon_filter.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/icon_filter.png
new file mode 100644
index 0000000..6c067c0
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/icon_filter.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/icon_sort.png b/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/icon_sort.png
new file mode 100644
index 0000000..fed4086
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable-xxhdpi/icon_sort.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/apps.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/apps.png
new file mode 100644
index 0000000..59c0cab
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/apps.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/btn_check_buttonless_on.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/btn_check_buttonless_on.png
new file mode 100644
index 0000000..348a264
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/btn_check_buttonless_on.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/check_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/check_holo_dark.png
new file mode 100644
index 0000000..d8bd5d6
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/check_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/check_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/check_holo_light.png
new file mode 100644
index 0000000..9fc4011
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/check_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_maximized_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_maximized_holo_dark.png
new file mode 100644
index 0000000..ca78f2e
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_maximized_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_maximized_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_maximized_holo_light.png
new file mode 100644
index 0000000..bd405ba
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_maximized_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_minimized_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_minimized_holo_dark.png
new file mode 100644
index 0000000..1676b10
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_minimized_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_minimized_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_minimized_holo_light.png
new file mode 100644
index 0000000..8225e74
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/expander_ic_minimized_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/frozen_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/frozen_holo_dark.png
new file mode 100644
index 0000000..4393f35
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/frozen_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/frozen_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/frozen_holo_light.png
new file mode 100644
index 0000000..f1e453e
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/frozen_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/granted_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/granted_holo_dark.png
new file mode 100644
index 0000000..a3dc0a4
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/granted_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/granted_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/granted_holo_light.png
new file mode 100644
index 0000000..596673a
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/granted_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/indicator_input_error.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/indicator_input_error.png
new file mode 100644
index 0000000..b5a6eaf
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/indicator_input_error.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/info_book_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_book_holo_dark.png
new file mode 100644
index 0000000..a619ce9
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_book_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/info_book_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_book_holo_light.png
new file mode 100644
index 0000000..ca6e2f4
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_book_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/info_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_holo_dark.png
new file mode 100644
index 0000000..7d7ab06
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/info_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_holo_light.png
new file mode 100644
index 0000000..ebc34f4
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/info_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/internet_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/internet_holo_dark.png
new file mode 100644
index 0000000..1a100d3
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/internet_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/internet_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/internet_holo_light.png
new file mode 100644
index 0000000..5a1ee82
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/internet_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/list_item_pressed_dark.xml b/src/XPrivacy-master/XPrivacy-master/res/drawable/list_item_pressed_dark.xml
new file mode 100644
index 0000000..7e7ea62
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/drawable/list_item_pressed_dark.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/list_item_pressed_light.xml b/src/XPrivacy-master/XPrivacy-master/res/drawable/list_item_pressed_light.xml
new file mode 100644
index 0000000..17cf539
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/drawable/list_item_pressed_light.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/ondemand.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/ondemand.png
new file mode 100644
index 0000000..0cbc483
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/ondemand.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/padlock_question_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/padlock_question_dark.png
new file mode 100644
index 0000000..bbdcf54
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/padlock_question_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/padlock_question_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/padlock_question_light.png
new file mode 100644
index 0000000..b5b02db
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/padlock_question_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/presence_busy.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/presence_busy.png
new file mode 100644
index 0000000..391d1c9
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/presence_busy.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/progress_horizontal_dark.xml b/src/XPrivacy-master/XPrivacy-master/res/drawable/progress_horizontal_dark.xml
new file mode 100644
index 0000000..080d74e
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/drawable/progress_horizontal_dark.xml
@@ -0,0 +1,34 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/progress_horizontal_light.xml b/src/XPrivacy-master/XPrivacy-master/res/drawable/progress_horizontal_light.xml
new file mode 100644
index 0000000..bbe839d
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/drawable/progress_horizontal_light.xml
@@ -0,0 +1,34 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/system_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/system_holo_dark.png
new file mode 100644
index 0000000..f8ba4b8
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/system_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/system_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/system_holo_light.png
new file mode 100644
index 0000000..fd6316c
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/system_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/tutorial_background_dark.xml b/src/XPrivacy-master/XPrivacy-master/res/drawable/tutorial_background_dark.xml
new file mode 100644
index 0000000..b53f0a2
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/drawable/tutorial_background_dark.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/tutorial_background_light.xml b/src/XPrivacy-master/XPrivacy-master/res/drawable/tutorial_background_light.xml
new file mode 100644
index 0000000..9ffccfb
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/drawable/tutorial_background_light.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_dark.png
new file mode 100644
index 0000000..50a00a0
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_dark_grayed.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_dark_grayed.png
new file mode 100644
index 0000000..e87b7e0
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_dark_grayed.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_light.png
new file mode 100644
index 0000000..d6a8052
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_light_grayed.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_light_grayed.png
new file mode 100644
index 0000000..4421702
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/used_holo_light_grayed.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/whitelist_holo_dark.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/whitelist_holo_dark.png
new file mode 100644
index 0000000..40200af
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/whitelist_holo_dark.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/drawable/whitelist_holo_light.png b/src/XPrivacy-master/XPrivacy-master/res/drawable/whitelist_holo_light.png
new file mode 100644
index 0000000..0c13bb7
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/res/drawable/whitelist_holo_light.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/about.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/about.xml
new file mode 100644
index 0000000..1a854aa
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/about.xml
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/filters.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/filters.xml
new file mode 100644
index 0000000..581c00e
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/filters.xml
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/helpcat.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/helpcat.xml
new file mode 100644
index 0000000..80eb5da
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/helpcat.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/helpfunc.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/helpfunc.xml
new file mode 100644
index 0000000..836e1bd
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/helpfunc.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/legend.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/legend.xml
new file mode 100644
index 0000000..949a5e8
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/legend.xml
@@ -0,0 +1,381 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/mainentry.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/mainentry.xml
new file mode 100644
index 0000000..d4b3494
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/mainentry.xml
@@ -0,0 +1,132 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/mainlist.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/mainlist.xml
new file mode 100644
index 0000000..6e95558
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/mainlist.xml
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/ondemand.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/ondemand.xml
new file mode 100644
index 0000000..8fcf455
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/ondemand.xml
@@ -0,0 +1,382 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/reboot.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/reboot.xml
new file mode 100644
index 0000000..e8c069f
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/reboot.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/register.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/register.xml
new file mode 100644
index 0000000..d64560d
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/register.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionchild.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionchild.xml
new file mode 100644
index 0000000..b7e4b69
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionchild.xml
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionentry.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionentry.xml
new file mode 100644
index 0000000..5e6659b
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionentry.xml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionlist.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionlist.xml
new file mode 100644
index 0000000..2c78751
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/restrictionlist.xml
@@ -0,0 +1,260 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/settings.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/settings.xml
new file mode 100644
index 0000000..28f3a3b
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/settings.xml
@@ -0,0 +1,621 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/shareentry.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/shareentry.xml
new file mode 100644
index 0000000..0be5475
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/shareentry.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/sharelist.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/sharelist.xml
new file mode 100644
index 0000000..7d09278
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/sharelist.xml
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/sort.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/sort.xml
new file mode 100644
index 0000000..b1c1f1d
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/sort.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/template.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/template.xml
new file mode 100644
index 0000000..34d9197
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/template.xml
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/templateentry.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/templateentry.xml
new file mode 100644
index 0000000..a79f40b
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/templateentry.xml
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/usage.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/usage.xml
new file mode 100644
index 0000000..64fc0c9
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/usage.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/usageentry.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/usageentry.xml
new file mode 100644
index 0000000..bf255e2
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/usageentry.xml
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/usagelist.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/usagelist.xml
new file mode 100644
index 0000000..85e01f6
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/usagelist.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/whitelistentry.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/whitelistentry.xml
new file mode 100644
index 0000000..67c9201
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/whitelistentry.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/layout/whitelists.xml b/src/XPrivacy-master/XPrivacy-master/res/layout/whitelists.xml
new file mode 100644
index 0000000..6acb413
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/layout/whitelists.xml
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/menu/app.xml b/src/XPrivacy-master/XPrivacy-master/res/menu/app.xml
new file mode 100644
index 0000000..6a11a0f
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/menu/app.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+ -
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/menu/main.xml b/src/XPrivacy-master/XPrivacy-master/res/menu/main.xml
new file mode 100644
index 0000000..cdd719d
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/menu/main.xml
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/menu/settings.xml b/src/XPrivacy-master/XPrivacy-master/res/menu/settings.xml
new file mode 100644
index 0000000..f4ae9ce
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/menu/settings.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/menu/usage.xml b/src/XPrivacy-master/XPrivacy-master/res/menu/usage.xml
new file mode 100644
index 0000000..80a3359
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/menu/usage.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ar/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ar/strings.xml
new file mode 100644
index 0000000..c4ed111
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ar/strings.xml
@@ -0,0 +1,256 @@
+
+
+ لم يتم تفعيل XPrivacy
+ فقط لأندرويد نسخة 4.0.3+
+ XPrivacy غير متوافق مع %s
+ نسخة XPrivacy\u200F : %s (%d)
+ مدير الخصوصية الرئيسي
+ حقوق الطبع \u00A9 2013–2015 ل M. Bokhorst (M66B)\u200E
+ يعمل في وضع التوافق
+ الترخيص موجود، شكرا لدعمكم!
+ الإستخدام
+ إنعاش
+ الإعدادات
+ القالب
+ التبليغ عن مشكلة
+ تصدير
+ إستيراد
+ إرسال القيود
+ جلب القيود
+ تبديل الوضع
+ النسخة الكاملة
+ عن التطبيق
+ مساعدة
+ إختر الكل
+ ترتيب
+ فلتر
+ تحديد الكل
+ تبديل القيود
+ مسح الكل
+ إزالة
+ مسح جميع البيانات
+ تغيير الفلتر
+ تطبيق القالب
+ إلغاء التحديد
+ تشغيل التطبيق
+ إعدادات التطبيق
+ متجر قوقل
+ إغلاق
+ إختر التطبيقات التي تود تمكينها
+ إختر الحسابات التي تود تمكينها
+ إختر الأسماء التي تود تمكينها
+ إدارة القوائم البيضاء
+ تعليمي
+ Changelog
+ مسح ذاكرة التخزين المؤقت
+ فحص التحديثات
+ العمليات …
+ Legend
+ إيقاف
+ تم الإيقاف
+ جديد
+ تحديث
+ جاري التحميل
+ تطبيق
+ تم تطبيق القالب
+ حُفِظت في %s
+ لا توجد قيود
+ هل أنت متأكد ؟
+ فضلاَ إختر بعض التطبيقات
+ الرجاء إختر تطبيقات أقل من %d
+ إنتهى
+ يحتاج إعادة تشغيل
+ عشوائي
+ عشوائية الوصول
+ عشوائي بعد الإقلاع
+ التطبيق يتطلب إعادة التشغيل
+ الرجاء قم بتسجيل جهازك
+ الرجاء أدخل عنوان بريدك الإلكتروني:
+ إفحص بريدك الإلكتروني لتفعيل جهازك
+ تحديث الخدمة قيد التشغيل
+ ترحيل %s
+ عشوائية %s
+ ترقية %s
+ فشل الفحص الداخلي, هل تريد إرسال معلومات الدعم؟
+ تم التقييد بواسطة XPrivacy
+ لم يتم العثور على خدمة الخصوصية; هل قمت بتمكين XPrivacy في مثبت إكسبوسيد وقمت بإعادة تشغيل جهازك ؟
+ عدم تطابق إصدار خدمة الخصوصية؛ هل يمكنك إعادة تشغيل الجهاز بعد ترقية إكسبريفاسي؟
+ يرجى الانتظار حتى يتم الانتهاء من خدمة التحديث
+ المستخدمين الخبراء من المفترض أن يستطيعوا حل مشاكلهم الخاصة حيثما كان ذلك ممكناً ومتابعة موضوع إكسبرايفاسي على منتدي إكس دي ايه ومساعدة الآخرين متى ما كان ذلك ممكناً
+ المقصود من تقييد الوظائف هم المستخدمين الخبراء. هل أنت مستخدم خبير؟
+ الضغط لمدة طويلة على إسم الوظيفة لقيم القائمة البيضاء أو القائمة السوداء
+ علامات الإختيار والقيم تأخذ أسبقية على علامات الإختيار العامة وقيمتها; خانات الإختيار الفارغة وقيمها لا تأخذ أسبقية
+ The privacy database was reset, because it was corrupt
+ بُذلت عناية كبيرة لتطوير وإختبار XPrivacy,
+ومع ذلك فإنه من المستحيل ضمان أنه سيعمل خالياً من العيوب على كل جهاز ولكل تطبيق.
+\n\nالإستخدام على مسئوليتك الخاصة. \n\nراجع أيضاً الترخيص:
+ الحسابات (قوقل , فيسبوك , الخ)
+ المتصفح (العلامات,السجل)
+ التقويم
+ المكالمات (الهاتف,الرسائل النصية,رسائل الوسائط)
+ الحافظة
+ الأسماء
+ القاموس (المستخدم)
+ البريد الإلكتروني
+ الهوية (الجهاز)
+ الإنترنت
+ تحديد الموقع(دقيق,تقريبي)
+ الميديا (صوت,صورة,فيديو)
+ الرسائل (النصية , الوسائط)
+ الشبكة (العناوين)
+ الإشعارات
+ غشاء
+ الهاتف (المعرف,الأرقام,المكالمات)
+ الحساسات
+ التخزين (الميديا’الذاكرة الخارجية)
+ سطر الأوامر (الأوامر,المستخدم الجذر)
+ النظام (البرامج المنزلة)
+ تصفح (المتصفح)
+ سيتم تقييد الوصول إلى عرض الإجراءات والمعلومات
+ سيتم تقييد الوصول إلى معلومات النظام, مثل التطبيقات المثبتة
+ سيتم تقييد الوصول إلى أوامر شل, بما في ذلك أوامر المستخدم السوبر
+ سيتم تقييد الوصول إلى التخزين، مثل الملفات على بطاقة SD أو وحدة التخزين الداخلية
+ سيتم تقييد الوصول إلى أجهزة الاستشعار، مثل استشعار الحركة
+ سيتم تقييد الوصول إلى معلومات الهاتف، مثل رقم الهاتف الخاص بك
+ سيتم تقييد تراكب النوافذ لمنع الإحتيال
+ سيتم تقييد الوصول إلى النظام وإخطارات التطبيقات ومراسلات سحابة قوقل
+ سيتم تقييد الوصول إلى تقنية التواصل قريب المدى
+ سيتم تقييد الوصول إلى معلومات الشبكة, مثل عناوين الآي بي وعنوان الماك ومعلومات الشبكات اللاسلكية
+ سيتم تقييد الوصول إلى الرسائل المخزنة والمستلمة (الرسائل القصيرة/رسائل الوسائط) والبريد الصوتي
+ سيتم تقييد الوصول إلى الكاميرا (الصور وأشرطة الفيديو) والميكروفون
+ سيتم تقييد الوصول إلى موقعك الدقيق والتقريبي
+ سيتم تقييد الاتصالات بين العمليات، عندما تستخدم للتحايل على القيود الأخرى
+ سيتم تقييد الوصول إلى الإنترنت
+ سيتم تقييد المعلومات التي تمكن من التعرّف عليك, مثل الرقم التسلسلي للجهاز الخاص بك
+ سيتم تقييد الوصول إلى معلومات البريد الإلكتروني, مثل العناوين والرسائل(التطبيقات القياسية وجي ميل فقط)
+ سيتم تقييد الوصول إلى قاموس المستخدم
+ سيتم تقييد الوصول إلى معلومات حول جهات الاتصال الخاصة بك
+ سيتم تقييد الوصول إلى المعلومات في الحافظة
+ سيتم تقييد الإتصال بأرقام الهاتف، إرسال الرسائل (الرسائل القصيرة ورسائل الوسائط المتعددة)، والوصول إلى تواريخ المكالمات الخاص بك
+ سيتم تقييد الوصول إلى معلومات التقويم الخاص بك، مثل المواعيد الخاصة بك
+ سيتم تقييد الوصول إلى معلومات المتصفح، مثل الإشارات المرجعية الخاصة بك وتاريخ التنزيل
+ سيتم تقييد الوصول إلى معلومات الحساب، مثل حساب Google الخاص بك، الذي يتضمن عنوان بريد جي ميل الخاص بك
+ عناوين
+ الحدث
+ عناوين الآيبي
+ المكتبات الأصلية
+ أسماء الأسلوب
+ أسماء الملفات
+ أوامر شل
+ عناوين URL
+ المعاملات
+ أذونات
+ إختر للتقيد:
+ إختر للتمكين:
+ التصفية حسب استخدام البيانات
+ التصفية حسب الوصول للإنترنت
+ التصفية حسب الأُذونات
+ التصفية حسب التقييد
+ تصفية برامج المستخدم
+ تصفية حسب الطلب
+ تصفية برامج النظام
+ العكس
+ بالإسم
+ بواسطة UID
+ بواسطة تاريخ التثبيت
+ بواسطة تاريخ التحديث
+ بواسطة تاريخ التعديل (XPrivacy)
+ بالدولة (XPrivacy)
+ عكس ترتيب الفرز
+ محاولة استخدام:
+ فئة:
+ وظيفة:
+ مدخلات:
+ تطبيق على الفئة بأكملها
+ لمرة واحدة فقط
+ القائمة البيضاء \'%s\'
+ تمكين
+ منع
+ لا أعرف
+ الرجاء إرسال القيود لمساعدة الآخرين
+ الأذونات
+ تقييد
+ تطبيق القالب (الفئات)
+ تطبيق القالب (الفئات+الوظائف)
+ تطبيق القالب (دمج مجموعة)
+ تطبيق القالب (إعادة الدمج)
+ تمكين التقييد عند الطلب
+ تعطيل التقييد عند الطلب
+ المهلة سوف:
+ إعادة تعيين
+ الافتراضي
+ البديل
+ إعادة تسمية
+ الاستخدام
+ 1. أعثر على التطبيق في قائمة التطبيقات الرئيسية لتقييده
+ 2. اضغط على أيقونة التطبيق
+ 3. انقر فوق خانة الاختيار الأولى لأي فئة تريد تقييدها
+ إستخدم الحس السليم عند التقييد، ولا تتوقع الوصول إلى الإنترنت إذا كانت مقيدة في فئة إنترنت، إلخ.
+ الضغط لمدة طويلة على العنوان لتبديل المهام الخطرة
+ بتطبيقك للفئة سيتم إعادة تعيين إستثناءات الدالة إلى القيم الإفتراضية
+ وثائق الوظائف
+ غير آمنة، يمكن التحايل عليها
+ جاري التحقق من وجود التحديث
+ جاري تحميل التحديث
+ انقر لتثبيت التحديث
+ لا توجد تحديثات متوفرة
+ إكسبريفاسي2 غير مدعومة بعد الآن، يرجى النظر في الترقية إلى إكسبريفاسي3
+ أصلي
+ السيريال#
+ خط العرض
+ خط الطول
+ الإرتفاع
+ عنوان الماك
+ عنوان الايبي
+ رقم الهاتف
+ هوية اندرويد
+ رقم تعريف الإعلان
+ الدولة
+ المُشغل
+ IMSI(الهوية العالمية لمشتركي الهواتف)
+ وكيل المستخدم
+ عام
+ بيانات وهمية
+ تحديث الإشعارات
+ تقييد عند الطلب
+ القائمة السوداء للحسابات, التطبيقات وجهات الإتصال
+ سِجِل تصحيح الأخطاء (يتطلب إعادة التشغيل)
+ وضع الخبراء
+ الحد الأقصى لجلب فترة الثقة
+ وظائف تجريبية
+ إستخدم الإتصال الآمن
+ تقييد مكونات نظام (أندرويد) (يتطلب إعادة التشغيل)
+ إظهار بيانات استخدام التطبيق (يتطلب إعادة التشغيل)
+ إظهار الباراميترات لبيانات الإستخدام
+ عرض قيم بيانات الاستخدام
+ معرف الخليوي جي إس أم
+ GSM LAC
+ المراوغات
+ وضع AOSP (يتطلب إعادة التشغيل)
+ خانة الاختيار الأولى: تقييد فئة أو دالة
+ خانة الاختيار الثاني: تقييد عند الطلب
+ تشغيل/إيقاف التبديل: تمكين أو تعطيل جميع القيود
+ ضغطة طويلة في الإسم لتحديده
+ سوف يتم السؤال عن القيود
+ التطبيق
+ لديه صلاحية الوصول للإنترنت
+ لديه صلاحية أندرويد
+ يستخدم هذه البيانات
+ لا توجد بيانات إستخدام متاحة
+ مُعطل
+ خطير
+ تقييد جزئي
+ قيود تحتاج لعناية
+ القيود التي تم تغييرها
+ القيود تم تسجيلها
+ لديه قيم وهمية للتطبيق المعين
+ إختر الفئة لتقييدها
+ إلمس مربع الإختيار لتقييد الفئة المحددة للتطبيق\n
+\nوسوف يتم إعطاء بيانات فارغة أو وهمية للفئات المقيدة\n
+\nإلمس ايقونة التطبيق لتفاصيل القيود والإعدادات
+ انقر على أيقونة التطبيق لمزيد من الإجراءات
+ انقر على السهم المتجه لأسفل لرؤية الوظائف الإستثنائية في الفئة المُقيدة
+ إدارة التطبيقات, متضمناَ الإغلاق
+ إدارة إعدادات وقيود إكسبريفاسي
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-bg/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-bg/strings.xml
new file mode 100644
index 0000000..3c9f94d
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-bg/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy не е включено в инсталатора на Xposed
+ Приложението е само за Android 4.0.3+
+ XPrivacy is incompatible with %s
+ XPrivacy версия: %s (%d)
+ The ultimate privacy manager
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Използване
+ Опресняване
+ Настройки
+ Шаблони
+ Съобщаване за проблем
+ Експортиране
+ Импортиране
+ Submit restrictions
+ Fetch restrictions
+ Смяна на темата
+ Професионална версия
+ Относно
+ Help …
+ Select all
+ Sort
+ Filter
+ Всички
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ Clear
+ Пусни
+ Настройки
+ Google Play магазин
+ Kill
+ Изберете сметки с позволение
+ Select applications to allow
+ Изберете контакти с позволение
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ Зареждане
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ Сигурни ли сте?
+ Please select some applications
+ Please select fewer than %d applications
+ Готово
+ Нужно е рестартиране
+ Randomize
+ Randomize on access
+ Randomize after boot
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ XPrivacy е разработен и тестван с голямо внимание,
+но е невъзможно да се гарантира безпроблемна работа на всякакви устройства при всякакви приложения.
+\n\nИзползвате го на свой собствен риск. \n\nВижте и лиценза:
+ Сметки (Google, Facebook и т.н.)
+ Браузър (отметки/история)
+ Календар
+ Обаждания, SMS, MMS
+ Clipboard
+ Контакти
+ Речник на потребителя
+ E-mail
+ Идентификация (устройство)
+ Интернет
+ Местоположение (точно/приблизително)
+ Медия (аудио, снимки, клипове)
+ Съобщения (SMS, MMS)
+ Мрежа (адреси)
+ Notifications
+ Overlay
+ Телефон (ID, номера, обаждания)
+ Sensors
+ Съхранение (носители, SD карта)
+ Терминал (команди, суперпотребител)
+ Система (инсталирани приложения)
+ Преглед (браузър)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Отбележи за ограничаване:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serial#
+ Геогр. ширина
+ Геогр. дължина
+ Altitude
+ MAC адрес
+ IP address
+ Телефонен номер
+ Android ID
+ Advertisement ID
+ Държава
+ Operator
+ Абонатно ID
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Приложение
+ има разрешение за интернет
+ има разрешение в Android
+ използвало е тези данни
+ no usage data available
+ е деактивирано
+ е опасно
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ca/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ca/strings.xml
new file mode 100644
index 0000000..d6038b1
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ca/strings.xml
@@ -0,0 +1,254 @@
+
+
+ XPrivacy no està habilitat a l\'instal·lador d\'Xposed
+ Només per a Android versió 4.0.3+
+ XPrivacy és incompatible amb %s
+ Versió d\'XPrivacy: %s (%d)
+ El gestor de privacitat definitiu
+ Copyright \u00A9 2013–2015 per M. Bokhorst (M66B)
+ Corrent en mode de compatibilitat
+ Llicenciat, gràcies pel teu suport!
+ Usos
+ Refresca
+ Configuració
+ Plantilla
+ Informa d\'un problema
+ Exporta
+ Importa
+ Envia restriccions
+ Recull restriccions
+ Canvia tema
+ Versió Pro
+ Quant a
+ Ajuda
+ Sel·leccionar tots
+ Ordenar
+ Filtrar
+ Totes
+ Alternar restrictions
+ Borrar totes
+ Borrar
+ Borrar totes les dades
+ Alternar filtre
+ Aplica plantilla
+ Neteja
+ Executa
+ Configuració
+ Play Store
+ Matar
+ Selecciona comptes a permetre
+ Selecciona aplicacions a permetre
+ Selecciona contactes a permetre
+ Gestionar llistes blanques
+ Tutorial
+ Llistat de canvis
+ Buidar memoria cau
+ Buscar actualitzacions
+ Operacions …
+ LLegenda
+ Abortant
+ Abortat
+ Nou
+ Actualitza
+ Carregant
+ Aplicant
+ Plantilla aplicada
+ Desat a %s
+ No s\'han trobat restriccions
+ Esteu segur?
+ Si us plau, sel·leccioneu algunes aplicacions
+ Si us plau, sel·leccioneu menys de %d aplicacions
+ Fet
+ Cal reiniciar
+ Genera aleatòriament
+ Aleatoritzar en cada accés
+ Genera aleatòriament després d\'arrencar
+ És necessari reiniciar l\'aplicació
+ Si us plau, registra el teu dispositiu
+ Si us plau, entra la teva adreça de correu electrònic
+ Comprova el teu correu electronic per a activar el teu dispositiu
+ Servei d\'actualització en execució
+ Migrant a %s
+ Aleatoritzant %s
+ Actualitzant %s
+ Una comprovació interna ha fallat, desitjes enviar la informació de suport?
+ Restringit per XPrivacy
+ Servei de privacitat no trobat; has habilitat XPrivacy a l\'instaŀlador de Xposed i reiniciat el dispositiu?
+ Discrepancia a la versió del servei de privacitat; has reiniciat el dispositiu després d\'actualitzar XPrivacy?
+ Si us plau esperi a que el servei d\'actualització hagi completat
+ Els usuaris experts haurien de ser capaços de solventar els seus propis problemes quan possible i seguir el forum de XPrivacy a XDA i ajudar a d\'altres quan sigui possible
+ Les restriccions de funció estàn pensades per a usuaris experts. Ets un usuari expert?
+ Fés pulsació llarga al nom de la funció per a posar a la llista blanca/negra
+ Les marques de verificació i valors tenen precedència sobre marques de verificació i valors globals; les marques de verificació buides no tenen precedencia
+ La base de dades de privacitat ha sigut borrada perqué era corrupte
+ S\'ha tingut molta cura desenvolupant i provant XPrivacy, però és impossible garantir que funcionarà perfectament a tots els dispositius i per a totes les aplicacions.\n\nUtilitzeu-lo sota el vostre propi risc. \n\nVegeu també la llicència:
+ Comptes (Google, Facebook, etc.)
+ Navegador (marcadors/historial)
+ Calendari
+ Trucades (telèfon, SMS, MMS)
+ Porta-retalls
+ Contactes
+ Diccionari (usuari)
+ E-mail
+ Identificació (dispositiu)
+ Internet
+ Ubicació (precisa/aproximada)
+ Mitjans (àudio, imatges, vídeos)
+ Missatges (SMS, MMS)
+ Xarxa (adreces)
+ Notificacions
+ Superposició
+ Telèfon (ID, números, trucades)
+ Sensors
+ Emmagatzematge (mitjans, targeta SD)
+ Intèrpret d\'ordres (ordres, superusuari)
+ Sistema (aplicacions instal·lades)
+ Vista (navegador)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Activa per a restringir:
+ Check to allow:
+ Filtra per ús de dades
+ Filtra per accés a Internet
+ Filtra per permís
+ Filtra per restringit
+ Filtra per aplicacions d\'usuari
+ Filter by on-demand
+ Filtra per aplicacions de sistema
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Número de sèrie
+ Latitud
+ Longitud
+ Altitude
+ Adreça MAC
+ IP address
+ Número de telèfon
+ ID d\'Android
+ Advertisement ID
+ País
+ Operador
+ ID de subscriptor
+ Agent d\'usuari
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Registre de depuració (cal reiniciar)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Aplicació
+ té permís d\'Internet
+ té permisos d\'Android
+ ha utilitzat aquesta informació
+ no usage data available
+ està desactivat
+ és perillós
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-cs/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-cs/strings.xml
new file mode 100644
index 0000000..d835c86
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-cs/strings.xml
@@ -0,0 +1,257 @@
+
+
+
+ Není povolen modul XPrivacy v Xposed installeru
+ Pouze pro Android verze 4.0.3+
+ XPrivacy není kompatibilní s %s
+ Verze XPrivacy: %s (%d)
+ Ultimátní správce soukromí
+ Autorská práva © 2013–2015: M. Bokhorst (M66B)
+ Spuštěno v režimu kompatibility
+ Licencováno, děkujeme za vaši podporu!
+ Využití
+ Obnovit
+ Nastavení
+ Šablona
+ Nahlásit problém
+ Export
+ Import
+ Odeslat omezení
+ Stáhnout omezení
+ Změnit téma
+ Pro verze
+ O aplikaci
+ Nápověda
+ Vybrat vše
+ Seřadit
+ Filtr
+ Vše
+ Přepnout omezení
+ Vymazat vše
+ Vymazat
+ Vymazat všechny údaje
+ Přepnout filtr
+ Použít šablonu
+ Vymazat
+ Spustit
+ Informace o aplikaci
+ Obchod Play
+ Ukončit
+ Povolené účty aplikace
+ Povolený přístup k aplikacím
+ Povolené kontakty aplikace
+ Spravovat whitelists
+ Příručka
+ Seznam změn
+ Vymazat cache
+ Zkontrolovat aktualizace
+ Operace …
+ Legenda
+ Probíha přerušení
+ Přerušeno
+ Nové
+ Aktualizované
+ Probíhá načítání
+ Probíhá aplikování
+ Šablona aplikována
+ Uloženo do %s
+ Nebyla nalezena žádná omezení
+ Jste si jistý?
+ Vyberte prosím některé aplikace
+ Vyberte prosím méně než %d aplikací
+ Hotovo
+ Vyžadován restart zařízení
+ Náhodné hodnoty
+ Generovat náhodné hodnoty při přístupu
+ Generovat náhodné hodnoty při spuštění zařízení
+ Vyžadován restart aplikace
+ Zaregistrujte prosím vaše zařízení
+ Zadejte prosím, vaši e-mailovou adresu:
+ Zkontrolujte váš e-mail pro aktivaci vašeho zařízení
+ Aktualizační služba je spuštěna
+ Probíhá migrace %s
+ Probíhá generování náhodných hodnot %s
+ Probíhá aktualizace %s
+ Vnitřní kontrola selhala, přejete si odeslat informace na podporu?
+ Omezeno pomocí XPrivacy
+ Nenalezena služba soukromí; povolili jste XPrivacy v Xposed Installeru a provedli restart vašeho zařízení?
+ Verze služby soukromí se neshoduje; provedli jste restart vašeho zařízení po aktualizaci XPrivacy?
+ Prosím, počkejte, dokud nebude dokončena aktualizační služba
+ Zkušení uživatelé dokáží vyřešit své problémy ve většině případů a následovat téma XPrivacy na XDA fóru a pomáhat ostatním, pokud je to možné
+ Omezení funkcí jsou určeny pro zkušené uživatele. Jste zkušený uživatel?
+ Dlouze stiskněte název funkce pro umístění parametru na white nebo black list
+ Zaškrtávací pole a hodnoty mají přednost před globálními zaškrtávacími poli a hodnotami; prázdné zaškrtávací pole a hodnoty nemají přednost
+ Soukromá databáze se obnovila, protože byla poškozena
+ "Vývoj a testování aplikace XPrivacy probíhaly s maximální možnou péčí, nicméně je nemožné zaručit bezchybnou funkčnost na všech zařízeních a se všemi aplikacemi.\n
+\nPoužívejte pouze na vlastní riziko." "\n
+\nLicence aplikace:"
+ Účty (Google, Facebook, atd.)
+ Prohlížeč (záložky/historie)
+ Kalendář
+ Volání (telefon, SMS, MMS)
+ Schránka
+ Kontakty
+ Slovník (uživatele)
+ E-mail
+ Identifikace (zařízení)
+ Internet
+ Poloha (přesná/přibližná)
+ Média (hudba, fotky, videa)
+ Zprávy (SMS, MMS)
+ Síť (adresace)
+ Upozornění
+ Překrytí
+ Telefon (ID, čísla, hovory)
+ Senzory
+ Úložiště (média, SD karta)
+ Konzole (příkazy, superuser)
+ Systém (nainstalované aplikace)
+ Zobrazení (v prohlížeči)
+ Omezí přístup k akcím zobrazení a informacím
+ Omezí přístup k informacím o systému, jakými jsou například nainstalované aplikace
+ Omezí přístup k příkazům konzole, včetně superuser příkazů
+ Omezí přístup k úložišti, jakými jsou například soubory na SD kartě nebo interním úložišti
+ Omezí přístup k snímačům, jakým je například snímač pohybu
+ Omezí přístup k informacím o telefonu, jakým je například vaše telefonní číslo
+ Omezí překrývání oken k zamezení phishingu
+ Omezí přístup k systému, sdělením aplikací a Google cloudovým zprávám
+ Omezí přístup k NFC
+ Omezí přístup k informacím o síti, jakými jsou například adresy IP a MAC a síťové informace o Wi-Fi
+ Omezí přístup k uloženým a přijatým zprávám (SMS/MMS) a hlasové poště
+ Omezí přístup k fotoaparátu (fotografie a videa) a mikrofonu
+ Omezí přístup k vaší přibližné a přesné poloze
+ Omezí komunikaci mezi procesy, kdy se používají na obejití dalších omezení
+ Omezí přístup k internetu
+ Omezí veškeré informace, které vás mohou identifikovat, jakým je například sériové číslo vašeho zařízení
+ Omezí přístup k e-mailovým informacím, jakými jsou například adresy a zprávy (pouze standardní a G-mail aplikace)
+ Omezí přístup ke slovníku uživatele
+ Omezí přístup k informacím o kontaktech
+ Omezí přístup k informacím ve schránce
+ Omezí volání telefonních čísel, posílání zpráv (SMS/MMS) a přístup k vaší historii hovorů
+ Omezí přístup k informacím kalendáře, jakými jsou například vaše setkání
+ Omezí přístup k informacím prohlížeče, jakými jsou například vaše záložky a historie stahování
+ Omezí přístup k informacím o účtech, jakým je například váš účet Google, který obsahuje vaši G-mailovou adresu
+ Adresy
+ Akce
+ IP adresy
+ Nativní knihovny
+ Názvy metod
+ Názvy souborů
+ Konzolové příkazy
+ Adresy URL
+ Transakce
+ Oprávnění
+ Zaškrtněte pro omezení:
+ Zaškrtněte pro povolení:
+ Filtrovat přístup k datům
+ Filtrovat přístup k internetu
+ Filtrovat oprávnění
+ Filtrovat omezení
+ Filtrovat uživatelské aplikace
+ Filtrovat podle požadavků
+ Filtrovat systémové aplikace
+ Opačně
+ Podle názvu
+ Podle UID
+ Podle data instalace
+ Podle data aktualizace
+ Podle data změny (XPrivacy)
+ Podle stavu (XPrivacy)
+ Obrátit pořadí seřazení
+ Pokus o použití:
+ Kategorie:
+ Funkce:
+ Parametry:
+ Použít na celou kategorii
+ Jednou za
+ "White/blacklist '%s'"
+ Povolit
+ Odmítnout
+ Nevím
+ Odešlete prosím vaše omezení na pomoc ostatním
+ Povolení
+ Omezit (kategorie)
+ Použít šablonu (kategorie)
+ Použít šablonu (kategorie+funkce)
+ Použít šablonu (nastavit sloučení)
+ Použít šablonu (obnovit sloučení)
+ Povolit omezení na požádání
+ Zakázat omezení na požádání
+ Časový limit bude:
+ Obnovit
+ Výchozí
+ Alternativní
+ Přejmenovat
+ Použití
+ 1. Najděte aplikaci na omezení v hlavním seznamu aplikací
+ 2. Klikněte na ikonu aplikace
+ 3. Klikněte na první zaškrtávací pole v jakékoliv kategorii, kterou chcete omezit
+ "Používejte zdravý rozum při omezování. Neočakávejte přístup k internetu, pokud jste omezili kategorii Internet, atd."
+ Dlouze stiskněte název pro přepnutí nebezpečných funkcí
+ Použití kategorie obnoví výjimky funkcí na výchozí hodnoty
+ Dokumentace funkce
+ je nebezpečná, může být obcházena
+ Kontrola aktualizací
+ Stahování akualizace
+ Dotykem nainstalujete aktualizaci
+ Žádné aktualizace k dispozici
+ Aplikace XPrivacy 2 již není podporována, prosím, zvažte aktualizaci na XPrivacy 3
+ Původní hodnota
+ Sériové číslo
+ Zeměpisná šířka
+ Zeměpisná délka
+ Nadmořská výška
+ MAC adresa
+ IP adresa
+ Telefonní číslo
+ Android ID
+ ID reklamy
+ Země
+ Operátor
+ IMSI
+ Agent prohlížeče
+ Všeobecné
+ Falešné údaje
+ Upozorňovat při aktualizacích aplikací
+ Omezit na požádání
+ Účty, aplikácie a kontakty na Blacklistu
+ Ukládat ladící záznam (vyžaduje restart)
+ Režim experta
+ Maximální rozsah spolehlivosti stahování
+ Experimentální funkce (vyžaduje restart)
+ Použít zabezpečené připojení
+ Omezit systémové komponenty (Android) (vyžaduje restart)
+ Zobrazit využítí dat aplikace (vyžaduje restart)
+ Zobrazit parametry využití dat
+ Zobrazit hodnoty využití dat
+ Identifikátor buňky GSM
+ Kód lokality GSM
+ Quirky
+ Režim AOSP (vyžadován restart)
+ První zaškrtávací pole: omezit kategorii nebo funkci
+ Druhé zaškrtávací pole: omezit na požádání
+ Přepínač zapnutí/vypnutí: povolit nebo zakázat všechna omezení
+ Vyberte dlouhým stiskem názvu
+ omezení budou požadované
+ Aplikace
+ má oprávnění k Internetu
+ má Android oprávnění
+ přistupovala k těmto datům
+ nemá žádná data využití
+ je zakázaná
+ je nebezpečná
+ je částečně omezená
+ má omezení vyžadující pozornost
+ má změněné omezení
+ má odeslané omezení
+ aplikace má určité falešné hodnoty
+ Vyberte kategorii pro omezení
+ "Pro omezení zvolené kategorie aplikace stiskněte zaškrtávací pole\n
+\nV rámci omezených kategorií aplikace obdrží prázdné nebo falešné údaje\n
+\nPro rozšířené možnosti omezení stiskněte ikonu aplikace"
+ Stiskněte ikonu aplikace pro zobrazení dalších akcí
+ Stiskněte šipku dolu pro zobrazení vyjímek funkce omezené kategorie
+ Správa aplikací, včetně možnosti ukončení
+ Spravovat onezení a nastavení XPrivacy
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-cy-rGB/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-cy-rGB/strings.xml
new file mode 100644
index 0000000..0ffe2de
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-cy-rGB/strings.xml
@@ -0,0 +1,257 @@
+
+
+ Nid XPrivacy wedi ei alluogi yn y gosodwr Xposed
+ Dim ond ar gyfer y fersiwn Android 4.0.3+
+ XPrivacy yn anghydnaws â %1$s
+ XPrivacy Fersiwn: %1$s (%2$d)
+ Mae\'r rheolwr preifatrwydd y pen draw
+ Hawlfraint \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Rhedeg ym modd chytunedd
+ Trwyddedig, diolch am eich cefnogaeth!
+ ddata defnydd
+ adnewyddu
+ gosodiadau
+ templed
+ Rhoi Gwybod am Faterion
+ allforio
+ Mewnforio
+ cyflwyno cyfyngiadau
+ nôl cyfyngiadau
+ thema Switch
+ pro fersiwn
+ Amdanom ni
+ helpu …
+ Dewis popeth
+ Trefnu
+ Hidlo
+ bob
+ cyfyngiadau Toggle
+ Clirio\'r holl
+ glir
+ Clirio\'r holl ddata XPrivacy
+ hidlo Toggle
+ Gwneud cais templed
+ glir
+ lansio
+ gosodiadau
+ Storfa chwarae
+ lladd
+ Cyfrifon Dewiswch i ganiatáu
+ Dewiswch ceisiadau i ganiatáu
+ Dewiswch cysylltiadau i ganiatáu
+ rheoli whitelists
+ tiwtorial
+ cambios
+ cache fflysio
+ Gwiriwch am ddiweddariadau
+ gweithrediadau …
+ Leyenda
+ Yn erthylu
+ herthylu
+ newydd
+ Y Diweddaraf
+ Llwytho …
+ Gwneud cais …
+ templed cymhwyso
+ cadw ar %1$s
+ Dim cyfyngiadau hyd i
+ A ydych yn sicr?
+ Dewiswch rhai ceisiadau
+ Dewiswch llai na %1$d ceisiadau
+ Trato hecho
+ Reinicio del equipo necesario
+ Dewis aleatoria de ahora
+ Dewis aleatoria de acceso
+ Dewis aleatoria en el arranque
+ El reinicio de aplicaciones requiere
+ Por favor registre su dispositivo
+ Introduzca su dirección de correo electrónico:
+ Revise su correo electrónico para activar su dispositivo
+ Servicio de actualización en ejecución
+ Migración %1$s
+ Asignaron al azar %1$s
+ Diweddarwyd %1$s
+ Una verificación interna fracasó, quieres enviar la información de servicio técnico?
+ Restringido por XPrivacy
+ Servicio de privacidad no encontrado; Qué habilita XPrivacy en el instalador Xposed y reiniciar el dispositivo?
+ fersiwn de servicio de privacidad desajuste; Qué reiniciar el dispositivo después de actualizar XPrivacy?
+ Por Os gwelwch yn dda, espere hasta que el servicio de actualización se ha completado
+ Los usuarios expertos se supone que deben resolver sus propios problemas cuando sea posible y seguir el foro XDA XPrivacy y ayudar a otros cuando sea posible
+ Restricciones de swyddogaeth destinados a usuarios expertos. ¿Eres un usuario experto?
+ cyffwrdd larga nombre de la swyddogaeth a la lista de paramedrau de color blanco o negro
+ Las marcas de verificación y los valores tienen prioridad sobre las marcas y los valores de verificación a nivel mundial; casillas vacías y los valores no tienen prioridad
+ The privacy database was reset, because it was corrupt
+ Gran cuidado se ha tomado para desarrollar y XPrivacy prueba,
+sin embargo, es imposible garantizar que funcionará sin problemas en todas y cada dispositivo y para cada cais.
+\n\nes bajo su propio riesgo. \n\nConsulte también la licencia:
+ cyfrifon
+ porwr
+ calendr
+ galw
+ clipfwrdd
+ Cysylltiadau
+ geiriadur
+ E-mail
+ Adnabod
+ Adnabod
+ lleoliad
+ cyfryngau
+ negeseuon
+ rhwydwaith
+ hysbysiadau
+ troshaen
+ ffôn
+ synwyryddion
+ storio
+ gragen
+ gyfundrefn
+ golwg
+ A fydd cyfyngu ar fynediad i weld y camau gweithredu a gwybodaeth
+ A fydd cyfyngu ar fynediad at wybodaeth y system, fel ceisiadau gorseddedig
+ A fydd cyfyngu ar fynediad i orchmynion cregyn, gan gynnwys gorchmynion uwch ddefnyddiwr
+ A fydd cyfyngu ar fynediad at y storfa, fel ffeiliau ar eich cerdyn SD neu storio mewnol
+ A fydd cyfyngu ar fynediad at y synwyryddion, fel y synhwyrydd cynnig
+ A fydd cyfyngu ar fynediad at wybodaeth ffôn, fel eich rhif ffôn
+ A fydd cyfyngu ffenestri troshaen i atal gwe-rwydo
+ A fydd cyfyngu ar fynediad at system a chymhwyso hysbysiadau a negeseuon cwmwl Google
+ A fydd cyfyngu ar fynediad i agos gyfathrebu cae
+ A fydd cyfyngu ar fynediad i rwydweithio gwybodaeth, fel IP a chyfeiriadau MAC a gwybodaeth rhwydwaith Wi-Fi
+ A fydd cyfyngu ar fynediad at negeseuon storio a dderbyniwyd (SMS / MMS) a voicemail
+ A fydd cyfyngu ar fynediad at y camera (lluniau a fideos) a\'r meicroffon
+ A fydd cyfyngu ar fynediad at eich lleoliad bras a dirwy
+ A fydd cyfyngu cyfathrebu rhwng proses, pan gaiff ei ddefnyddio i osgoi cyfyngiadau eraill
+ A fydd cyfyngu ar fynediad i\'r Rhyngrwyd
+ A fydd gyfyngu ar wybodaeth a all adnabod chi, fel y rhif cyfresol eich dyfais
+ A fydd cyfyngu ar fynediad at wybodaeth e-bost, fel cyfeiriadau a negeseuon (gais safonol a G-bost yn unig)
+ A fydd cyfyngu ar fynediad at y geiriadur defnyddiwr
+ A fydd cyfyngu ar fynediad at wybodaeth am eich cysylltiadau
+ A fydd cyfyngu ar fynediad i wybodaeth ar y clipfwrdd
+ A fydd cyfyngu ffonio rhifau ffôn, anfon negeseuon (SMS / MMS) a mynediad at eich hanes galw
+ A fydd cyfyngu ar fynediad at eich gwybodaeth calendr, fel eich apwyntiadau
+ A fydd cyfyngu ar fynediad at wybodaeth porwr, fel eich nodau tudalen a hanes llwytho i lawr
+ A fydd cyfyngu ar fynediad i gyfrif wybodaeth, fel eich cyfrif Google, sy\'n cynnwys eich cyfeiriad G-bost
+ cyfeiriadau
+ Gweithredu
+ cyfeiriadau IP
+ llyfrgelloedd brodorol
+ enwau dull
+ enwau ffeiliau
+ gorchmynion Shell
+ URLs
+ trafodion
+ caniatadau
+ Gwiriwch i gyfyngu:
+ Gwiriwch i ganiatáu:
+ Hidlo ar ddefnydd data
+ Hidlo ar fynediad i\'r rhyngrwyd
+ Hidlo ar ganiatâd
+ Hidlo ar gyfyngu
+ Hidlo ar geisiadau defnyddwyr
+ Hidlo yn ôl ar-alw
+ Hidlo ar geisiadau system
+ negyddu
+ yn ôl enw
+ drwy uid
+ Erbyn dyddiad gosod
+ Erbyn dyddiad diweddaru
+ Erbyn dyddiad a addaswyd (XPrivacy)
+ Drwy wladwriaeth (XPrivacy)
+ Gwrthdroi\'r drefn
+ Defnydd ymgais o:
+ categori:
+ swyddogaeth:
+ paramedrau:
+ Gwneud cais i gategori cyfan
+ unwaith ar gyfer
+ Gwyn/rhestr ddu ‘%1$s’
+ caniatáu
+ gwrthod
+ gwybod
+ Cyflwynwch eich cyfyngiadau i helpu eraill
+ caniatadau
+ Cyfyngu (categori)
+ Gwneud cais templed (categorïau)
+ Gwneud cais templed (categorïau+swyddogaethau)
+ Gwneud cais templed (uno set)
+ Gwneud cais templed (uno reset)
+ Galluogi ar cyfyngu galw
+ Analluoga ar cyfyngu galw
+ Goramser bydd:
+ Ailosod
+ diofyn
+ Bob yn ail
+ ailenwi
+ defnydd
+ 1. Dewch o hyd i\'r cais i gyfyngu yn y brif restr cais
+ 2. Tap ar yr eicon cais neu enw
+ 3. Tap y blwch gwirio cyntaf o unrhyw gategori yr ydych am gyfyngu
+ Defnyddiwch synnwyr cyffredin wrth cyfyngu, peidiwch disgwyl mynediad i\'r rhyngrwyd os ydych yn cyfyngu ar y categori y rhyngrwyd, ac ati
+ Wasg hir ar deitl i toggle swyddogaethau peryglus
+ Bydd Gwneud cais i\'r categori ailosod y swyddogaeth eithriadau i werthoedd diofyn
+ dogfennaeth swyddogaeth
+ yn anniogel, gellir osgoi\'r
+ Gwirio am ddiweddariad
+ lawrlwytho diweddariad
+ Tap i osod diweddariad
+ Dim diweddariadau sydd ar gael
+ Nid XPrivacy 2 yn cael ei gefnogi anymore, os gwelwch yn dda ystyried uwchraddio i XPrivacy 3
+ Original
+ cyfresol#
+ IL
+ hydred
+ uchder
+ cyfeiriad MAC
+ cyfeiriad IP
+ rhif ffôn
+ Android ID
+ hysbyseb ID
+ Gwlad
+ gweithredwr
+ tanysgrifiwr ID
+ asiant defnyddiwr
+ Cyffredinol
+ datos falsos
+ hysbysiadau Diweddariad
+ Cyfyngu ar y galw
+ Cyfrifon rhestr ddu, ceisiadau a chysylltiadau
+ Log Debug (angen reboot)
+ modd arbenigol
+ Uchafswm nôl cyfwng hyder
+ Swyddogaethau Arbrofol (angen reboot)
+ Defnyddio cysylltiadau diogel
+ Cyfyngu cydrannau system (Android)
+ Dangos data defnydd cais
+ Dangos paramedrau o ddata defnydd
+ Dangos gwerthoedd o ddata defnydd
+ GSM gell ID
+ GSM LAC
+ peculiaridades
+ AOSP modd (angen reboot)
+ Blwch gwirio Cyntaf: cyfyngu categori neu swyddogaeth
+ Ail blwch gwirio: cyfyngu ar y galw; blwch gwirio cyntaf yw gwerth rhagosodedig
+ Ar/oddi ar y switsh: alluogi neu analluogi pob gyfyngiadau
+ Wasg hir enw cais i ddewis
+ Bydd cyfyngiadau gofynnir
+ cais
+ gyda chaniatâd y rhyngrwyd
+ Mae caniatâd Android
+ wedi defnyddio\'r data hwn
+ dim data defnydd ar gael
+ yn anabl
+ yn beryglus, gall cyfyngu achosi problemau
+ cyfyngu yn rhannol
+ angen sylw cyfyngiadau
+ cyfyngiadau yn cael eu newid
+ cyfyngiadau yn cael eu cyflwyno
+ ccyfyngiadau were ue introducing
+ Dewiswch y categori i gyfyngu
+ dapiadau y blwch gwirio cyntaf i gyfyngu ar y categori a ddewiswyd ar gyfer app\n
+\nyr ail blwch gwirio i gyfyngu ar y galw\n
+Bydd\ncael eu bwydo data gwag neu ffug ar gyfer categorïau cyfyngedig\n
+\nyr eicon app neu enw am gyfyngiadau a lleoliadau manwl
+ dapiadau yr eicon app am fwy o gamau gweithredu
+ dapiadau y saeth i lawr i weld yr eithriadau swyddogaeth categori cyfyngiad
+ Rheoli ceisiadau, gan gynnwys lladd
+ Ymdopi â chyfyngiadau a lleoliadau XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-da/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-da/strings.xml
new file mode 100644
index 0000000..481d9d4
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-da/strings.xml
@@ -0,0 +1,254 @@
+
+
+ XPrivacy er ikke aktiveret i Xposed installer
+ Kun til Android version 4.0.3+
+ XPrivacy er ikke kompatibel med %s
+ XPrivacy version: %s (%d)
+ The ultimate privacy manager
+ Ophavsret \u00A9 2013–2015 M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licenseret, tak for din støtte!
+ Brug
+ Opdatér
+ Indstillinger
+ Skabelon
+ Rapportér problem
+ Eksportér
+ Importér
+ Angiv restriktioner
+ Hent restriktioner
+ Skift tema
+ Pro-version
+ Om
+ Hjælp
+ Select all
+ Sortér
+ Filtrer
+ Alle
+ Slå restriktioner til/fra
+ Ryd alle
+ Ryd
+ Ryd al data
+ Slå filter til/fra
+ Anvend skabelon
+ Ryd
+ Kør
+ App-indstillinger
+ Play Store
+ Dræb
+ Vælg konti som skal tillades
+ Select applications to allow
+ Vælg kontakter som skal tillades
+ Administrér white lister
+ Vejledning
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Anullerer
+ Anulleret
+ Ny
+ Opdatér
+ Indlæser
+ Applying
+ Skabelon anvendt
+ Gemt til %s
+ Ingen restriktioner fundet
+ Er du sikker?
+ Vælg venligst nogle applikationer
+ Vælg venligst færre end %d applikationer
+ Udført
+ Genstart nødvendig
+ Indlæs tilfældige værdier
+ Indlæs tilfældige værdier ved tilgang
+ Indlæs tilfældige værdier ved boot
+ Applikationen kræver genstart
+ Registrer venligst din enhed
+ Indtast venligst din e-mail adresse:
+ Check din e-mail for at aktivere din enhed
+ Opdaterings service kører
+ Migrerer %s
+ Randomiserer %s
+ Opgraderer %s
+ Et internt check fejlede, vil du sende support informationen?
+ Begrænset af XPrivacy
+ Privatheds service blev ikke fundet; har du slået XPrivacy til i Xposed installeren og genstartet din enhed?
+ Privatheds service versionen matcher ikke; har du genstartet din enhed efter opgradering af XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ XPrivacy er grundigt udviklet og testet, dog er det umuligt at garantere, at appen fungerer fejlfrit på alle enheder og for alle apps.\n\nBrug af denne app foregår udelukkende på egen risiko. \n\nSe også licensen:
+ Konti (Google, Facebook, osv.)
+ Browser (bogmærker/historik)
+ Kalender
+ Opkald (telefon, SMS, MMS)
+ Udklipsholder
+ Kontakter
+ Ordbog (bruger)
+ E-mail
+ Identifikation (enhed)
+ Internet
+ Position (fin/grov)
+ Medier (lyd, foto, video)
+ Beskeder (SMS, MMS)
+ Netværk (adresser)
+ Meddelelser
+ Overlay
+ Telefon (ID, numre, opkald)
+ Sensorer
+ Hukommelse (medier, SD-kort)
+ Shell (kommandoer, superbruger)
+ System (installerede apps)
+ Vis (browser)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP adresser
+ Native biblioteker
+ Metode navne
+ Fil navne
+ Shell kommandoer
+ URLér
+ Transactions
+ Permissions
+ Markér for at blokere:
+ Marker for at tillade:
+ Filtrér ved data brug
+ Filtrér ved internet adgang
+ Filtrér ved on tilladelse
+ Filtrér ved begrænset
+ Filtrér ved system applikationer
+ Filtrér ved bruger applikationer
+ Filtrér by on-demand
+ Negér
+ Efter navn
+ Efter uid
+ Efter installeret dato
+ Efter opdaterings dato
+ Efter modificerings dato (XPrivacy)
+ Efter tilstand (XPrivacy)
+ Inverter sorterings rækkefølge
+ Forsøg på brug af:
+ Kategori:
+ Funktion:
+ Parametre:
+ Anvend for hele kategorien
+ Once for
+ White liste \'%s\'
+ Tillad
+ Afvis
+ Ved ikke
+ Indsend venligst dine restriktioner for at hjælpe andre
+ Rettigheder
+ Begræns
+ Anvend skabelon (kategorier)
+ Anvend skabelon (kategorier+funktioner)
+ Anvend skabelon (flet)
+ Apply template (merge reset)
+ Aktivér on demand begrænsning
+ Deaktivér on demand begrænsning
+ Timeout will:
+ Reset
+ Default
+ Alternativ
+ Rename
+ Anvendelse
+ 1. Find applikationen du vil begrænse i applikationslisten
+ 2. Tryk på applikations ikonet
+ 3. Tryk på den første boks i envher kategori du vil begrænse
+ Brug sund fornuft når du indfører restriktioner, forvent ikke Internet adgang hvis du har indørt begrænsninger i den kategori, osv.
+ Lang tryk på en titel for at slå farlige funktioner til og fra
+ Hvis du anvender til kategorien, vil det nulstille funktions undtagelser til default værdier
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serienummer
+ Breddegrad
+ Længdegrad
+ Altitude
+ MAC-adresse
+ IP-adresse
+ Telefonnummer
+ Android-ID
+ Advertisement ID
+ Land
+ Operatør
+ Abonnent-ID
+ User agent
+ Generel
+ Fake data
+ Updaterings notifikationer
+ Begræns on-demand
+ Blacklist accounts, applications and contacts
+ Debug-log (kræver genstart)
+ Ekspert tilstand
+ Maximum fetch confidence interval
+ Eksperimentelle funktioner (kræver genstart)
+ Brug sikre forbindelser
+ Begræns system komponenter (Android) (kræver genstart)
+ Vis applikations brugs data (kræver genstart)
+ Vis parametre for brugs data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Lang tryk på navn for at vælge
+ restrictions will be asked
+ App
+ har internettilladelse
+ har Android-tilladelse
+ har benyttet denne type data
+ ingen brugs data tilgængelig
+ er deaktiveret
+ er farlig
+ delvis begrænset
+ begrænsninger kræver need opmærksomhed
+ begrænsninger er ændret
+ begrænsninger er indsendt
+ has application specific fake values
+ Vælg kategorien du vil begrænse
+ Tryk på en checkboks for at begrænse den valgte kategori for en app\n
+\nApps vil blive fodret tom eller falsk data for begrænsede kategorier\n
+\nTryk på app ikonet for detaljeret beskrivelse om restriktioner og indstillinger
+ Tryk på app ikonet for flere handlinger
+ Tryk på pil ned for at se funktion undtagelser for en begrænsnings kategori
+ Håndter applikationer
+ Håndter XPrivacy restriktioner og indstillinger
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-de/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-de/strings.xml
new file mode 100644
index 0000000..7ba03e8
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-de/strings.xml
@@ -0,0 +1,299 @@
+
+ XPrivacy ist im Xposed Installer nicht aktiviert
+ Nur ab Android-Version 4.0.3+
+ XPrivacy ist mit %1$s nicht kompatibel
+
+ XPrivacy Version: %1$s (%2$d)
+ Der ultimative Privacy Manager
+ Copyright \u00A9 2013–2015\n\t by M. Bokhorst (M66B)
+ Läuft im Kompatibilitätsmodus
+ Lizenz vorhanden, vielen Dank für Ihre Unterstützung!
+
+
+ Aktivitätslog
+ Aktualisieren
+ Einstellungen
+ Vorlage (Template)
+ Problem melden
+ Einstellungen exportieren
+ Einstellungen importieren
+ Beschränkungen hochladen (Crowd)
+ Beschränkungen herunterladen (Crowd)
+ Theme wechseln
+ Pro-Version
+ Über XPrivacy
+ Hilfe
+ Alle auswählen
+ Sortieren
+ Filter
+ Alle Einstellungen
+ Beschränkungen festlegen
+ Alles löschen
+ Löschen
+ Alle XPrivacy Daten löschen
+ Filter ein/aus
+ Vorlage übernehmen
+ Einstellungen löschen
+ Öffnen
+ App-Info anzeigen
+ Im Play-Store anzeigen
+ App beenden
+ Konten für Zugriff freigeben
+ Apps für Zugriff freigeben
+ Kontakte für Zugriff freigeben
+ Weisse Listen verwalten
+ Anleitung
+ Änderungsprotokoll
+ Cache Speicher löschen
+ Nach Updates suchen
+ Operationen …
+ Legende
+ Abbrechen
+ Abgebrochen
+ Neu
+ Update
+ Lade …
+ Übernehme …
+ Vorlage übernommen
+ Gespeichert nach %1$s
+ Keine Beschränkung gefunden
+ Sind Sie sicher?
+ Bitte wählen Sie einige Apps aus
+ Bitte wählen Sie weniger als %1$d App(s) aus
+ Fertig
+ Geräteneustart erforderlich
+ Zufallswerte erzeugen
+ Zufallswerte bei Zugriff erzeugen
+ Zufallswerte bei Geräteneustart erzeugen
+ App-Neustart erforderlich
+ Bitte registrieren Sie ihr Gerät
+ Bitte tragen Sie Ihre E-Mail Adresse ein:
+ Überprüfen Sie ihre E-Mails, um Ihr Gerät zu aktivieren
+ Update Dienst läuft
+ Migriere %1$s
+ Zufalls-Erzeugung %1$s
+ Upgrading %1$s
+ Eine interne Überprüfung ist fehlgeschlagen, möchten Sie die Supportinformationen senden?
+ Durch XPrivacy beschränkt
+ Privacy Service nicht gefunden. Haben Sie XPrivacy im Xposed Installer aktiviert und Ihr Gerät neu gestartet?
+ Privacy Service Versionsunterschied festgestellt. Haben Sie nach dem Upgrade von XPrivacy Ihr Gerät neu gestartet?
+ Bitte warten Sie, bis der Update-Dienst beendet worden ist
+
+ Erfahrene Anwender werden gebeten, ihre Probleme weitgehend selbst zu lösen und anderen Anwendern im XDA XPrivacy Forum soweit wie möglich zu helfen
+ Funktionsbeschränkungen sind für Experten vorgesehen. Sind Sie ein Experte?
+ Drücken Sie lange auf den Funktionsnamen um einen Parameter auf die schwarze oder weiße Liste zu setzen
+
+ App-spezifische Optionen und Werte haben Vorrang vor globalen Einstellungen; leere Kontrollkästchen oder nicht gesetzte Werte haben keinen Einfluss
+ The privacy database was reset, because it was corrupt
+
+
+
+ XPrivacy wurde mit größter Sorgfalt entwickelt und getestet.\nDennoch kann nicht gewährleistet werden,
+dass es einwandfrei auf wirklich JEDEM einzelnen Gerät und für JEDE einzelne App funktioniert.
+\n\nSie verwenden XPrivacy ausschließlich auf eigenes Risiko! \n\nBitte beachten Sie auch die Lizenz:
+ Konten (Google, Facebook, etc.)
+ Browser (Lesezeichen, Verlauf)
+ Kalender
+ Kommunizieren (Anrufe, SMS, MMS)
+ Zwischenablage
+ Kontakte
+ Wörterbuch (Benutzer)
+ E-Mail
+ Identifikation (Gerät)
+ Internet
+
+
+ Standort (genau/ungenau)
+ Medien (Audio, Fotos, Videos)
+ Nachrichten (SMS, MMS)
+
+
+ Netzwerk (-Adressen)
+ Benachrichtigungen
+ Overlay
+ Telefon (ID, Nummern, Anrufe)
+ Sensoren
+ Speicher (-Medien, SD-Karte)
+ Shell (Kommandos, Superuser)
+ System (installierte Apps)
+ Anzeigen (mittels Browser)
+
+
+
+
+
+
+ Beschränkt Zugriff auf ‘View’ Aktionen und Informationen
+ Beschränkt Zugriff auf System Informationen, wie z.B. installierte Apps
+ Beschränkt Zugriff auf Shell Befehle, inklusive SuperUser-Befehle
+ Beschränkt Zugriff das Dateisystem, z.B. Dateien auf der SD-Karte oder im internen Speicher
+ Beschränkt Zugriff auf Sensoren, wie z.B. den Bewegungssensor
+ Beschränkt Zugriff auf Telefon Informationen, wie die Telefonnummer
+ Beschränkt Overlay-Fenster, um Phishing zu verhindern
+
+
+
+ Beschränkt Zugriff auf System- und Anwendungsbenachrichtigungen und Google Cloud Messaging
+ Beschränkt Zugriff auf NFC (Nahfeldkommunikation)
+ Beschränkt Zugriff auf Netzwerkinformationen, wie die IP- und MAC-Adressen sowie WLAN Netzwerkinformationen
+ Beschränkt Zugriff auf gespeicherte und eingehende Nachrichten (SMS/MMS) und Voicemails
+
+ Beschränkt Zugriff auf die Kamera (Photos und Videos) und das Mikrofon
+ Beschränkt Zugriff auf den ungenauen und genauen Standort
+
+ Beschränkt Zugriff auf Interprozess-Kommunikation, wenn dieser benutzt wird, um andere Beschränkungen zu umgehen
+ Beschränkt Zugriff auf das Internet
+
+
+ Beschränkt Zugriff auf Informationen, die Sie identifizieren können, wie die Seriennummer des Gerätes
+ Beschränkt Zugriff auf E-mail Informationen, wie die Adresse und Nachrichten (nur für Standard- und G-Mail Applikationen)
+ Beschränkt Zugriff auf das Benutzerwörterbuch
+ Beschränkt Zugriff auf Informationen über Ihre Kontakte
+ Beschränkt Zugriff auf Informationen in der Zwischenablage
+
+
+
+
+ Beschränkt ausgehende Anrufe, das Versenden von Nachrichten (SMS/MMS) sowie Zugriff auf die Anrufprotokolle
+ Beschränkt Zugriff auf Kalender-Informationen wie Ihre Termine
+ Beschränkt Zugriff auf Browser-Informationen wie die Favoriten und Download-Verlauf
+ Beschränkt Zugriff auf Kontoinformationen wie Ihr Google Konto, welches Ihre G-Mail Adresse enthält
+ Adressen
+ Action
+ IP Adressen
+ Native Bibliotheken
+ Methodennamen
+ Dateinamen
+ Shell Kommandos
+ URLs
+ Transaktionen
+ Berechtigungen
+
+ Zum Beschränken anhaken:
+ Zum Freigeben anhaken
+ Filter: hat Daten abgerufen
+ Filter: hat Internetzugang
+ Filter: hat Berechtigung
+ Filter: ist beschränkt
+ Nach Benutzer-Apps filtern
+ Filter: beschränkt nach Aufforderung
+ Nach System-Apps filtern
+ Invertieren
+ nach Name
+ nach UID
+ nach Installationsdatum
+ nach Update-Datum
+ nach Änderungsdatum (XPrivacy)
+ nach Status (XPrivacy)
+ Sortierreihenfolge invertieren
+ Versuch der Verwendung von:
+ Kategorie:
+ Funktion:
+ Parameter:
+ Auf die gesamte Kategorie anwenden
+ Nur einmalig für
+ Weisse Liste \'%1$s\'
+ Zulassen
+ Blockieren
+ Ich weiß nicht
+ Bitte geben Sie Ihre Einstellungen der Beschränkungen weiter, um anderen zu helfen
+ Berechtigungen
+ Auswahl beschränken (Kategorien)
+ Vorlage übernehmen (nur Kategorien)
+ Vorlage übernehmen (Kategorien und Funktionen)
+ Vorlage übernehmen (angehakte zusammenführen)
+ Vorlage übernehmen (abgehakte zusammenführen)
+ \"Beschränken nach Aufforderung\" aktivieren
+ \"Beschränken nach Aufforderung\" deaktivieren
+ Bei Timeout:
+ Zurücksetzen
+ Standard
+ Alternativ
+ Umbenennen
+ Anleitung
+ 1. Suchen Sie in der Liste die App, die Sie beschränken möchten
+ 2. Tippen Sie auf das App Icon
+ 3. Tippen Sie auf das erste Kontrollkästchen der Kategorien, die Sie beschränken möchten
+ Nutzen Sie Ihren gesunden Menschenverstand beim Beschränken. Wenn Sie die Internet Kategorie beschränken, sollten Sie keine Internetzugriffe mehr erwarten.
+
+ Auf einen Titel lange drücken, um bedenkliche Beschränkungen umzuschalten
+ Bei Anwendung auf die gesamte Kategorie werden die Ausnahmen der Funktionen auf die Standardwerte zurückgesetzt
+ Dokumentation der Funktion
+ ist nicht sicher, kann umgangen werden
+ Suche nach Updates
+ Update wird heruntergeladen
+ Bestätigen Sie, um das Update zu installieren
+ Keine Updates verfügbar
+ XPrivacy 2 wird nicht mehr länger unterstützt, bitte machen Sie ein Upgrade auf XPrivacy 3
+ Original
+ Seriennummer
+ Breitengrad
+ Längengrad
+ Höhe über NN
+ MAC-Adresse
+ IP-Adresse
+
+ Telefonnummer
+ Android-ID
+
+ Werbungs-ID
+
+ Land
+
+ Mobilfunkanbieter
+
+ Subscriber-ID
+
+ User-Agent (Browser)
+
+ Allgemein
+ Manipulierte Daten
+ Update-Benachrichtigungen
+ Beschränken nach Aufforderung
+ Schwarze Liste für Konten, Anwendungen und Kontakte
+ Debug-Log (erfordert Geräteneustart)
+ Experten-Modus
+ Maximales Abruf-Konfidenzintervall
+ Experimentelle Funktionen\n (erfordert Geräteneustart)
+ Benutze sichere Verbindung
+ Beschränke Systemkomponenten (Android) (erfordert Geräteneustart)
+ App Nutzungsdaten zeigen\n (erfordert Geräteneustart)
+ Parameter der Nutzungsdaten zeigen
+ Werte der Nutzungsdaten zeigen
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP-Modus (erfordert Geräteneustart)
+ Erstes Kontrollkästchen: Kategorie oder Funktion beschränken
+ Zweites Kontrollkästchen: nach Aufforderung beschränken
+ Ein/Aus-Schalter: alle Beschränkungen aktivieren oder deaktivieren
+ Für Auswahl App-Name drücken und kurz halten
+ Beschränkungen nach Aufforderung festlegen
+ App
+ hat Internet-Berechtigung
+ hat Android-Berechtigung
+ hat diese Daten benutzt
+ keine Nutzungsdaten verfügbar
+ ist deaktiviert
+ Beschränkung bedenklich (eventueller App-Absturz)
+ teilweise beschränkt
+ Beschränkungen sollten überprüft werden
+ Beschränkungen wurden geändert
+ Beschränkungen wurden gesendet (Crowd)
+ hat applikationsspezifisch manipulierte Daten
+ Wählen Sie die zu beschränkende Kategorie
+ Tippen Sie auf ein Kontrollkästchen, um die ausgewählte Kategorie für eine App zu beschränken\n
+\nApps werden mit leeren Listen oder manipulierten Daten für die beschränkten Kategorien \"gefüttert\" \n
+\nTippen Sie auf das App-Icon für detaillierte Beschränkungen und Einstellungen
+
+
+
+
+ Tippen Sie auf das App-Icon für weitere Aktionen
+ Tippen Sie auf den Pfeil, um die Ausnahmen der Funktionen einer beschränkten Kategorie zu sehen
+ Verwalte Apps, inklusive Beenden (kill)
+ Verwalte XPrivacy Beschränkungen und Einstellungen
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ee/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ee/strings.xml
new file mode 100644
index 0000000..060085e
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ee/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy ei ole aktiveeritud Xposed raamistiku installeerias
+ See rakendus on ainult android 4.0.3+\'le
+ XPrivacy is incompatible with %s
+ XPrivacy versioon: %s (%d)
+ The ultimate privacy manager
+ Autoriõigus \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Kasutus
+ Värskenda
+ Seaded
+ Mall
+ Teavita veast
+ Ekspordi
+ Impordi
+ Saada keelud
+ Lae keelud alla
+ Vaheta teemat
+ Pro versioon
+ Programmist
+ Abi
+ Select all
+ Sort
+ Filter
+ Kõik
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ Tühjenda
+ Käivita
+ Rakenduse andmed
+ Play Pood
+ Kill
+ Vali kasutajad mida lubada
+ Select applications to allow
+ Vali kontaktid mida lubada
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ Laeb
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ Oled sa kindel?
+ Please select some applications
+ Please select fewer than %d applications
+ Valmis
+ Seadme taaskäivitus on vajalik
+ Juhuslik
+ Randomize on access
+ Juhuslikusta pärast käivitamist
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Palju vaeva on nähtud Xprivacy arendamisel ja testimisel,
+kuid on võimatu garanteerida, et see töötab igal seadmel ja iga rakendusega.
+\n\nKasuta ainult omal vastutusel. \n\nSee also the license:
+ Kasutajad (Google, Facebook, jne)
+ Brauser (järjehoidjad/ajalugu)
+ Kalender
+ Helistamine (kõned, SMS, MMS)
+ Lõikelaud
+ Kontaktid
+ Kasutaja sõnastik
+ E-mail
+ Seadme tuvastamine
+ Internet
+ Asukoht (täpne/umbkaudne)
+ Meedia (helid, pildid ja videod)
+ Sõnumid (SMS, MMS)
+ Võrk (aadressid)
+ Teated
+ Overlay
+ Telefon (ID, numbrid, kõned)
+ Sensors
+ Mälu (Meedia, SD kaart)
+ Käsurida (käsud, juurkasutaja)
+ Süsteem (installeeritud rakendused)
+ Vaade (brauser)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Lisa linnuke, et keelata:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Seeria#
+ Laiuskraad
+ Pikkuskraad
+ Altitude
+ MAC aadress
+ IP aadress
+ Telefoninumber
+ Androidi ID
+ Advertisement ID
+ Riik
+ Opeeraator
+ Abonendi ID
+ Kasutaja agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Silumislogi (nõuab restarti)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Rakendus
+ on interneti kasutamise luba
+ on Android luba
+ on kasutanud seda andmeside tüüpi
+ no usage data available
+ on välja lülitatud
+ On ohtlik
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-el/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-el/strings.xml
new file mode 100644
index 0000000..fa2ae36
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-el/strings.xml
@@ -0,0 +1,256 @@
+
+
+ Το XPrivacy δεν είναι ενεργοποιημένο στο Xposed installer
+ Only for Android version 4.0.3+
+ XPrivacy is incompatible with %s
+ Έκδοση XPrivacy: %s (%d)
+ The ultimate privacy manager
+ Copyright \u00A9 2013–2015 M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Χρήση
+ Ανανέωση
+ Ρυθμίσεις
+ Πρότυπο
+ Αναφορά σφάλματος
+ Εξαγωγή
+ Εισαγωγή
+ Υποβολή περιορισμών
+ Λήψη περιορισμών
+ Αλλαγή θέματος
+ Έκδοση Pro
+ Σχετικά
+ Βοήθεια
+ Select all
+ Sort
+ Filter
+ Όλα
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ Εκκαθάριση
+ Εκκίνηση
+ Λεπτομέρειες εφαρμογής
+ Play Store
+ Kill
+ Επιλογή επιτρεπόμενων λογαριασμών
+ Select applications to allow
+ Επιλογή επιτρεπόμενων επαφών
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ Φόρτωση
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ Είστε σίγουρος;
+ Please select some applications
+ Please select fewer than %d applications
+ Τέλος
+ Απαιτείται επανεκκίνηση
+ Τυχαία διεύθυνση
+ Randomize on access
+ Τυχαία διεύθυνση μετά την εκκίνηση
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Μεγάλη προσοχή έχει ληφθεί για την ανάπτυξη και δοκιμή του XPrivacy,
+ωστόσο, είναι αδύνατο να εγγυηθεί ότι θα λειτουργήσει άψογα σε κάθε συσκευή και για κάθε εφαρμογή.
+\n\nΗ χρήση γίνεται αποκλειστικά με δική σας ευθύνη. \n\nΔείτε επίσης την άδεια:
+ Λογαριασμοί (Google, Facebook, κλπ)
+ Browser (σελιδοδείκτες/ιστορικό)
+ Ημερολόγιο
+ Κλήσεις (τηλέφωνο, SMS, MMS)
+ Πρόχειρο
+ Επαφές
+ Λεξικό (χρήστη)
+ E-mail
+ Ταυτότητα (συσκευή)
+ Internet
+ Τοποθεσία (ακριβής/μερική)
+ Πολυμέσα (ήχοι, φωτογραφίες, βίντεο)
+ Μηνύματα (SMS, MMS)
+ Δίκτυο (διευθύνσεις)
+ Ειδοποιήσεις
+ Overlay
+ Τηλέφωνο (στοιχεία, αριθμοί, κλήσεις)
+ Sensors
+ Αποθ. χώρος (πολυμέσα, κάρτα SD)
+ Shell (εντολές, superuser)
+ Σύστημα (εγκατεστημένες εφαρμογές)
+ Εμφάνιση (browser)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Επιλέξτε για περιορισμό:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Σειριακός αριθμός
+ Γεωγρ. πλάτος
+ Γεωγρ. μήκος
+ Altitude
+ Διεύθυνση MAC
+ IP address
+ Αριθμός τηλεφώνου
+ Αναγνωριστικό android
+ Advertisement ID
+ Χώρα
+ Operator
+ Αναγνωριστικό συνδρομητή
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Εφαρμογή
+ έχει άδεια Internet
+ έχει άδεια Android
+ έχει χρησιμοποιήσει αυτά τα δεδομένα
+ no usage data available
+ είναι απενεργοποιημένη
+ είναι επικίνδυνη
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-es/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-es/strings.xml
new file mode 100644
index 0000000..4832c08
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-es/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy no está habilitado en el instalador de Xposed
+ Sólo para Android versión 4.0.3+
+ XPrivacy no es compatible con %s
+ Versión de XPrivacy: %s (%d)
+ El administrador de permisos definitivo
+ Copyright \u00A9 2013–2015 por M. Bokhorst (M66B)
+ Funcionando en modo compatibilidad
+ Activado, ¡gracias por su apoyo!
+ Uso
+ Actualizar
+ Configuración
+ Plantilla
+ Reportar problema
+ Exportar
+ Importar
+ Enviar restricciones
+ Obtener restricciones
+ Cambiar tema
+ Versión Pro
+ Acerca de
+ Ayuda
+ Seleccionar todo
+ Ordenar
+ Filtrar
+ Todas
+ Restringir todo
+ Permitir todo
+ Limpiar
+ Limpiar los datos
+ Cambiar filtro
+ Aplicar plantilla
+ Borrar
+ Ejecutar
+ Configuración
+ Play Store
+ Terminar proceso
+ Seleccione las cuentas permitidas
+ Seleccione las aplicaciones permitidas
+ Seleccione los contactos permitidos
+ Gestionar listas blancas
+ Tutorial
+ Registro de cambios
+ Vaciar caché
+ Comprobar actualizaciones
+ Operaciones …
+ Leyenda
+ Abortando
+ Abortado
+ Nuevo
+ Actualizar
+ Cargando
+ Aplicando
+ Plantilla aplicada
+ Guardado en %s
+ No se han encontrado restricciones
+ ¿Estás seguro?
+ Seleccione alguna aplicación
+ Por favor, seleccione menos de %d aplicaciones
+ Completado
+ Reinicio requerido
+ Selección aleatoria
+ Inventar al acceder
+ Inventar en el arranque
+ Reinicio de aplicación requerido
+ Por favor, registre su dispositivo
+ Por favor, introduzca su dirección e-mail:
+ Compruebe su e-mail para activar su dispositivo
+ Actualizando
+ Migrando %s
+ Inventando %s
+ Actualizando %s
+ Ha ocurrido un error interno ¿Desea mandar información del error al desarrollador?
+ Restringido por XPrivacy
+ Servicio de privacidad no encontrado; ¿activó XPrivacy en el instalador Xposed y reinició su dispositivo?
+ Desajuste en la versión del servicio de privacidad; ¿reinició su dispositivo después de actualizar XPrivacy?
+ Por favor espere hasta que el servicio de actualización se haya completado
+ Se da por supuesto que los usuarios avanzados resolverán sus propios problemas y seguirán el foro de XPrivacy en XDA para ayudar a otros cuando sea posible
+ Las restricciones de las funciones avanzadas van dirigidas a usuarios expertos. ¿Eres un usuario experto?
+ Mantén pulsado el nombre de la función para añadir a la lista blanca o negra los parámetros
+ Las casillas de verificación y los valores configurados tienen preferencia sobre las casillas y valores globales; las cajas y valores vacíos no tienen preferencia
+ The privacy database was reset, because it was corrupt
+ Se ha puesto mucho cuidado en el desarrollo y pruebas de XPrivacy,
+sin embargo no puedo garantizar que funcione sin ningún fallo para cada dispositivo y aplicación.
+\n\nÚselo bajo su responsabilidad. \n\nVéase también el permiso:
+ Cuentas (Google, Facebook, etc)
+ Navegador (marcadores/historial)
+ Calendario
+ Llamadas (teléfono, SMS, MMS)
+ Portapapeles
+ Contactos
+ Diccionario (usuario)
+ Correo
+ Identificación (dispositivo)
+ Internet
+ Ubicación (fina/gruesa)
+ Medios (audio, foto, video)
+ Mensajes (SMS, MMS)
+ Red (direcciones)
+ Notificaciones
+ Superposición
+ Teléfono (ID, números, llamadas)
+ Sensores
+ Almacenamiento (media, tarjeta SD)
+ Terminal (comandos, superusuario)
+ Sistema (aplicaciones instaladas)
+ Ver (navegador)
+ Impide el acceso a acciones e información de vistas
+ Impide el acceso a información del sistema, como aplicaciones instaladas
+ Impide el acceso a comandos de terminal, incluyendo comandos de superusuario
+ Impide el acceso al almacenamiento, como archivos en la tarjeta SD o el almacenamiento interno
+ Impide el acceso a los sensores, como el sensor de movimiento
+ Impide el acceso a información del teléfono,como tu número de teléfono
+ Impide las ventanas superpuestas para impedir el phising
+ Impide el acceso a notificaciones del sistema, de aplicaciones y de Google Cloud Messaging
+ Impide el acceso al uso del NFC
+ Impide el acceso a información de red, como las direcciones MAC e IP e información de la red Wi-Fi
+ Impide el acceso a mensajes almacenados y recibidos (SMS/MMS) y al buzón de voz
+ Impide el acceso a la cámara (fotos y vídeos) y el micrófono
+ Impide el acceso a tu ubicación (precisa o aproximada)
+ Impide comunicaciones inter-procesos, cuando se usan para saltarse otras restricciones
+ Impide el acceso a Internet
+ Impide el acceso a información que le podría identificar, como el número serie de su dispositivo
+ Impide el acceso a información de e-mail, como direcciones y mensajes (sólo para la aplicación estándar de correo y GMail)
+ Impide el acceso al dicionario del usuario
+ Impide el acceso a información de sus contactos
+ Impide el acceso a información del portapapeles
+ Impide las llamadas, los mensajes y el acceso a tu registro de llamadas
+ Impide el acceso a información del calendario, como citas y reuniones
+ Impide el acceso a información del navegador, como marcadores e historial de descargas
+ Impide el acceso a información de la cuenta, como la cuenta de Google, incluyendo la dirección de GMail
+ Direcciones
+ Acción
+ Direcciones IP
+ Librerías nativas
+ Nombres de método
+ Nombres de archivo
+ Comandos de terminal
+ URLs
+ Transacciones
+ Permisos
+ Seleccione para restringir:
+ Seleccione para permitir:
+ Filtrar uso de datos
+ Filtrar acceso a Internet
+ Filtrar permisos Android
+ Filtrar permisos restringidos
+ Filtrar aplicaciones de usuario
+ Filtrar bajo petición
+ Filtrar aplicaciones de sistema
+ Negar
+ Por nombre
+ Por UID
+ Por fecha de instalación
+ Por fecha de actualización
+ Por fecha de modificación (XPrivacy)
+ Por estado (XPrivacy)
+ Invertir orden
+ Intento de uso de:
+ Categoría:
+ Función:
+ Parámetros:
+ Aplicar a toda la categoría
+ Una vez para
+ Lista blanca/negra \'%s\'
+ Permitir
+ Denegar
+ No sé
+ Por favor suba sus restricciones para ayudar a otros usuarios
+ Permisos
+ Restringir
+ Aplicar plantilla (categorías)
+ Aplicar plantilla (categorías y funciones)
+ Aplicar plantilla (unir conjunto)
+ Aplicar plantilla (reiniciar unión)
+ Habilitar restricciones a petición
+ Deshabilitar restricciones a petición
+ El tiempo de espera:
+ Reiniciará
+ Restablecerá por defecto
+ Alternará
+ Rename
+ Uso
+ 1. Busca la aplicación a restringir en la lista principal de aplicaciones
+ 2. Pulsa en el icono de la aplicación
+ 3. Pulsa en la primera casilla de cualquier categoría que quiera restringir
+ Use el sentido común al restringir: no espere acceso a internet si ha restringido el acceso a la categoría de internet, etc.
+ Mantén pulsado en el título para activar funciones peligrosas
+ Aplicando las restricciones a la categoría restablecerá las excepciones de las funciones a los valores por defecto
+ Documentación de las funciones
+ es inseguro,puede ser burlado
+ Comprobando actualizaciones
+ Descargando actualización
+ Pulsa para instalar la actualización
+ No hay actualizaciones disponibles
+ XPrivacy 2 está desactualizado, por favor considere actualizar a XPrivacy 3
+ Original
+ # de serie
+ Latitud
+ Longitud
+ Altitud
+ Dirección MAC
+ Dirección IP
+ Número de Teléfono
+ ID de Android
+ ID de Publicidad
+ País
+ Operador
+ ID de suscriptor
+ Agente de usuario
+ General
+ Datos falsos
+ Notificaciones de actualización
+ Restringir a petición
+ Añadir a la lista negra cuentas, apps y contactos
+ Registro de depuración (requiere inicio)
+ Modo experto
+ Intervalo de confianza para bajar restricciones
+ Funciones experimentales (requiere reinicio)
+ Usar conexiones seguras
+ Restringir componentes del sistema (Android) (requiere reinicio)
+ Mostrar uso de datos de las aplicaciones (requiere reinicio)
+ Mostrar parámetros del uso de datos
+ Show values of usage data
+ ID de celda GSM
+ GSM LAC
+ Peculiaridades
+ Modo AOSP (requiere reinicio)
+ Primera casilla: restringir función o categoría
+ Segunda casilla: restringir a petición
+ Interruptor general: habilitar/deshabilitar todas las restricciones
+ Click largo sobre un nombre selecciona la aplicación
+ Se le preguntará por las restricciones
+ Aplicación
+ Tiene acceso a Internet
+ Tiene permisos Android
+ Ha usado estos datos
+ No ha usado estos datos
+ Esta deshabilitado
+ Es peligroso, restringirlo puede causar problemas
+ Restringido parcialmente
+ Las restricciones requieren su atención
+ Restricciones cambiadas
+ Restricciones subidas
+ tiene valores falsos de aplicación específicos
+ Seleccione la categoría que quiere restringir
+ Pulsa una casilla para restringir la categoría seleccionada para la aplicación\n
+\nLas aplicaciones no recibirán información o se les proporcionará información falsa\n
+\nPulsa el icono de la aplicación para ver las restricciones detalladas y algunas opciones
+ Pulsa el icono de la aplicación para ver más opciones
+ Pulsa una flecha para ver las funciones que engloba la categoría
+ Administrar aplicaciones, incluido finalizar procesos
+ Administrar configuraciones y restricciones de XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-fa/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-fa/strings.xml
new file mode 100644
index 0000000..a42bf55
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-fa/strings.xml
@@ -0,0 +1,258 @@
+
+
+
+
+ نرم افزار ایکس پرایویسی در نصب کننده ی اکیس پوزد فعال نشده است
+ 4.0.3+ فقط برای اندروبد ورژن
+ XPrivacy is incompatible with %s
+ نرم افزار ایکس پرایویسی ورژن: %s (%d)
+ The ultimate privacy manager
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Running in compatibility mode
+ License found, thanks for your support!
+ کاربرد
+ تازه سازی
+ تنظیمات
+ قالب
+ گزارش مشکلات
+ خارج کردن
+ وارد کردن
+ ثبت محدودیت ها
+ واکشی محدودیت ها
+ تغییر زمینه
+ ورژن پرو
+ درباره ی نرم افزار
+ راهنما
+ Select all
+ Sort
+ Filter
+ همه
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ پاک کردن
+ دسترسی
+ جزییات نرم افزار
+ پلی استور
+ Kill
+ حساب هایی را که اجازه می دهید انتخاب کنید
+ Select applications to allow
+ تماس هایی را که احازه می دهید انتخاب کنید
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ در حال بارگذاری
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ آبااطمینان دارید؟
+ Please select some applications
+ Please select fewer than %d applications
+ انحام شد
+ لازم است دستگاه خاموش و روشن گردد
+ رندم سازی
+ Randomize on access
+ رندم سازی پس از روشن شدن مجدد
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ نرم افزار ایکس پرایوسی با دقت بالایی تولید و تست شده است، با این وجود تضمینی برای عملکرد صحیح
+این نرم افزار بر روی تمامی دستگاه ها و در مورد تمامی نرم افزارها وجود ندارد.
+\n\n ریسک استفاده از این نرم افزار بر عهده ی شما می باشد \n\n:همچنین پروانه ی برنامه را مشاهده کنید
+ حساب ها (گوگل، فیس بوک و غیره)
+ مرورگر (نشانک ها، سابقه)
+ تقویم
+ تماس ها (تلفن، اس ام اس، ام ام اس)
+ کلیپ برد
+ تماس ها
+ واژه نامه (کاربر)
+ E-mail
+ کد شناسایی (دستگاه)
+ اینترنت
+ (خوب، بد)
+ رسانه (صوت تصویر، ویدیو، تصویر)
+ پیغام ها (اس ام اس، ام ام اس)
+ شبکه (آدرسها)
+ اخطارها
+ Overlay
+ تلفن (شناسه، شماره، تماس ها)
+ Sensors
+ مخزن (مدیا، اس دی کارت)
+ شل (فرامین، ابر کاربر)
+ سیستم (نرم افزارهای نصب شده)
+ نما (مرورگر)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ برای محدود شدن انتخاب کنید:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ شماره سریال
+ عرض جغرافیایی
+ طول جغرافیایی
+ Altitude
+ آدرس مک
+ آدرس آی پی
+ شماره تلفن
+ شناسه اندروید
+ Advertisement ID
+ کشور
+ اپراتور
+ شناسه مشترک
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ لاگ ایرادیابی (نیازمند دوباره راه اندازی می باشد)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ برنامه های کاربردی
+ مجوز استفاده از اینترنت را دارد
+ مجوز اندروید را دارد
+ از این داده استفاده کرده است
+ no usage data available
+ غیر فعال است
+ خطرناک است
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-fi/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-fi/strings.xml
new file mode 100644
index 0000000..6f5e7f4
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-fi/strings.xml
@@ -0,0 +1,255 @@
+
+
+ XPrivacy ei ole enabloitu Xposed asennusohjelmassa
+ Vain Android versiolle 4.0.3+
+ XPrivacy is incompatible with %s
+ XPrivacy versio: %s (%d)
+ The ultimate privacy manager
+ Tekijänoikeus \u00A9 2013–2015 M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Käyttötiedot
+ Päivitä
+ Asetukset
+ Pohja
+ Raportoi asia
+ Vie
+ Tuo
+ Aseta rajoitukset
+ Hae rajoitukset
+ Vaihda teema
+ Pro versio
+ Tietoja
+ Apua
+ Select all
+ Sort
+ Filter
+ Kaikki
+ Vaihda rajoitukset
+ Clear all
+ Clear
+ Clear all data
+ Vaihda suodatin
+ Aseta pohja
+ Tyhjennä
+ Käynnistä
+ Applikaation tarkemmat tiedot
+ Play Store
+ Kill
+ Valitse sallittavat tilit
+ Valitse sallittavat applikaatiot
+ Valitse sallittavat kontaktit
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ Uusi
+ Päivitä
+ Lataa
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ Oletko varma?
+ Please select some applications
+ Please select fewer than %d applications
+ Valmis
+ Laite on käynnistettävä uudelleen
+ Randomize now
+ Randomize on access
+ Satunnaista uudelleenkäynnistyksen jälkeen
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Xprivacy on tehty ja testattu huolellisesti, mutta on kuitenkin mahdotonta antaa takeita että se toimii virheettömästi kaikissa laitteissa ja jokaisessa applikaatiossa.
+\n\nKäyttö on täysin omalla vastuullasi. \n\nKatso myös lisenssi:
+ Tilit (Google, Facebook, jne)
+ Selain (kirjanmerkit/historia)
+ Kalenteri
+ Soittotiedot (puhelin, SMS, MMS)
+ Leikepöytä
+ Kontaktit
+ Sanakirja (käyttäjä)
+ Sähköposti
+ Tunniste (laite)
+ Internet
+ Sijainti (tarkka/karkea)
+ Media (ääni, kuva, video)
+ Viestit (SMS, MMS)
+ Verkko (osoitteet)
+ Ilmoitukset
+ Overlay
+ Puhelin (ID, numerot, puhelut)
+ Sensorit
+ Muisti (media, SD-kortti)
+ Komentorivi (komennot, superuser)
+ Järjestelmä (asennetut ohjelmat)
+ Katso (selaimessa)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Valitse rajoittaaksesi:
+ Check to allow:
+ Suodata datan käyttöön
+ Suodata internet yhteyksiin
+ Suodata käyttöoikeuksiin
+ Suodata rajoitettuihin
+ Suodata käyttäjän applikaatioihin
+ Filter by on-demand
+ Suodata järjestelmän applikaatioihin
+ invertoi
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ sarjanumero#
+ Latituudi
+ Longituudi
+ Altitude
+ MAC osoite
+ IP osoite
+ Puhelinnumero
+ Android ID
+ Mainos ID
+ Maa
+ Operaattori
+ Tilaajan ID
+ User agent
+ General
+ Fake data
+ Päivitä ilmoitukset
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debuggaus logi (vaatii uudelleenkäynnistyksen)
+ Expert tila
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Applikaatio
+ on internet käyttöoikeus
+ on Android käyttöoikeus
+ on käyttänyt tätä dataa
+ no usage data available
+ on disabloitu
+ on vaarallinen, rajoitus voi aiheuttaa ongelmia
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-fr/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-fr/strings.xml
new file mode 100644
index 0000000..aa5ca60
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-fr/strings.xml
@@ -0,0 +1,257 @@
+
+
+ XPrivacy n\'est pas activé dans l\'installateur Xposed
+ Uniquement pour Android 4.0.3 et ultérieur
+ XPrivacy est incompatible avec %1$s
+ Version XPrivacy : %1$s (%2$d)
+ L\'ultime gestionnaire de vie privée
+ Droits d\'auteur : M. Bokhorst (M66B) \u00A9 2013–2015
+ XPrivacy est exécuté en mode de compatibilité
+ Licence trouvée, merci pour votre soutien !
+ Usage
+ Rafraîchir
+ Paramètres
+ Modèle
+ Signaler un problème
+ Exporter
+ Importer
+ Envoyer ses restrictions
+ Télécharger les restrictions
+ Changer de thème
+ Version pro
+ À propos
+ Aide…
+ Tout sélectionner
+ Trier
+ Filtrer
+ Tous
+ Inverser restrictions
+ Tout effacer
+ Effacer
+ Effacer toutes les données XPrivacy
+ Basculer toutes/restreintes
+ Appliquer le modèle
+ Effacer
+ Lancer
+ Infos sur l\'application
+ Play Store
+ Tuer
+ Choisir les comptes à autoriser
+ Choisir les applis à autoriser
+ Choisir les contacts à autoriser
+ Gérer les listes blanches
+ Didacticiel
+ Journal des modifications
+ Vider le cache
+ Rechercher des mises à jour
+ Opérations…
+ Légende
+ Arrêt en cours
+ Arrêté
+ Nouv. :
+ MàJ :
+ Chargement…
+ Application en cours…
+ Modèle appliqué
+ Sauvé dans %1$s
+ Pas de restriction trouvée
+ Êtes-vous certain ?
+ Choisissez quelques applications
+ Choisissez moins de %1$d applications
+ Effectué
+ Redémarrage requis
+ Randomiser maintenant
+ Randomiser à chaque accès
+ Randomiser après le démarrage
+ Redémarrage de l\'application nécessaire
+ Inscrivez votre appareil, s.v.p.
+ Veuillez entrer votre adresse e-mail :
+ Vérifiez vos mails pour activer votre appareil
+ Service de mise à jour en fonctionnement
+ Migration %1$s
+ Randomisation %1$s
+ Mise à niveau %1$s
+ Une vérification interne a échoué, voulez-vous envoyer le rapport d\'erreurs ?
+ Restreint par XPrivacy
+ Service Privacy non trouvé : avez-vous activé XPrivacy dans l\'installateur Xposed et redémarré votre appareil ?
+ Décalage de la version du service Privacy : avez-vous redémarré votre appareil après la mise à niveau de XPrivacy ?
+ Veuillez patienter le temps que le service de mise à jour termine son travail.
+ Les utilisateurs expérimentés sont sensés résoudre leurs problèmes par eux-mêmes, de suivre le forum de XPrivacy sur XDA et d\'aider les autres si possible
+ La restriction des fonctions est destinée aux utilisateurs expérimentés. Êtes-vous un expert ?
+ Faites un appui long sur le nom d\'une fonction pour mettre les paramètres en liste blanche/noire
+ À partir du moment où une option est cochée ou une valeur est définie, celle-ci remplacera l\'option ou la valeur globale correspondante
+ La base de données a été réinitialisée car elle était endommagée
+ Un grand soin est apporté au développement et aux tests de XPrivacy. Toutefois,
+il est impossible de garantir un fonctionnement parfait sur chaque appareil et pour chaque application.
+\nSon utilisation est à vos risques et périls ! \n\nVeuillez prendre connaissance de la licence :
+ Comptes (Google, Facebook, etc)
+ Navigateur (marque-pages/historique)
+ Calendrier
+ Appels (Téléphone, SMS, MMS)
+ Presse-papiers
+ Contacts
+ Dictionnaire (utilisateur)
+ E-mail
+ Identification (Matériel)
+ Internet
+ Localisation (précise/approximative)
+ Média (audio, photo, vidéo)
+ Messages (SMS, MMS)
+ Réseaux (adresses)
+ Notifications
+ Recouvrement
+ Téléphone (ID, numéros, appels)
+ Capteurs
+ Stockage (média, carte SD)
+ Shell (commandes, root)
+ Système (applis installées)
+ Vue (navigateur)
+ Restreindra l\'accès aux informations et actions sur les vues
+ Restreindra l\'accès aux informations du système, comme les applis installées
+ Restreindra l\'accès aux commandes shell, y compris les commandes de super-utilisateur
+ Restreindra l\'accès au stockage, comme les fichiers sur votre carte SD ou la mémoire interne
+ Restreindra l\'accès aux capteurs, comme le détecteur de mouvement
+ Restreindra l\'accès aux informations du téléphone, comme votre numéro de téléphone
+ Restreindra les fenêtres superposées pour empêcher l\'hameçonnage
+ Restreindra l\'accès aux notifications du système et des applis ainsi que la messagerie en nuage Google
+ Restreindra l\'accès à la communication en champ proche
+ Restreindra l\'accès aux informations sur le réseau, comme les adresses IP et MAC et les informations sur le réseau Wi-Fi
+ Restreindra l\'accès aux messages reçus et sauvegardés (SMS / MMS) et la messagerie vocale
+ Restreindra l\'accès à la caméra (photos et vidéos) et le microphone
+ Restreindra l\'accès à votre localisation approximative et précise
+ Restreindra la communication inter-processus, lorsqu\'elle est utilisée pour contourner d\'autres restrictions
+ Restreindra l\'accès à Internet
+ Restreindra les informations permettant de vous identifier, comme le numéro de série de votre appareil
+ Restreindra l\'accès aux informations e-mail, comme les adresses et les messages (application standard et G-mail seulement)
+ Restreindra l\'accès au dictionnaire utilisateur
+ Restreindra l\'accès aux informations sur vos contacts
+ Restreindra l\'accès aux données dans le presse-papiers
+ Restreindra l\'appel de numéros téléphoniques, l\'envoi de messages (SMS / MMS) et l\'accès à l\'historique de vos appels
+ Restreindra l\'accès aux informations de votre calendrier, comme vos rendez-vous
+ Restreindra l\'accès aux informations du navigateur, comme vos signets et l\'historique des téléchargements
+ Restreindra l\'accès aux informations de compte, comme votre compte Google, y compris votre adresse G-mail
+ Adresses
+ Action
+ Adresses IP
+ Bibliothèques natives
+ Nom de la méthode
+ Noms de fichier
+ Commandes shell
+ URLs
+ Transactions
+ Permissions
+ Cocher pour restreindre :
+ Cocher pour autoriser
+ Filtrer utilisation des données
+ Filtrer ayant accès à Internet
+ Filtrer par permissions
+ Filtrer restreintes
+ Filtrer les applis utilisateur
+ Filtrer par sur-demande
+ Filtrer les applis système
+ Inverser
+ Par nom
+ Par uid
+ Par date d\'installation
+ Par date de mise à jour
+ Par date de modification (XPrivacy)
+ Par statut (XPrivacy)
+ Inverser l\'ordre
+ Tentative d\'utilisation de :
+ Catégorie :
+ Fonction :
+ Paramètres :
+ Appliquer à toute la catégorie
+ Une fois pendant
+ Se souvenir de ‘%1$s’
+ Autoriser
+ Bloquer
+ Je ne sais pas
+ Veuillez envoyer vos restrictions pour aider les autres utilisateurs
+ Permissions
+ Restreindre la sélection
+ Appliquer le modèle (seulement les catégories)
+ Appliquer tout le modèle (catégories et fonctions)
+ Appliquer le modèle (fusionner)
+ Appliquer le modèle (fusionner à l\'inverse)
+ Activer \"restreindre sur demande\"
+ Désactiver \"restreindre sur demande\"
+ Temps écoulé fera :
+ Remettre
+ Défaut
+ Alternative
+ Renommer
+ Usage
+ 1. Trouvez l\'appli à restreindre dans la liste principale des applis
+ 2. Appuyez sur l\'icône de l\'appli
+ 3. Cochez la première case d\'une catégorie que vous souhaitez restreindre
+ Utilisez votre bon sens ! Ne vous attendez pas à avoir accès à Internet si vous avez restreint la catégorie Internet.
+ Maintenez appuyé le titre pour inverser les fonctions dangereuses
+ L\'application à la catégorie réinitialisera les exceptions des fonctions à leurs valeurs par défaut
+ Documentation des fonctions
+ Restriction dangereuse, peut être contournée
+ Recherche de mise à jour
+ Mise à jour en cours de téléchargement
+ Appuyez pour installer la mise à jour
+ Pas de mise à jour disponible
+ XPrivacy 2 n\'est plus supporté, veuillez envisager de passer à XPrivacy 3.
+ Original
+ N° de série
+ Latitude
+ Longitude
+ Altitude
+ Adresse MAC
+ Adresse IP
+ N° de téléphone
+ ID Android
+ ID publicité
+ Pays
+ Opérateur
+ ID Abonné
+ Agent utilisateur
+ Général
+ Fausses données
+ Notifications de MàJ
+ Restrictions sur demande
+ Liste noire pour des comptes, des applis et des contacts
+ Journal de débogage (redémarrage requis)
+ Mode expert
+ Intervalle de confiance maximum
+ Fonctions expérimentales (redémarrage requis)
+ Utiliser des connexions sécurisée
+ Restreindre composants système (Android) (redémarrage requis)
+ Montrer les données d\'usage pour chaque application (redémarrage requis)
+ Montrer les paramètres fournis aux fonctions dans les données d\'usage
+ Afficher les valeurs des données d\'usage
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ Mode AOSP (redémarrage requis)
+ Première case : restreindre la catégorie ou la fonction
+ Deuxième case : restreindre sur demande ; la première case détermine la valeur par défaut
+ Interrupteur marche / arrêt : activer ou désactiver toutes les restrictions
+ Maintenez appuyé le nom de l\'appli pour la sélectionner
+ Détermination des restrictions sur demande
+ Application
+ a les permissions Internet
+ a les permissions Android
+ a utilisé ces données
+ pas de donnée d\'usage disponible
+ est désactivée
+ est dangereuse, restreindre peut causer des problèmes
+ partiellement restreinte
+ les restrictions ont besoin d\'attention
+ les restrictions sont changées
+ les restrictions sont envoyées
+ a de fausses données définies spécifiquement
+ Sélectionnez la catégorie à restreindre.
+ Cocher la première case pour restreindre la catégorie choisie pour l\’appli.\n
+\nCochez la seconde case pour restreindre à la demande.\n
+\nL’appli sera dupée par des données vides ou modifiées.\n
+\nAppuyez sur l\'icône ou le nom de l\’appli pour les restrictions détaillées et les paramètres.
+ Appuyez sur l\'icône pour plus d’actions.
+ Appuyez sur la flèche vers les bas pour voir les exceptions d’une catégorie de restrictions.
+ Gérer les applications, y compris les tuer
+ Gérer les restrictions et les paramètres XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ga/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ga/strings.xml
new file mode 100644
index 0000000..f647d60
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ga/strings.xml
@@ -0,0 +1,256 @@
+
+
+ Ní XPrivacy chumasú i an suiteálaí Xposed
+ Ach amháin le haghaidh Android version 4.0.3+
+ XPrivacy is incompatible with %s
+ XPrivacy leagan: %s (%d)
+ The ultimate privacy manager
+ Cóipcheart \ u00A9 2013–2015 le M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Úsáid
+ Athnuaigh
+ Socruithe
+ Teimpléad
+ Eisiúint Tuarascáil
+ Easpórtáil
+ Iompórtáil
+ Cuir srianta
+ Faigh srianta
+ Athraigh téama
+ Gairmiúla leagan
+ Maidir
+ Cabhair
+ Select all
+ Sort
+ Filter
+ Gach
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Cuir teimpléad
+ Geal
+ Seoladh
+ sonraí App
+ Store Súgartha
+ Kill
+ Roghnaigh cuntais a cheadú
+ Select applications to allow
+ Roghnaigh cuntais a cheadú
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ Nua
+ Nuashonrú
+ Loading
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ An bhfuil tú cinnte?
+ Please select some applications
+ Please select fewer than %d applications
+ Arna dhéanamh
+ Atosú teastáil
+ Randomize now
+ Randomize on access
+ Randamaigh tar éis tosaithe
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ cúram mór aire do a fhorbairt agus a thástáil XPrivacy,
+áfach, go bhfuil sé dodhéanta a ráthú go mbeidh sé obair flawless ar gach gléas agus do gach agus gach iarratas.
+\n\nBain úsáid as ar do phriacal féin. \n\nFéach freisin an ceadúnas:
+ Cuntais (Google, Facebook, etc)
+ Brabhsálaí (leabharmharcanna/stair)
+ Féilire
+ Ag glaoch ar (fón, SMS, MMS)
+ Clipboard
+ Teagmhálacha
+ Foclóir (úsáideoir)
+ R-phost
+ Aitheantais (gléas)
+ Idirlíon
+ Suíomh (fíneáil / garbh)
+ Meáin (fuaime, grianghraf, físeán)
+ Teachtaireachtaí (SMS, MMS)
+ Líonra (seoltaí)
+ Fógraí
+ Overlay
+ Fón (ID, uimhreacha, glaonna)
+ Sensors
+ Stóráil (meáin, SD-cárta)
+ Shell (orduithe, fhorúsáideoir)
+ Córas (suiteáilte apps)
+ Amharc (bhrabhsálaí)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Seiceáil chun srian a chur ar:
+ Check to allow:
+ Scagaire ar úsáid sonraí
+ ar rochtain ar an idirlíon
+ Scagaire ar chead
+ Scagaire ar shrianta
+ ar iarratais úsáideora
+ Filter by on-demand
+ Scagaire maidir le hiarratais ar chóras
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Sraithuimhir#
+ TX
+ Domhanfhad
+ Altitude
+ MAC seoladh
+ seoladh IP
+ uimhir Fón
+ ID Android
+ Advertisement ID
+ Tír
+ Oibreoir
+ ID Suibscríobhaí
+ gníomhaire Úsáideoir
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ logáil Debug (Éilíonn atosú)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Iarratais
+ Tá cead idirlín
+ Tá cead Android
+ Tá úsáid na sonraí seo
+ no usage data available
+ faoi mhíchumas
+ contúirteacha
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-he/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-he/strings.xml
new file mode 100644
index 0000000..9476a3a
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-he/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy אינו מאופשר במתקין Xposed
+ Only for Android version 4.0.3+
+ XPrivacy is incompatible with %s
+ גירסא XPrivacy\u200F: %s (%d)
+ The ultimate privacy manager
+ כל הזכויות שמורות \u00A9 2013–2015 על ידי מ Bokhorst (M66B)\u200E
+ Running in compatibility mode
+ License found, thanks for your support!
+ Usage
+ Refresh
+ הגדרות
+ תבנית ברירת מחדל
+ דווח תקלה
+ ייצא
+ ייבא
+ Submit restrictions
+ Fetch restrictions
+ שינוי צבעי רקע
+ גירסת Pro
+ אודות
+ Help …
+ Select all
+ Sort
+ Filter
+ בחר הכול
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ Clear
+ הפעל
+ הגדרות
+ חנות Google Play
+ Kill
+ בחר חשבונות לאפשר
+ Select applications to allow
+ בחר אנשי קשר לאפשר
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ טוען
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ אתה בטוח?
+ Please select some applications
+ Please select fewer than %d applications
+ בוצע
+ נדרש אתחול מחדש
+ Randomize
+ Randomize on access
+ Randomize after boot
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Great care has been taken to develop and test XPrivacy,
+however it is impossible to guarantee it will work flawless on each and every device and for each and every application.
+\n\nUse is entirely at your own risk. \n\nSee also the license:
+ חשבונות (גוגל, פייסבוק, וכו\')
+ דפדפן (מועדפים / היסטוריה)
+ יומן
+ שיחות (טלפון, SMS, MMS)
+ Clipboard
+ אנשי קשר
+ מילון (משתמש)
+ E-mail
+ זיהוי (מכשיר)
+ אינטרנט
+ מיקום (fine/coarse)
+ מדיה (אודיו, תמונות, וידאו)
+ הודעות (SMS, MMS)
+ רשת (כתובות)
+ Notifications
+ Overlay
+ טלפון (זיהוי, מספרים, שיחות)
+ Sensors
+ אחסון (מדיה, כרטיס SD)
+ Shell (commands, superuser)
+ מערכת (יישומים מותקנים)
+ גישה (דפדפן)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ בחר להגביל:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serial#
+ קו אורך
+ קו רוחב
+ Altitude
+ כתובת MAC
+ IP address
+ מספר טלפון
+ אנדרואיד ID
+ Advertisement ID
+ מדינה
+ Operator
+ מנוי ID
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ יישום
+ כולל הרשאות גישה לאינטרנט
+ כולל הרשאות גישה לאנדרואיד
+ קיבל גישה להרשאה זו
+ no usage data available
+ is disabled
+ מסוכן
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-hi/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-hi/strings.xml
new file mode 100644
index 0000000..c999900
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-hi/strings.xml
@@ -0,0 +1,256 @@
+
+
+ Xposed इनस्टॉलर मैं XPrivacy इनेबल नहीं हैं
+ सिर्फ Android वर्शन 4.0.3+ के लिये
+ XPrivacy के साथ असंगत है %s
+ XPrivacy वर्शन: %s (%d)
+ Tपरम गोपनीयता प्रबंधक
+ सर्वाधिकार \u00A9 2013–2015 द्वारा M. Bokhorst (M66B)
+ संगतता मोड में चल रहा है
+ अपने समर्थन के लिए लाइसेंस, धन्यवाद!
+ उपयोग
+ पुन: करे
+ सेटिंग्स
+ नमूना
+ मुद्दे को रिपोर्ट करे
+ निर्यात
+ आयात
+ प्रतिबंध प्रस्तुत करे
+ प्रतिबंध डाउनलोड करे
+ रचना बदले
+ उन्नत वर्शन
+ जानकारी
+ मदद
+ सभी का चयन करें
+ प्रकार
+ फ़िल्टर
+ प्रत्येक
+ प्रतिle करे
+ सब साफ करे
+ साफ
+ सभी डेटा साफ़
+ फिल्टर toggle करे
+ टेम्पलेट लागू करें
+ साफ़ करे
+ चालू करे
+ App का विवरण
+ Play Store
+ मार
+ अनुमति के लिए खातों को चुने
+ अनुमति के लिए applications को चुने
+ अनुमति के लिए संपर्क को चुने
+ Manage whitelists
+ शिक्षा
+ चैंज
+ फ्लश कैश
+ अद्यतन के लिए जाँच करें
+ संचालन …
+ किंवदंती
+ छोड़ रहा हैै
+ छोड
+ नया
+ अद्यतन
+ लोडिंग
+ लागु हो रहा हैं
+ टेम्पलेट लागु हो गया
+ %s मे सेव हो गया
+ कोई प्रतिबंध नहीं मिला
+ क्या आप निश्चित हैं?
+ कुछ अनुप्रयोगों का चयन करें
+ %d आवेदनों की तुलना में कम का चयन करें
+ हो गया
+ साधन पुनरारंभ करना आवश्यक
+ अटपटा करे
+ उपयोग पर अटपटा करें
+ रिबूट के पश्चात अटपटा करे
+ आवेदन पुनःप्रारंभ जरुरी
+ आपके डिवाइस रजिस्टर कृपयाया
+ अपने ई-मेल पता दर्ज करें:
+ अपने डिवाइस को सक्रिय करने के लिए अपने ई-मेल की जाँच करें
+ अद्यतन सेवा चल रहा है
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ XPrivacy बनाने मैं बहुत ख्याल रखा गया है,
+किन्तु वह सभी साधन और सभी application के लिए बरोबर चलेगा उसकी गारंटी देना असंभव है।
+\n\nइसका उपयोग पूरी तरह से आपके अपने जोखिम पर है। \n\nलाइसेंस को भी पढ़े:
+ खाता (गूगल, फेसबुक, इत्यादी)
+ ब्राउज़र (बुकमार्क्स/वृत्तांत)
+ कैलेंडर
+ कालिंग (फ़ोन, SMS, MMS)
+ क्लिपबोर्ड
+ संपर्क
+ शब्दकोश (उपयोगकर्ता)
+ ई-मेल
+ पहचान (साधन)
+ इंटरनेट
+ स्थान (स्पस्ट/कच्चा)
+ मीडिया (ऑडियो, फ़ोटो, वीडियो)
+ संदेश (SMS, MMS)
+ नेटवर्क (addresses)
+ सूचनाएं
+ Overlay
+ फ़ोन (ID, संख्या, कॉल)
+ Sensors
+ स्टोरेज (मीडिया, SD card)
+ Shell (आदेश, superuser)
+ सिस्टम (इन्सटाल्ड apps)
+ View (ब्राउज़र)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ प्रतिबंधित करने के लिए मार्क करे:
+ Check to allow:
+ डेटा उपयोग पर फिल्टर करे
+ इन्टरनेट उपयोग पर फिल्टर करे
+ अनुमति के द्वारा फिल्टर करे
+ प्रतिबंध पर फिल्टर करे
+ उपयोगकर्ता की Applications पर फिल्टर करे
+ Filter by on-demand
+ सिस्टम की Applications पर फिल्टर करे
+ नकारे
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ क्रमांक#
+ अक्षांश
+ रेखांश
+ Altitude
+ MAC address
+ IP address
+ फ़ोन संख्या
+ Android ID
+ विज्ञापन ID
+ देश
+ ऑपरेटर
+ ग्राहक क्रमांक
+ User agent
+ सामान्य
+ नकली डेटा
+ अद्यतन सुचना
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (पुनरारंभ जरूरी)
+ विशेषज्ञ mode
+ अधिकतम विश्वसनीय fetch अंतराल
+ प्रायोगिक कार्य (पुनःप्रारंभ जरुरी)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Application
+ इंटरनेट की अनुमति है
+ Android की अनुमति है
+ इस डेटा का उपयोग किया है
+ no usage data available
+ अक्षम किया गया है
+ खतरनाक है
+ आंशिक प्रतिबंध
+ प्रतिबंध पर ध्यान आवश्यक
+ प्रतिबंध बदले गए
+ प्रतिबंध submit हो गए
+ has application specific fake values
+ Select the category to restrict
+ App कि चुनी गयी श्रेणी को प्रतिबंधित करने के लिए checkbox tap करे\n
+\nप्रतिबंधित श्रेणी के लिए Apps को खाली या नकली डेटा दिया जायेगा\n
+\nविस्तृत प्रतिबन्ध व settings के लिए app icon को tap करे
+ अधिक कार्य के लिए app icon को tap करे
+ प्रतिबंधित श्रेणी के अपवाद देखने के लिए down arrow को tap करे
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-hr/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-hr/strings.xml
new file mode 100644
index 0000000..dc82c06
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-hr/strings.xml
@@ -0,0 +1,253 @@
+
+
+ XPrivacy modul nije uključen u Xposed installeru
+ Samo za Android verziju 4.0.3+
+ XPrivacy nije kompatibilan s %1$s
+ XPrivacy verzija: %1$s (%2$d)
+ Ultimativni upravitelj privatnošću
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licenca odobrena, hvala vam na vašoj podršci!
+ Podaci korištenja
+ Osvježi
+ Podešenja
+ Predložak
+ Prijavi problem
+ Izvezi
+ Uvezi
+ Predaj ograničenja
+ Dobavi ograničenja
+ Promijeni temu
+ Pro verzija
+ O aplikaciji
+ Pomoć
+ Označi sve
+ Sortiraj
+ Filtriraj
+ Sve
+ Uključi/Isključi ograničenja
+ Izbriši sve
+ Izbriši
+ Izbriši sve XPrivacy podatke
+ Uključi/Isključi filter
+ Primijeni predložak
+ Izbriši
+ Otvori
+ Podešenja
+ Trgovina Play
+ Zatvori
+ Odaberi dopuštene korisničke račune
+ Odaberi dopuštene aplikacije
+ Odaberi dopuštene kontakte
+ Odredi liste dopuštenih
+ Vodič
+ Changelog
+ Izbriši cache memoriju
+ Check for updates
+ Operations …
+ Legend
+ Zaustavljam
+ Zaustavljeno
+ Novo
+ Ažuriranje
+ Učitavam …
+ Primijenjujem …
+ Predložak primijenjen
+ Spremljeno u %1$s
+ Nisu nađene restrikcije
+ Jeste li sigurni?
+ Molimo odaberite aplikacije
+ Molimo odaberite manje od %1$d aplikacija
+ Gotovo
+ Uređaj zahtijeva ponovno pokretanje
+ Primijeni nasumični odabir sada
+ Primijeni nasumični odabir pri pristupu
+ Primijeni nasumični odabir pri pokretanju
+ Aplikacija zahtijeva ponovno pokretanje
+ Molimo registrirajte vaš uređaj
+ Molimo unesite vašu e-mail addresu:
+ Provjerite svoj e-mail kako bi aktivirali vaš uređaj
+ Usluga ažuriranja u tijeku
+ Prebacujem %1$s
+ Primijenjujem nasumični odabir %1$s
+ Nadograđujem %1$s
+ Interna kontrola nije uspjela, želite li poslati informacije za podršku?
+ Ograničeno od strane Xprivacy-a
+ Xprivacy usluga nije pronađena; jeste li uključili XPrivacy modul u Xposed Installer-u i ponovno pokrenuli svoj uređaj?
+ Verzija XPrivacy usluge ne odgovara; jeste li ponovno pokrenuli svoj uređaj nakon nadogradnje Xprivacy-a?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Unatoč velikoj pažnji koja je bila potrebna da bi se razvio i testirao Xprivacy, nemoguće je garantirati da će raditi savršeno na svakom uređaju i/ili za svaku aplikaciju.
+\n\nKoristiti isključivo na vlastitu odgovornost. \n\nTakođer pogledati licencu:
+ Korisnički računi
+ Internet preglednik
+ Kalendar
+ Pozivi
+ Međuspremnik
+ Kontakti
+ Rječnik
+ E-mail
+ Identifikacija
+ Internet
+ Lokacija
+ Mediji
+ Poruke
+ Mreža
+ Notifikacije
+ Prekrivanje
+ Telefon
+ Senzori
+ Memorija
+ Ljuska
+ Sustav
+ Pregled
+ Ograničava pristup pregledu akcija i informacija
+ Ograničava pristup informacijama sustava, poput liste instaliranih aplikacija
+ Ograničava pristup naredbama ljuske, poput superuser pristupa
+ Ograničava pristup memoriji, poput datoteka na SD kartici ili internoj memoriji
+ Ograničava pristup senzorima, poput senzora za automatsku rotaciju
+ Ograničava pristup informacijama telefona, poput vašeg telefonskog broja
+ Ograničava od prekrivanja i mrežne krađe identiteta
+ Ograničava pristup notifikacijama korisnika i sustava i Google cloud poruka
+ Ograničava pristup NFC-u
+ Ograničava pristup mrežnim informacijama, poput IP i MAC adresa kao i stanja Wi-Fi mreže
+ Ograničava pristup porukama (SMS i MMS) kao i govornoj pošti
+ Ograničava pristup kameri (foto i video) kao i mikrofonu
+ Ograničava pristup gruboj i finoj lokaciji
+ Ograničava komunikaciju između procesa, koja se koristi za zaobilaženje drugih ograničenja
+ Ograničava pristup internetu
+ Ograničava informacije koje vas mogu identificirati, poput serijskog broja vašeg uređaja
+ Ograničava pristup e-mail informacijama, poput adresa i poruka (samo standardna i G-mail applikacija)
+ Ograničava pristup korisničkom rječniku
+ Ograničava pristup vašim kontaktima i njihovim informacijama
+ Ograničava pristup informacijama u međuspremniku
+ Ograničava od uspostavljanja poziva, slanja poruka (SMS/MMS) i pristupa listi poziva
+ Ograničava pristup informacijama kalendara, poput zakazanih događaja
+ Ograničava pristup informacijama internet preglednika, poput povijesti i skidanja
+ Ograničava pristup korisničkim računima poput vašeg Google računa koji sadrži vašu Gmail adresu
+ Adrese
+ Akcija
+ IP adrese
+ Tvorničke baze podataka
+ Imena metoda
+ Imena datoteka
+ Naredbe ljuske
+ URL-ovi
+ Transakcije
+ Dozvole
+ Odabrati za ograničenje:
+ Odabrati za dopuštenje:
+ Filter po korištenju podataka
+ Filter po internet pristupu
+ Filter po dozvoli
+ Filter po ograničenom
+ Filter po aplikacijama korisnika
+ Filter po odabranim na zahtjev
+ Filter po aplikacijama sustava
+ Negiraj
+ Po imenu
+ Po uid-u
+ Po datumu instalacije
+ Po datumu ažuriranja
+ Po datumu zadnje promjene (XPrivacy)
+ Po stanju (XPrivacy)
+ Obrni red sortiranja
+ Pokušaj korištenja:
+ Kategorija:
+ Funkcija:
+ Parametri:
+ Primijeni na cijelu kategoriju
+ Once for
+ Dodaj na listu dopuštenih/ograničenih ‘%1$s’
+ Dopusti
+ Zabrani
+ Ne znam
+ Molimo izvezite vaša ograničenja kako bi pomogli drugima
+ Dozvole
+ Ograniči (kategorije)
+ Primijeni predložak (kategorije)
+ Primijeni predložak (kategorije+funkcije)
+ Primijeni predložak (spajanje)
+ Apply template (merge reset)
+ Uključi ograničenje na zahtjev
+ Isključi ograničenje na zahtjev
+ Odbrojavanje:
+ Reset
+ Početne vrijednosti
+ Izmjeni
+ Rename
+ Korištenje
+ 1. Nađite aplikaciju koju želite ograničiti u listi aplikacija
+ 2. Dodirnite ikonu aplikacije
+ 3. Dodirnite prvu kućicu kategorije koju želite ograničiti
+ Koristite zdrav razum kada ograničavate, nemojte očekivati pristup internetu ukoliko ste ograničili ketgoriju interneta, itd.
+ Dodirnite i zadržite na naslov za uključenje/isključenje opasnih funckija
+ Primjena na kategoriji će resetirati iznimke u funkciji na početne vrijednosti
+ Dokumenacija funkcija
+ je nesigurno, moguće zaobići
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serijski broj#
+ Geografska širina
+ Geografska dužina
+ Geografska visina
+ MAC adresa
+ IP adresa
+ Broj mobitela
+ Android ID
+ ID oglašavanja
+ Država
+ Mrežni operater
+ ID pretplatnika
+ Korisnički posrednik
+ Općenito
+ Lažni podaci
+ Ažuriranje notifikacija
+ Ograniči na zahtjev
+ Dodavanje korisničkih računa, aplikacija i kontakata na listu ograničenih
+ Debug zapisnik (zahtijeva ponovno pokretanje)
+ Način rada za eksperte
+ Maksimalni interval dohvata
+ Eksperimentalne funkcije (zahtijeva ponovno pokretanje)
+ Koristi sigurna povezivanja
+ Ograniči komponente sustava (Android)
+ Prikaži parametre o korištenju podataka od strane aplikacija
+ Prikaži parametre o korištenju podataka
+ Show values of usage data
+ ID GSM stanice
+ GSM LAC
+ Dosjetke
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Dodirnite i zadržite na ime za odabir
+ ograničenja će biti na upit
+ Aplikacija
+ ima pristup internetu
+ ima Android dozvole
+ ovi podaci su korišteni
+ nema podataka o korištenju
+ je onemogućeno
+ je opasno, ograničavanje može uzrokovati probleme
+ djelomično ograničeno
+ ograničenja zahtijevaju pažnju
+ ograničenja su promijenjena
+ ograničenja su izvezena
+ has application specific fake values
+ Odaberite kategoriju za ograničiti
+ Dodirnite kućicu za ograničavanje odabrane kategorije za aplikaciju\n\nAplikacijama će biti predani prazne ili lažni podaci\n\nDodirnite ikonu aplikacije za detaljan prikaz ograničenja i podešenja
+ Odaberite ikonu aplikacije za više mogućnosti
+ Odaberite strelicu dole da bi vidjeli funkcijske iznimke određene kategorije ograničenja
+ Upravljanje aplikacijama, uključujući zatvaranje
+ Upravljanje Xprivacy ograničenjima i podešenjima
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-hu/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-hu/strings.xml
new file mode 100644
index 0000000..e3af1cc
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-hu/strings.xml
@@ -0,0 +1,256 @@
+
+
+ Az XPrivacy nincs engedélyezve az Xposed telepítőben
+ Csak Android 4.0 felett
+ XPrivacy is incompatible with %s
+ XPrivacy verzió: %s (%d)
+ The ultimate privacy manager
+ Copyright \u00A9 2013–2015 M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Használat
+ Frissítés
+ Beállítások
+ Sablon
+ Probléma bejelentése
+ Exportálás
+ Importálás
+ Submit restrictions
+ Fetch restrictions
+ Téma váltás
+ Pro verzió
+ Névjegy
+ Segítség
+ Select all
+ Sort
+ Filter
+ Minden
+ Korlátozások kapcsolása
+ Összes törlése
+ Clear
+ Clear all data
+ Szűrő kapcsolása
+ Sablon alkalmazása
+ Törlés
+ Indítás
+ Beállítások
+ Play Store
+ Kill
+ Válassza ki az engedélyezendő fiókokat
+ Válassza ki az engedélyezendő alkalmazásokat
+ Válassza ki az engedélyezendő névjegyeket
+ Manage whitelists
+ Útmutató
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ Új
+ Frissítés
+ Töltés
+ Alkalmazás
+ Útmutató alkalmazva
+ Elmentve ide: %s
+ Nem található korlátozás
+ Biztos benne?
+ Please select some applications
+ Please select fewer than %d applications
+ Kész
+ Újraindítás szükséges
+ Véletlenszerűsítés
+ Véletlenszerűsítés hozzáféréskor
+ Véletlenszerűsítés boot után
+ Az alkalmazás újraindítása szükséges
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Az XPrivacy fejlesztése és tesztelése nagy gondossággal történik,
+de lehetetlen garantálni hogy tökéletesen működjön az összes eszközön és az összes alkalmazással.
+\n\nCsak saját felelősségre. \n\nNézze meg a licenszet is:
+ Fiókok (Google, Facebook, stb.)
+ Böngésző (könyvjelzők / előzmények)
+ Naptár
+ Hívás (telefon, SMS, MMS)
+ Vágólap
+ Névjegyzék
+ Szótár (felhasználó)
+ E-mail
+ Azonosító (eszköz)
+ Internet
+ Hely (pontos / hozzávetőleges)
+ Média (hang, fotó, videó)
+ Üzenetek (SMS, MMS)
+ Hálózat (címek)
+ Értesítések
+ Átfedés
+ Telefon (ID, számok, hívások)
+ Szenzorok
+ Tárhely (média, SD kártya)
+ Parancssor (parancsok, rendszergazda)
+ Rendszer (telepített alkalmazások)
+ Megtekintés (böngésző)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Jelölje be a korlátozáshoz:
+ Check to allow:
+ Szűrés adathasználat alapján
+ Szűrés internet hozzáférés alapján
+ Szűrés engedély alapján
+ Szűrés korlátozás alapján
+ Szűrés felhasználói alkalmazások alapján
+ Filter by on-demand
+ Szűrés rendszeralkalmazások alapján
+ Negálás
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Sorozatszám#
+ Szélesség
+ Hosszúság
+ Altitude
+ MAC-cím
+ IP cím
+ Telefonszám
+ Android azonosító
+ Reklám azonosító
+ Ország
+ Operator
+ Előfizető azonosító
+ Böngésző azonosító
+ Általános
+ Kamu adat
+ Értesítések frissítése
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (újraindítás szükséges)
+ Szakértői mód
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Alkalmazás
+ Internet engedély
+ Android engedély
+ Használta ezt az adatot
+ no usage data available
+ Ki van kapcsolva
+ Veszélyes
+ részben korlátozott
+ a korlátozásoknak beavatkozásra van szükségük
+ korlátozások megváltoztatva
+ korlátozások beküldve
+ has application specific fake values
+ Select the category to restrict
+ Kattintson a jelölőnégyzetre a kategória korlátozásához egy alkalmazásnál\n
+\nAz alkalmazások feltöltődnek üres vagy kamu adatokkal a korlátozott kategóriákban\n
+\nKattintson az alkalmazás ikonjára további korlátozásokhoz vagy beállításokhoz
+ Kattintson az alkalmazás ikonjára további műveletekhez
+ Kattintson a lefe nyílra, hogy lássa a korlátozott kategóriák kivételeit
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-in/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-in/strings.xml
new file mode 100644
index 0000000..36f4348
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-in/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy tidak diaktifkan di Xposed installer
+ Hanya untuk Android versi 4.0.3+
+ XPrivacy tidak kompatibel dengan %1$s
+ Versi XPrivacy: %1$s (%2$d)
+ Pengelola privasi terbaik
+ Hak cipta \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Berjalan dalam modus kompatibilitas
+ Berlisensi, terima kasih atas dukungan Anda!
+ Data penggunaan
+ Segarkan
+ Pengaturan
+ Kerangka
+ Laporkan masalah
+ Ekspor
+ Impor
+ Kirim pembatasan
+ Ambil pembatasan
+ Ganti tema
+ Versi Pro
+ Tentang
+ Bantuan …
+ Pilih semua
+ Sortir
+ Saring
+ Semua
+ Ganti pembatasan
+ Bersihkan semua
+ Bersihkan
+ Bersihkan semua data XPrivacy
+ Ganti saringan
+ Terapkan kerangka
+ Bersihkan
+ Luncurkan
+ Pengaturan
+ Play Store
+ Matikan
+ Pilih akun untuk ijinkan
+ Pilih aplikasi untuk ijinkan
+ Pilih kontak untuk ijinkan
+ Kelola daftar putih
+ Tutorial
+ Log perubahan
+ Bilas tembolok
+ Periksa pembaharuan
+ Operasi …
+ Legenda
+ Membatalkan
+ Dibatalkan
+ Baru
+ Pembaharuan
+ Memuat …
+ Menerapkan …
+ Kerangka diterapkan
+ Disimpan ke %1$s
+ Tidak ditemukan pembatasan
+ Apakah Anda yakin?
+ Harap pilih beberapa aplikasi
+ Harap pilih setidaknya kurang dari %1$d aplikasi
+ Selesai
+ Diperlukan mulai ulang perangkat
+ Acak sekarang
+ Acak pada waktu akses
+ Acak pada waktu boot
+ Diperlukan mulai ulang aplikasi
+ Mohon daftarkan perangkat Anda
+ Mohon masukkan alamat e-mail Anda:
+ Periksa e-mail Anda untuk mengaktifkan perangkat Anda
+ Layanan pembaharuan sedang berjalan
+ Sedang memindah %1$s
+ Mengacak %1$s
+ Peningkatan %1$s
+ Pemeriksaan internal gagal, apakah Anda ingin mengirim info dukungan?
+ Dibatasi oleh XPrivacy
+ Layanan privasi tidak ditemukan; sudahkah Anda mengaktifkan XPrivacy di Xposed installer dan boot ulang perangkat Anda?
+ Versi layanan privasi tidak cocok; sudahkah Anda boot ulang perangkat setelah memperbaharui XPrivacy?
+ Harap tunggu sampai layanan pembaharuan selesai
+ Pengguna ahli diharapkan untuk memecahkan masalah mereka sendiri jika mungkin dan mengikuti forum XDA XPrivacy serta membantu yang lain jika memungkinkan
+ Fungsi pembatasan ditujukan untuk pengguna ahli. Apakah Anda pengguna ahli?
+ Tekan agak lama nama fungsi untuk parameter daftar hitam atau putih
+ Tanda centang beserta nilai lebih diutamakan daripada tanda centang global dan nilai; kotak centang kosong beserta nilai tidak diutamakan
+ Basis data privasi diatur ulang, karena sudah korup
+ Perhatian yang sangat besar telah dilakukan untuk mengembangkan dan menguji XPrivacy,
+Namun mustahil untuk menjamin akan berjalan lancar pada setiap perangkat dan untuk setiap aplikasi.
+\n\nGunakan sepenuhnya dengan resiko Anda sendiri. \n\nLihat juga lisensinya:
+ Accounts
+ Browser
+ Calendar
+ Calling
+ Clipboard
+ Contacts
+ Dictionary
+ E-mail
+ Identification
+ Internet
+ Location
+ Media
+ Messages
+ Network
+ Notifications
+ Overlay
+ Phone
+ Sensors
+ Storage
+ Shell
+ System
+ View
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Centang untuk membatasi:
+ Centang untuk mengijinkan:
+ Saring pada penggunaan data
+ Saring pada akses internet
+ Saring pada perijinan
+ Saring pada pembatasan
+ Saring pada aplikasi pengguna
+ Saring berdasarkan sesuai permintaan
+ Saring pada aplikasi sistem
+ Tiadakan
+ Berdasarkan nama
+ Berdasarkan uid
+ Berdasarkan tanggal terinstal
+ Berdasarkan tanggal pembaharuan
+ Berdasarkan tanggal diubah (XPrivacy)
+ Berdasarkan keadaan (XPrivacy)
+ Balik urutan
+ Upaya penggunaan:
+ Kategori:
+ Fungsi:
+ Parameter:
+ Terapkan ke seluruh kategori
+ Sekali untuk
+ Daftar hitam/putih ‘%1$s’
+ Ijinkan
+ Tolak
+ Tidak tahu
+ harap kirim pembatasan Anda untuk menolong yang lain
+ Perijinan
+ Batasi (kategori)
+ Terapkan kerangka (kategori)
+ Terapkan kerangka (kategori+fungsi)
+ Terapkan kerangka (gabungkan aturan)
+ Terapkan kerangka (gabungkan atur ulang)
+ Aktifkan pembatasan berdasarkan permintaan
+ Non-aktifkan pembatasan berdasarkan permintaan
+ Waktu habis akan:
+ Set ulang
+ Standar
+ Alternatif
+ Ubah nama
+ Penggunaan
+ 1. Cari aplikasi yang akan dibatasi dalam daftar aplikasi utama
+ 2. Sentuh pada ikon aplikasi atau pada nama aplikasi
+ 3. Sentuh kotak centang pertama dalam kategori apapun yang ingin Anda batasi
+ Gunakan logika ketika membatasi, jangan mengharapkan akses internet jika Anda membatasi kategori internet, dll
+ Tekan agak lama pada judul untuk mengaktifkan fungsi yang berbahaya
+ Menerapkan ke kategori akan mengatur ulang fungsi pengecualian untuk nilai standar
+ Dokumentasi fungsi
+ tidak aman, dapat dielakkan
+ Memeriksa pembaharuan
+ Mengunduh pembaharuan
+ Sentuh untuk menginstal pembaharuan
+ Pembaharuan tidak tersedia
+ XPrivacy 2 tidak didukung lagi, silahkan mempertimbangkan untuk mengupgrade ke XPrivacy 3
+ Orisinil
+ Serial#
+ Lintang
+ Bujur
+ Ketinggian
+ Alamat MAC
+ Alamat IP
+ Nomor telepon
+ ID Android
+ ID Iklan
+ Negara
+ Operator
+ ID Pelanggan
+ Agen pengguna
+ Umum
+ Data palsu
+ Notifikasi pembaharuan
+ Batasi sesuai permintaan
+ Masukkan daftar hitam akun, aplikasi dan kontak
+ Log debug (memerlukan boot ulang)
+ Mode ahli
+ Tingkat kepercayaan ambil maksimum
+ Fungsi percobaan (memerlukan boot ulang)
+ Gunakan sambungan aman
+ Batasi komponen sistem (Android)
+ Tampilkan penggunaan data aplikasi
+ Tampilkan parameter penggunaan data
+ Tampilkan nilai penggunaan data
+ ID Cell GSM
+ GSM LAC
+ Kebiasaan
+ Mode AOSP (memerlukan boot ulang)
+ Kotak centang pertama: membatasi kategori atau fungsi
+ Kotak centang kedua: membatasi sesuai permintaan
+ Tombol on/off: mengaktifkan atau menonaktifkan semua pembatasan
+ Tekan agak lama pada nama aplikasi untuk memilih
+ pembatasan akan ditanyakan
+ Aplikasi
+ mempunyai izin internet
+ mempunyai izin Android
+ telah menggunakan data ini
+ tidak ada data penggunaan tersedia
+ dinonaktifkan
+ berbahaya, membatasi dapat menyebabkan masalah
+ dibatasai sebagian
+ pembatasan membutuhkan perhatian
+ pembatasan berubah
+ pembatasan dikirimkan
+ Aplikasi memiliki aturan palsu yang spesifik
+ Pilih kategori untuk pembatasan
+ Sentuh kotak centang untuk membatasi kategori yang dipilih untuk sebuah aplikasi\n
+\nAplikasi akan diberi data kosong atau palsu untuk kategori yang dibatasi\n
+\nSentuh ikon aplikasi untuk pembatasan lebih rinci dan pengaturan
+ Tekan ikon aplikasi untuk aksi lebih
+ Sentuh panah ke bawah untuk melihat fungsi pengecualian suatu kategori pembatasan
+ Kelola aplikasi, termasuk mematikan
+ Kelola pembatasan dan pengaturan XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-it/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-it/strings.xml
new file mode 100644
index 0000000..214d7dc
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-it/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy non è attivato nell\'installatore di Xposed
+ Solo per Android versione 4.0.3+
+ XPrivacy non è compatibile con %s
+ XPrivacy versione: %s (%d)
+ Il gestore di privacy definitivo
+ Copyright \u00A9 2013–2015 di M. Bokhorst (M66B)
+ Funzionamento in modalità compatibile
+ Attivato, grazie per il tuo supporto!
+ Dati utilizzati
+ Aggiorna
+ Impostazioni
+ Modello
+ Riporta problema
+ Esporta
+ Importa
+ Invia restrizioni
+ Ricevi restrizioni
+ Cambia tema
+ Versione Pro
+ A proposito di
+ Aiuto
+ Seleziona tutto
+ Ordina
+ Filtra
+ Tutto
+ Gestisci restrizioni
+ Azzera tutto
+ Azzera
+ Azzera tutti i dati di XPrivacy
+ Filtra
+ Applica modello
+ Azzera
+ Lancia
+ Impostazioni
+ Play Store
+ Termina
+ Seleziona gli accounts da consentire
+ Seleziona le applicazioni da consentire
+ Seleziona i contatti da consentire
+ Gestisci le whitelists
+ Guida
+ Cambiamenti
+ Svuota cache
+ Controllo aggiornamenti
+ Operazioni …
+ Legenda
+ Abortisco
+ Abortito
+ Nuovo
+ Aggiorna
+ Caricamento …
+ Applico …
+ Modello applicato
+ Salvato in %s
+ Nessuna restrizione trovata
+ Sei sicuro?
+ Per favore seleziona delle applicazioni
+ Per favore seleziona meno di %d applicazioni
+ Fatto
+ Richiesto riavvio del dispositivo
+ Randomizza adesso
+ Randomizza all\'accesso
+ Randomizza al boot
+ Richiesto riavvio
+ Per favore registra il tuo dispositivo
+ Per favore inserisci il tuo indirizzo e-mail:
+ Controlla l\'e-mail per attivare il dispositivo
+ Servizio di aggiornamento in funzione
+ Migrazione %s
+ Randomizzazione %s
+ Aggiornamento %s
+ Un controllo interno è fallito, vuoi inviare le informazioni di supporto?
+ Ristretto da XPrivacy
+ Servizio Privacy non trovato; hai attivato XPrivacy nell\'installatore di Xposed e riavviato il dispositivo?
+ Servizio Privacy conflitto di versione; hai riavviato il dispositivo dopo l\'aggiornamento di XPrivacy?
+ Attendere finchè l\'aggiornamento è completato
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Grande cura è stata posta nello sviluppo e verifica di XPrivacy,
+tuttavia non è possibile garantire che funzioni perfettamente su qualunque dispositivo e per qualsiasi applicazione.
+\n\nL\'utilizzo è interamente a tuo rischio. \n\nVedi anche la licenza:
+ Accounts (Google, Facebook, ecc)
+ Browser (segnalibri/cronologia)
+ Calendario
+ Chiamate (Telefono, SMS, MMS)
+ Appunti
+ Contatti
+ Dizionario (utente)
+ E-mail
+ Identificazione (dispositivo)
+ Internet
+ Luogo (preciso/approssimato)
+ Media (audio, foto, video)
+ Messaggi (SMS, MMS)
+ Rete (indirizzi)
+ Notifiche
+ Sovrapposizione
+ Telefono (ID, numeri, chiamate)
+ Sensori
+ Memoria (interna, scheda SD)
+ Shell (comandi, superutente)
+ Sistema (applicazioni installate)
+ Visualizza (browser)
+ Restringe l\'accesso alle azioni e alle informazioni di tipo view
+ Restringe l\'accesso alle informazioni di sistema, come le applicazioni installate
+ Restringe l\'accesso ai comandi di shell,compresi i comandi superutente
+ Restringe l\'accesso alla memoria, come i file nella tua scheda SD o nella memoria interna
+ Restringe l\'accesso ai sensori, come il sensore di movimento
+ Restringe l\'accesso alle informazioni del telefono, come il tuo numero
+ Restringe le finestre sovrapposte per prevenire il phishing
+ Restringe l\'accesso alle notifiche di sistema e delle applicazioni e alla messaggistica Google cloud
+ Restringe l\'accesso alle comunicazioni in prossimità
+ Restringe l\'accesso alle informazioni di rete, come indirizzi IP e MAC e rete Wi-Fi
+ Restringe l\'accesso ai messaggi memorizzati e ricevuti (SMS/MMS) e ai messaggi vocali
+ Restringe l\'accesso alla fotocamera (foto e video) e al microfono
+ Restringe l\'accesso alla tua località precisa e approssimata
+ Restringe le comunicazioni tra processi, quando utilizzate per eludere altre restrizioni
+ Restringe l\'accesso ad Internet
+ Restringe informazioni che possono identificarti, come il numero di serie del dispositivo
+ Restringe l\'accesso alle informazioni e-mail, come indirizzi e messaggi (solo applicazione standard e G-mail)
+ Restringe l\'accesso al dizionario utente
+ Restringe l\'accesso alle informazioni sui tuoi contatti
+ Restringe l\'accesso alle informazioni negli appunti
+ Restringe le chiamate a numeri di telefono, l\'invio di messaggi (SMS/MMS) e l\'accesso al registro chiamate
+ Restringe l\'accesso alle informazioni del calendario, come gli appuntamenti
+ Restringe l\'accesso alle informazioni del browser, come i segnalibri e lo storico dei file scaricati
+ Restringe l\'accesso alle informazioni dell\'account, come il tuo account Google che include l\'indirizzo G-mail
+ Indirizzi
+ Azione
+ Indirizzi IP
+ Librerie native
+ Nomi metodi
+ Nomi file
+ Comandi Shell
+ URLs
+ Transazioni
+ Permessi
+ Seleziona per restringere:
+ Seleziona per consentire
+ Filtra per dati di utilizzo
+ Filtra per accesso Internet
+ Filtra per permessi
+ Filtra per restrizioni
+ Filtra per applicazioni utente
+ Filtra per su-richiesta
+ Filtra per applicazioni di sistema
+ Nega
+ Per nome
+ Per uid
+ Per data di installazione
+ Per data di aggiornamento
+ Per data di modifica (XPrivacy)
+ Per stato (XPrivacy)
+ Inverti
+ Tentativo d\'uso di:
+ Categoria:
+ Funzione:
+ Parametri:
+ Applica a intera categoria
+ Una volta per
+ White/blacklist \'%s\'
+ Consenti
+ Rifiuta
+ Non so
+ Per favore sottoponi le tue restrizioni per aiutare gli altri
+ Permessi
+ Restringi
+ Applica modello (categorie)
+ Applica modello (categorie+funzioni)
+ Applica modello (unisci)
+ Applica modello (unisci resetta)
+ Abilita restrizioni su richiesta
+ Disabilita restrizioni su richiesta
+ Allo scadere:
+ Resetta
+ Default
+ Opzione
+ Rename
+ Utilizzo
+ 1. Cerca l\'applicazione da restringere nella lista principale
+ 2. Tocca l\'icona dell\'applicazione
+ 3. Tocca la prima casella di controllo di una categoria che desideri restringere
+ Usa il buon senso, non aspettarti che l\'accesso internet funzioni se hai ristretto la categoria Internet, ecc.
+ Premi a lungo su una intestazione per gestire le funzioni pericolose
+ Applicando all\'intera categoria le funzioni verranno riportate ai valori di default
+ Documentazione funzione
+ è insicuro, può essere aggirato
+ Controllo aggiornamento
+ Scarico aggiornamento
+ Tocca per installare aggiornamento
+ Nessun aggiornamento disponibile
+ XPrivacy 2 non è più supportato, per favore valuta l\'aggiornamento a XPrivacy 3
+ Original
+ Seriale#
+ Latitudine
+ Longitudine
+ Altitudine
+ Indirizzo MAC
+ Indirizzo IP
+ Numero di telefono
+ Android ID
+ Advertisement ID
+ Paese
+ Operatore
+ Subscriber ID
+ User agent
+ Generale
+ Dati alterati
+ Notifiche di aggiornamento
+ Restringi su richiesta
+ Metti in Blacklist accounts, applicazioni e contatti
+ Registro errori (richiede riavvio)
+ Modalità esperto
+ Intervallo massimo di confidenza nella ricezione
+ Funzioni sperimentali (richiede riavvio)
+ Usa connessioni sicure
+ Restringi componenti di sistema (Android)
+ Mostra utilizzo dati dell\'applicazione
+ Mostra parametri dei dati utilizzati
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Anomalie
+ Modalità AOSP (richiede reboot)
+ Prima casella di controllo: restringe categoria o funzione
+ Seconda casella di controllo: restringe su richiesta
+ Pulsante On/off: abilita o disabilita tutte le restrizioni
+ Premi a lungo sul nome per selezionare
+ le restrizioni verranno richieste
+ Applicazione
+ ha il permesso Internet
+ ha il permesso Android
+ ha utilizzato questo dato
+ dati di utilizzo non disponibili
+ è disabilitato
+ restrizioni possono causare problemi
+ ristretto in parte
+ restrizioni necessitano di attenzione
+ restrizioni modificate
+ restrizioni inviate
+ ha dati alterati specifici all\'applicazione
+ Seleziona la categoria da restringere
+ Tocca la casella di controllo per restringere la categoria selezionata per un\'applicazione\n
+\nAlle applicazioni verranno forniti dati vuoti o alterati per le categorie ristrette\n
+\nTocca l\'icona dell\'applicazione per le restrizioni e le impostazioni dettagliate
+ Tocca l\'icona dell\'applicazione per ulteriori azioni
+ Tocca la freccia verso il basso per visualizzare le funzioni di una categoria di restrizioni
+ Gestisce le applicazioni, inclusa la chiusura
+ Gestisce le restrizioni e le impostazioni di XPrivacy
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-iw/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-iw/strings.xml
new file mode 100644
index 0000000..98d13f5
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-iw/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy אינו מאופשר במתקין Xposed
+ Only for Android version 4.0.3+
+ XPrivacy is incompatible with %s
+ XPrivacy גירסא: %s (%d)
+ The ultimate privacy manager
+ כל הזכויות שמורות \ u00A9 2013–2015 על ידי מ \'Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Usage
+ Refresh
+ הגדרות
+ תבנית ברירת מחדל
+ דווח תקלה
+ ייצא
+ ייבא
+ Submit restrictions
+ Fetch restrictions
+ שינוי צבעי רקע
+ גירסת Pro
+ אודות
+ Help …
+ Select all
+ Sort
+ Filter
+ בחר הכול
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ Clear
+ הפעל
+ הגדרות
+ חנות Google Play
+ Kill
+ בחר חשבונות לאפשר
+ Select applications to allow
+ בחר אנשי קשר לאפשר
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ טוען
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ אתה בטוח?
+ Please select some applications
+ Please select fewer than %d applications
+ בוצע
+ נדרש אתחול מחדש
+ Randomize
+ Randomize on access
+ Randomize after boot
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Great care has been taken to develop and test XPrivacy,
+however it is impossible to guarantee it will work flawless on each and every device and for each and every application.
+\n\nUse is entirely at your own risk. \n\nSee also the license:
+ חשבונות (גוגל, פייסבוק, וכו\')
+ דפדפן (מועדפים / היסטוריה)
+ יומן
+ שיחות (טלפון, SMS, MMS)
+ Clipboard
+ אנשי קשר
+ מילון (משתמש)
+ E-mail
+ זיהוי (מכשיר)
+ אינטרנט
+ מיקום (fine/coarse)
+ מדיה (אודיו, תמונות, וידאו)
+ הודעות (SMS, MMS)
+ רשת (כתובות)
+ Notifications
+ Overlay
+ טלפון (זיהוי, מספרים, שיחות)
+ Sensors
+ אחסון (מדיה, כרטיס SD)
+ Shell (commands, superuser)
+ מערכת (יישומים מותקנים)
+ גישה (דפדפן)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ בחר להגביל:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serial#
+ קו אורך
+ קו רוחב
+ Altitude
+ כתובת MAC
+ IP address
+ מספר טלפון
+ אנדרואיד ID
+ Advertisement ID
+ מדינה
+ Operator
+ מנוי ID
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ יישום
+ כולל הרשאות גישה לאינטרנט
+ כולל הרשאות גישה לאנדרואיד
+ קיבל גישה להרשאה זו
+ no usage data available
+ is disabled
+ מסוכן
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ja/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ja/strings.xml
new file mode 100644
index 0000000..3dad9c5
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ja/strings.xml
@@ -0,0 +1,257 @@
+
+
+ XPrivacy が有効になっていません
+ アンドロイドのバージョン 4.0.3 以降専用です
+ XPrivacy は %1$s と互換性がありません
+ XPrivacy バージョン : %1$s (%2$d)
+ 究極の個人情報管理
+ コピーライト \u00A9 2013–2015 by M. Bokhorst (M66B)
+ 互換モードで動作しています
+ 使用許諾されました。協力ありがとう!
+ データの使用状況
+ 再読み込み
+ 設定
+ テンプレート
+ 問題の報告
+ エクスポート
+ インポート
+ 制限の設定の投稿
+ 制限の設定の取得
+ テーマの変更
+ プロ版
+ XPrivacy について
+ ヘルプ…
+ すべて選択
+ 並べ替え
+ フィルタ
+ すべて
+ 制限の一括設定
+ すべて消去
+ 消去
+ XPrivacy の設定を完全に初期化する
+ フィルタのオン/オフ
+ テンプレートの適用
+ 初期化する
+ 起動
+ 設定
+ Play ストア
+ 強制終了
+ 許可するアカウントの選択
+ 許可するアプリの選択
+ 許可する連絡先の選択
+ ホワイトリストの管理
+ チュートリアル
+ 変更履歴
+ キャッシュを消去する
+ 更新の確認
+ オペレーション…
+ 凡例
+ 中断中
+ 中断しました
+ 新規
+ 更新
+ 読み込み中…
+ 適用中…
+ テンプレートを適用しました
+ 保存しました : %1$s
+ 制限が見つかりませんでした
+ よろしいですか?
+ アプリを選択してください
+ 選択アプリ数を %1$d 未満にしてください
+ 完了
+ 端末の再起動が必要です
+ 今すぐランダム値を設定する
+ アクセス時にランダム値を設定する
+ 端末起動時にランダム値を設定する
+ アプリの再起動が必要です
+ 端末を登録してください
+ メールアドレスを入力してください :
+ 端末をアクティベートするにはメールをご覧ください
+ 更新サービスを実行しています
+ 移行中 %1$s
+ ランダム値の設定中 %1$s
+ 更新中 %1$s
+ 内部チェックに失敗しました。サポート情報を送信しますか?
+ XPrivacy により制限されました
+ Privacy service が見つかりません。XPrivacy を Xposed インストーラーで有効にして端末を再起動しましたか?
+ Privacy service のバージョンが違います。XPrivacy を更新した後で端末を再起動しましたか?
+ 更新サービスが完了するまでお待ちください
+ 上級者は、なるべく自分自身で問題を解決すること、XDA フォーラムの XPrivacy スレッドを購読すること、そして他の利用者をできるだけ助けることが求められます
+ 関数毎の制限の設定は上級者向けです。あなたは上級者ですか?
+ 関数名を長押しするとパラメーターのホワイト/ブラックリストを設定できます
+ アプリ固有のチェックマークや設定値は全体設定よりも優先されます。チェックマークや設定値のない項目は優先されません
+ The privacy database was reset, because it was corrupt
+ XPrivacy の開発およびテストには細心の注意を払いましたが、
+すべての端末のあらゆるアプリで完璧な動作を保証することは不可能です。
+\n\n完全に自己責任のうえでご利用ください。 \n\nライセンスについて :
+ アカウント
+ ブラウザ
+ カレンダー
+ 通話
+ クリップボード
+ 連絡先
+ ユーザー辞書
+ 電子メール
+ 識別情報
+ インターネット
+ 位置情報
+ メディア
+ メッセージ
+ ネットワーク
+ 通知
+ オーバーレイ
+ 電話
+ センサー
+ ストレージ
+ シェル
+ システム
+ 表示
+ 表示動作と表示情報へのアクセスを制限します
+ システム情報へのアクセスを制限します (インストール済みアプリなど)
+ シェルコマンドへのアクセスを制限します (superuser コマンドを含みます)
+ ストレージへのアクセスを制限します (本体ストレージや外部SDカードのファイルなど)
+ センサーへのアクセスを制限します (モーションセンサーなど)
+ 電話情報へのアクセスを制限します (電話番号など)
+ オーバーレイ表示を制限します (フィッシングを防止するため)
+ システムやアプリの通知と Google クラウドメッセージング(GCM)へのアクセスを制限します
+ 近距離無線通信(NFC)へのアクセスを制限します
+ ネットワーク情報へのアクセスを制限します (IP アドレス, MAC アドレス, Wi-Fi ネットワーク情報など)
+ 受信や保存したメッセージ(SMS/MMS)とボイスメールへのアクセスを制限します
+ カメラ(写真, ビデオ)とマイクへのアクセスを制限します
+ 位置情報(高精度と低精度)へのアクセスを制限します
+ プロセス間通信(IPC)を制限します (他の制限の回避に使用された場合)
+ インターネットへのアクセスを制限します
+ 個人の特定につながる情報へのアクセスを制限します (端末のシリアル番号など)
+ 電子メール情報へのアクセスを制限します (標準メールアプリと G-mail アプリのみ)
+ ユーザー辞書へのアクセスを制限します
+ 連絡先の情報へのアクセスを制限します
+ クリップボード情報へのアクセスを制限します
+ 電話の発信, メッセージ(SMS/MMS)の送信, 発信履歴へのアクセスを制限します
+ カレンダー情報へのアクセスを制限します (予定など)
+ ブラウザー情報へのアクセスを制限します (ブックマークやダウンロード履歴など)
+ アカウント情報へのアクセスを制限します (G-mail アドレスを含む Google アカウントなど)
+ アドレス
+ アクション
+ IP アドレス
+ ネイティブライブラリ
+ メソッド名
+ ファイル名
+ シェルコマンド
+ URL
+ トランザクション
+ パーミッション
+ チェックして制限します :
+ チェックして許可します :
+ データの使用あり
+ インターネットアクセスあり
+ アンドロイドの権限あり
+ 制限を設定済み
+ ユーザーアプリ
+ オンデマンド制限を設定済み
+ システムアプリ
+ 反転
+ 名前順
+ uid 順
+ インストール順
+ 更新順
+ 変更順 (XPrivacy)
+ 状態順 (XPrivacy)
+ 並べ替え順の反転
+ データを要求しています :
+ カテゴリ :
+ 関数 :
+ パラメーター :
+ カテゴリ全体に設定する
+ 今回のみ設定する
+ ホワイト/ブラックリスト ‘%1$s’
+ 許可
+ 拒否
+ わからない
+ 他の利用者の参考になるので是非あなたの設定を投稿してください
+ パーミッション
+ 制限を設定する (カテゴリ)
+ テンプレートを適用する (カテゴリ)
+ テンプレートを適用する (カテゴリと関数)
+ テンプレートを適用する (統合 セット)
+ テンプレートを適用する (統合 リセット)
+ オンデマンド制限を有効にする
+ オンデマンド制限を無効にする
+ タイムアウトすると :
+ リセット
+ 既定
+ 代替
+ 名称の変更
+ 使い方
+ 1. 制限を設定したいアプリをアプリリストで見つけます
+ 2. アプリアイコンまたはアプリ名をタップします
+ 3. 各カテゴリのチェックボックス①にチェックマークを付けると制限が設定されます
+ 制限は常識的に判断して設定してください。インターネットアクセスを制限したらインターネットに接続できることを期待してはいけません
+ 関数名を長押しすると危険性あり/なしをトグルできます
+ カテゴリ全体に設定すると関数の除外項目の設定が初期化されます
+ 関数のドキュメント
+ 安全でない : 回避されるおそれがあります
+ 更新を確認しています
+ 更新をダウンロードしています
+ タップして更新をインストールします
+ 更新はありません
+ XPrivacy 2 は今後サポートされません。XPrivacy 3 にアップグレードすることを検討してください
+ Original
+ シリアル番号
+ 緯度
+ 経度
+ 高度
+ MAC アドレス
+ IP アドレス
+ 電話番号
+ アンドロイド ID
+ 広告 ID
+ 国
+ 通信事業者
+ 加入者識別番号
+ ユーザーエージェント
+ 全般
+ データ偽装
+ アプリ更新の際に通知する
+ 制限をオンデマンドで設定する
+ アカウント, アプリ, 連絡先のブラックリスト
+ デバッグログを出力する (要再起動)
+ 上級者モード
+ 制限の設定を取得する際の信頼区間の最大値
+ 実験的な機能 (要再起動)
+ セキュリティ保護された接続を使用する
+ システム構成要素を制限可能にする (アンドロイド)
+ アプリのデータ使用状況を表示する
+ データのパラメーターを表示する
+ データの値を表示する
+ GSM セル ID
+ GSM LAC
+ Quirk 設定
+ AOSP モード (要再起動)
+ チェックボックス① : カテゴリや関数を制限します
+ チェックボックス② : オンデマンドで制限します(チェックボックス①は既定値になります)
+ On/Off スイッチ : 全制限の有効/無効を切り替えます
+ アプリ名の長押しでアプリが選択されます
+ 制限するか尋ねます
+ アプリ
+ インターネットアクセス権限があります
+ アンドロイドの権限があります
+ データが使用されました
+ データの使用状況は利用できません
+ 無効化されています
+ 危険 : 制限すると問題が発生するおそれがあります
+ 部分的に制限しています
+ 注意が必要です
+ 変更しました
+ 投稿しました
+ アプリ固有の偽装データが設定されています
+ 制限を設定したいカテゴリを選択します
+ アプリのチェックボックス①にチェックマークを付けると選択したカテゴリに対して制限が設定されます\n
+\nアプリのチェックボックス②にチェックマークを付けるとオンデマンドで制限を設定できるようになります\n
+\n制限が設定されたアプリは、そのカテゴリについて空データまたは偽装データを受け取るようになります\n
+\n制限を詳細に設定するにはアプリアイコンまたはアプリ名をタップしてください
+ アプリアイコンをタップすると様々な機能を実行することができます
+ 下向き矢印ボタンをタップするとカテゴリ内の関数の除外項目を確認できます
+ アプリの強制終了を含むアプリ管理
+ XPrivacy の制限および設定の管理
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ko/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ko/strings.xml
new file mode 100644
index 0000000..2b75d2b
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ko/strings.xml
@@ -0,0 +1,257 @@
+
+
+ XPrivacy가 Xposed installer에서 허용되지 않았습니다
+ 안드로이드 4.0.3+에서만 사용가능
+ XPrivacy가 %1$s과 호환되지 않습니다
+ XPrivacy 버전: %1$s (%2$d)
+ 최고의 개인정보지킴이
+ 저작권 \u00A9 2013–2015 by M. Bokhorst (M66B)
+ 호환모드 작동중
+ 저작권 라이센스, 성원에 감사드립니다!
+ 이용량
+ 새로고침
+ 설정
+ 템플릿
+ 버그신고
+ 내보내기
+ 가져오기
+ 차단설정 공유
+ 차단설정 다운로드
+ 테마교체
+ 프로버전
+ 기타정보
+ 도움말 …
+ 모두선택
+ 정렬
+ 필터
+ 모두
+ 차단 On/Off
+ 모두삭제
+ 삭제
+ XPrivacy 설정삭제
+ 필터 On/Off
+ 탬플릿 적용
+ 취소
+ 시작
+ 설정
+ Play Store
+ 종료
+ 허용할 계정 선택
+ 허용할 앱 선택
+ 허용할 연락처 선택
+ 화이트리스트 설정
+ 사용서
+ 변경사항
+ 캐쉬 지우기
+ 업데이트 확인
+ 명령 …
+ 범례
+ 중단중
+ 중단완료
+ 새로운 것
+ 업데이트
+ 로딩중 …
+ 적용중 …
+ 탬플릿 적용완료
+ 여기로 저장 %1$s
+ 차단설정이 없습니다
+ 확실한가요?
+ 앱(들)을 선택해 주세요
+ %1$d 개 이하의 앱을 선택해주세요
+ 완료
+ 기기 재부팅이 필요합니다
+ 지금 랜덤섞기
+ 작동시 랜덤섞기
+ 부팅시 랜덤섞기
+ 앱을 종료후 다시 시작해주세요
+ 기기를 등록해주세요
+ 이메일을 입력해주세요:
+ 받은 이메일을 확인해서 기기를 작동하세요
+ 업데이트 중
+ 이동 중 %1$s
+ 랜덤섞기 중 %1$s
+ 업데이트 중 %1$s
+ 검사가 실패했습니다, 오류정보를 개발자에게 보내시겠습니까?
+ XPrivacy에 의해 차단됨
+ 작동할 수 없습니다; Xposed Installer에서 XPrivacy를 허용하고 재부팅하셨나요?
+ 버전이 호환되지 않습니다; XPrivacy업데이트 후 재부팅하셨나요?
+ 업데이트가 완료될 때까지 기다려주세요
+ 파워유저는 자신이 아는 지식을 XDA XPrivacy forum 에서 서로 공유할 수 있습니다
+ 이 차단기능은 파워유저전용입니다, 파워유저입니까?
+ 기능이름을 길게 눌러, 블랙/화이트리스트를 설정하세요
+ 앱의 체크박스정보는 전체 카데고리정보보다 우선시 적용됩니다; 박스가 체크되지 않았으면 카데고리정보를 따릅니다
+ The privacy database was reset, because it was corrupt
+ XPrivacy의 개발에 열과 성을 다하였으나,
+각각 다르고 수많은 기기에서 문제없이 완벽하게 돌아가는 것을 장담할 수는 없습니다.
+\n\n기기의 문제 발생시 책임은 사용자에게 있습니다. \n\n라이센스 사항 보기:
+ 계정
+ 브라우저
+ 달력
+ 통화
+ 복사/붙이기
+ 연락처
+ 사전
+ 이메일
+ 기기정보
+ 인터넷
+ 위치
+ 미디어
+ 문자
+ 네트워크
+ 상단상태바
+ 오버레이
+ 통화
+ 센서
+ 저장공간
+ Shell 커맨드
+ 시스템
+ 화면
+ 사용데이터를 못 보도록 차단합니다
+ 설치된 앱정보등, 시스템정보를 차단합니다
+ 수퍼유저(루팅)등, Shell 커맨드를 차단합니다
+ 내부저장공간이나 sd카드에 저장된 파일을 차단합니다
+ 모션센서 등 센서를 차단합니다
+ 전화번호 등 폰 정보를 차단합니다
+ 스미싱을 방지하기 위해 오버레이 프레임을 차단합니다
+ 구글 클라우드 메시징과 시스템/앱 알림을 차단합니다
+ NFC를 차단합니다
+ Wifi 정보, IP/MAC 주소등, 네트워크정보를 차단합니다
+ 저장된 문자(SMS,MMS)나 보이스메일을 차단합니다
+ 마이크나 카메라(사진, 비디오)기능을 차단합니다
+ 정밀 혹은 대략적 위치정보를 차단합니다
+ 차단을 피해가려는 앱 구조 안에서의 통신을 차단합니다
+ 인터넷 기능을 차단합니다
+ 기기의 시리얼 신원 정보를 차단합니다
+ 이메일 수송신 정보나 내용을 차단합니다 (구글 G메일앱 한정)
+ 개인사전을 차단합니다
+ 연락처를 차단합니다
+ 복사/붙이는 정보를 차단합니다
+ 전화번호, 문자(SMS/MMS), 통화기록을 차단합니다
+ 달력관련 정보 등 일정을 차단합니
+ 즐겨찾기나 다운로드기록 등 브라우저정보를 차단합니다
+ G메일이나 구글계정등 계정정보를 차단합니다
+ 주소
+ 액션
+ IP 주소
+ 원래 라이브러리
+ 메소드 기능
+ 파일이름
+ Shell 커맨드
+ URL주소
+ 교류내역
+ 승인된기능
+ 체크하여 차단:
+ 체크하여 허용:
+ 사용량 기준 필터
+ 인터넷사용 기준 필터
+ 승인기능 기준 필터n
+ 차단기준 필터
+ 사용자앱 기준 필터
+ 사용시팝업 기준 필터
+ 시스템앱 기준 필터
+ 무효화
+ 이름기준
+ uid기준
+ 설치날짜 기준
+ 업데이트날짜 기준
+ (XPrivacy)의 수정날짜 기준
+ (XPrivacy)의 상태 기준
+ 거꾸로 정렬
+ 사용시도:
+ 종류:
+ 기능:
+ 매개변수:
+ 모두 적용
+ 한번만 적용
+ 화이트/블랙리스트 ‘%1$s’
+ 허용
+ 차단
+ 모르겠음
+ 자신의 차단설정을 공유해보세요
+ 승인기능
+ 차단 (카데고리)
+ 탬플릿 적용 (카테고리)
+ 탬플릿 적용 (카테고리+파워유저기능)
+ 탬플릿 적용 (merge set)
+ 탬플릿 적용 (merge reset)
+ 사용시 차단팝업 사용
+ 사용시 차단팝업 비사용
+ 타임아웃:
+ 리셋
+ 기본값
+ 선택값
+ 새이름
+ 사용량
+ 1. 기본 앱리스트에서 차단설정할할 앱을 선택해주세요
+ 2. 앱아이콘이나 이름을 선택해주세요
+ 3. 차단할 카데고리의 1번 박스를 체크해주세요
+ 앱 설정에 주의하세요, 예를 들면 인터넷을 차단하면 당연히 인터넷기능을 쓸 수 없습니다
+ 파워유저 설정을 하시려면 길게 눌러주세요
+ 카데고리 차단설정은 파워유저설정을 기본값으로 되돌립니다
+ 기능 설명
+ 는 위험합니다, 차단이 되지 않을 수 있습니다
+ 업데이트 확인중
+ 업데이트 다운중
+ 업데이트
+ 최신버전입니다
+ XPrivacy 2는 중단되었습니다, XPrivacy 3로 업그레이드를 고려해주세요
+ 원본
+ Serial#
+ 위도
+ 경도
+ 고도
+ MAC 주소
+ IP address
+ 전화번호
+ 안드로이드 ID
+ 광고 ID
+ 나라
+ 통신사
+ 유심 ID
+ 브라우저 정보
+ 일반
+ 가짜정보
+ 업데이트 알림
+ 사용할 때 차단
+ 계정, 앱, 연락처를 블랙리스트
+ 디버그 로그 (재부팅필요)
+ 파워유저 모드
+ Maximum fetch confidence interval
+ 실험실 기능 (재부팅필요)
+ 보안연결 사용
+ 시스템 기능 차단
+ 앱 사용데이터 보기
+ 사용데이터의 한도 보기
+ 사용데이터의 값 보기
+ GSM Cell ID
+ GSM LAC
+ 쿼크모드
+ AOSP 모드 (재부팅 필요)
+ 1번 체크박스: 종류나 기능 차단
+ 2번 체크박스: 사용시 차단; 1번박스 값이 기본설정
+ 켬/끔 스위치:모든차단설정 허용/비허용
+ 앱 이름을 길게 눌러 설정
+ 차단설정을 물어봅니다
+ 앱
+ 인터넷이 가능합니다
+ 이 기능을 쓸 수 있습니다
+ 이 기능을 썼습니다
+ 사용한 데이터 확인불가
+ 차단됨
+ 위험합니다, 차단하시면 문제가 발생할 수 있습니다
+ 부분적으로 차단됨
+ 차단설정을 확인해주세요
+ 차단설정이 바뀌었습니다
+ 차단설정이 공유됐습니다
+ 앱의 가짜데이터가 있습니다
+ 차단할 종류를 선택해주세요
+ 1번 박스를 체크하여 선택한 차단종류를 앱에 적용하세요\n
+\n2번 박스는 앱을 사용할 때 차단팝업이 뜹니다\n
+\n앱이 차단된 기능을 사용하고자 할때 가짜정보가 앱에 입력됩니다\n
+\n앱 아이콘이나 이름을 선택하여 더 자세히 설정하세요
+ 앱 아이콘을 선택하여 더 설정하세요
+ 아래화살표를 눌러 더 자세한 설정을 하세요
+ 앱 관리(강제종료포함)
+ XPrivacy 설정
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ku-rIQ/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ku-rIQ/strings.xml
new file mode 100644
index 0000000..a8afdd2
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ku-rIQ/strings.xml
@@ -0,0 +1,255 @@
+
+
+ اکس پرایوسی له ناو اکسپوسید کارا نه کراوه
+ ته نیا بو ویرژه نی اندروید 4.0.3+
+ اکس پرای وه سی گونجاو نی یه له گه ل %s
+ اکس پرایوه سی ویرژه نی: %s (%d)
+ به هیز ترین به رنامه ی نیهینی پاریز
+ Copyright \u00A9 2013–2015 خاوه نی M. Bokhorst (M66B)
+ Running in compatibility mode
+ License found, thanks for your support!
+ زانیاری به کار هینراو
+ نوی کردنه وه
+ ریک خستن
+ قالب
+ ئاگه دار کردنه وه له بونی هه له
+ هه نارده کردن
+ هاورده کردن
+ ناردنی هه لبژارده کانت
+ دابه زاندنی داتای هه ل بژیردراو
+ گورینی شیوه ی به رنامه
+ ویرژه نی پاره
+ زانیاری زیاتر
+ یارمه تی
+ دیاری کردنی هه موویان
+ ریزکردن
+ پالاوتن
+ هه موو
+ سنوردارکردن / سنوردار نه کردن
+ به تال کردنی هه مویان
+ به تال کردن
+ ره شکردنه وه ی هه موو داتاکان
+ پالاوتن / نه پالاوتن
+ کارپیکردنی قالب
+ به تال کردن
+ هه لگیرساندن
+ ریکخستن
+ پله ی استور
+ داخستنی به رنامه که
+ ریپیدان به به کار هینانی ئه م حيسابانه
+ ریپیدان به به کارهینانی ئه م به رنامانه
+ ریپیدان به به کارهینانی ئه م ژماره ته له فونانه
+ Manage whitelists
+ فیربون
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ پاشگه ز بوونه وه
+ پاشگه ز کرا
+ نوی
+ نوی کردنه وه ی ویرژه ن
+ بارکردن …
+ به کارده هیندریت …
+ قالبه کان به کارهینران
+ زانیاریه کان هه ل گیران له %s
+ هیچ زانیارییه کی سنوردار کراو نه دوزرایه وه
+ ئایا دلنیایت؟
+ ته کایه چه ند به رنامه یک هه لبژیره
+ ته کایه ژماره یه کی که متر له %d به رنامه هه لبژیره
+ جیبه جی کرا
+ پیویست به دوباره هه لگیرساندنی موبایل ده کات
+ هه ره مه کی کردنی زانیاریه کان
+ ناردنی زانیاری هه ره مه کی له کاتی به کارهینانیان
+ هه ره مه كى كردن له كاتى هه لگیرسانی موبایل
+ پیویست به دوباره داگیرساندن ده کات
+ ته کایه خوت تومارکه
+ ته کایه ئيمه يله كه ت داخيل كه:
+ سه ره دانى ئيمه يله كه ت بكه بو ته واو كردنى خو توماركردنه كه ت
+ خزمه تگوزارى نويكردنه وه كارايه
+ گواستنه وه %s
+ هه ره مه كى كردن %s
+ Upgrading %s
+ هه له يه ك هه يه له م به رنامه يه ئايا ده ته ويت خاوه نى ئاگه دار بکه یته وه؟
+ له لایه ن اکسپراوسی یه وه ری لی گیرا
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ هه ول و ماندو بوونیکی زور دراوه بو دروستکردن و تاقیکردنه وه ی ئه م به رنامه يه به لام له گه ل ئه وه شدا ناتوانين دلنياتان بكه ين له وه ىكه ئه م به رنامه يه بى هه له يه و له سه ر هه موو موبايليك ياخود بو هه ر به رنامه يه ك كار ده كات.
+\n\nته نيا خوت به رپرسیاریت له به کارهینانی ئه م به رنامه يه. \n\nهه روه ها سه يريكى موله تى ريپیدان بکه:
+ حیسابه کان (گوگل, فه یسبوک, هتد)
+ Browser (bookmarks/history)
+ روژ ژمیر
+ ته له فون کردن (ته له فون,کورته نامه, نامه ی ره نگی)
+ ئه و نوسينانه ى کوپیت کردون
+ ژماره ته له فونه کان
+ فه رهه نگ (به کار هینه ر)
+ ئيمه يل
+ ناسینه وه (موبایل)
+ ئينته رنيت
+ شوین (شوینه که ت/جیگه ت)
+ میدیا (ده نگ, وینه, ویدیو)
+ نامه کان (کورته نامه, نامه ی ره نگی)
+ تور (ئه دريسه كان)
+ ئاگه داریه کان
+ داپوشین
+ موبایل (ناوه کان, ژماره کان, ته له فونه کان)
+ هه سته وه ره کان
+ کوگا (میدیا, کارت حافیزه)
+ Shell (commands, superuser)
+ سیسته م (ئه م به رنامانه ى دانراون)
+ View (browser)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ هه ل بژیره بوو سنوردارکردنی:
+ Check to allow:
+ پالاوتن به هوی داتا به کارهینراوه کان
+ پالاوتنی ئه و به رنامانه ی ئينته ر نيت به كاردينن
+ پالاوتنی ئه و زانياريانه ى كه ده توانريت به كاربهينرين
+ پالاوتنی به رنامه ی سنوردارکراو
+ پالاوتنی به رنامه کانی به کار هینه ر
+ پالاوتنی ئه و به رنامانه ی که بو سنوردارکردنیان داوات لی بکریت
+ پالاوتنی به رنامه کانی سیسته م
+ پیچه وانه
+ به پی ناوه کان
+ به پی uid
+ به پی کاتی دابه زاندن
+ به پی کاتی نوی کردن بوونه وه
+ به پی کاتی دروست بوونی (اکس پرایوسی)
+ By state (XPrivacy)
+ پیچه وانه ی شیوه ی ریز بوون
+ هه ول ده دات ئه مانه به كاربينت:
+ پول:
+ ئيش:
+ Parameters:
+ بو هه موو به شه که
+ Once for
+ White/blacklist \'%s\'
+ ریگه دان
+ ریگه نه دان
+ Don\'t know
+ ته کایه بو یارمه تی دانی که سانی تریش ئه و شتانه ى سنوردارتكردوون به لاو بكه
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ سريال نه مبرى موبايل
+ هیلی پانی
+ هیلی دریژی
+ به رزی له ئاستى ده يا
+ مه ك ئه دريس
+ ئاي پی ئه دريس
+ ژماره ی ته له فون
+ ناسنامه ئه ندرويد
+ ناسنامه ى ريكلامه كان
+ ولات
+ Operator
+ ناسنامه ی به شداربوو
+ User agent
+ گشتی
+ زانیاری هه له
+ نوی کردنه وهی ئاگه داریه کان
+ داوات لیبکریت بو سنوردار کردنیان
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ چه ند هه لبژاردنیکی مه ترسیدار که تایبه ته به که سانی شاره زا
+ زورترین راده ی دلنیابوون له زانیاریه دابه زینراوه کان
+ فرمانی ئه زمونى(پیویست به دوباره داگیرساندنی موبایل ده کات)
+ به کارهینانی هیلی پاریزراو
+ سنوردار کردنی شته بنچینه یه کانی سیسته مه که ت (موبایله که ت)
+ پیشاندنی ئه و زانياريانه ى به كارهينراون
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ په نجه ت دابگره له سه ر ئه و ناوه ى كه ده ته ویت هه لی بژیریت
+ داوات لیده کریت بو سنوردار کردن
+ به رنامه کان
+ توانای به کارهینانی ئينته رنيتى هه يه
+ تواناى به كار هينانى ئه م زانياريانه ى هه يه
+ ئه م زانياريانه ى به كار هيناوه
+ زانيارى به كار هينراو به رده ست نیه
+ راگیراوه
+ مه ترسیداره سنوردار کردنی له وانه یه ببیته هوی دروست بوونی کیشه
+ به شیکی سنورداره کراوه
+ ئه وشتانه ى سنورداركراون پیویستیان به سه رنجدانه
+ گورانیک له سنوردار کراوه کان رویداوه
+ ئه و شتانه ى سنوردارت كردوون به لاو كران
+ has application specific fake values
+ ئه و به شه ی ده ته ویت سنورداری بکه یت هه لبژیره
+ ئه و به شه هه لبژیره که ده ته ویت سنورداری بکه یت بو به رنامه یک\n
+\nبه رنامه که زانیاری به تال یاخود هه له ی پیده دریت له سه ر ئه م به شه\n
+\nپه نجه بنی له سه ر ئايكونى به رنامه که بو سنوردار کردنی ووردتر و ریکخستنه کانی
+ په نجه بنی به سه ر ئايكونى به رنامه كه بو فرمانى زياتر
+ په نجه بنی له سه ر هیمای به ره و خوار بو دیتنی فرمانه کان و ووردتر سنوردار کردنی به شه که
+ به ریوه بردنی به رنامه کان ,داخستنیشیان
+ Manage XPrivacy restrictions and settings
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ku-rIR/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ku-rIR/strings.xml
new file mode 100644
index 0000000..a8afdd2
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ku-rIR/strings.xml
@@ -0,0 +1,255 @@
+
+
+ اکس پرایوسی له ناو اکسپوسید کارا نه کراوه
+ ته نیا بو ویرژه نی اندروید 4.0.3+
+ اکس پرای وه سی گونجاو نی یه له گه ل %s
+ اکس پرایوه سی ویرژه نی: %s (%d)
+ به هیز ترین به رنامه ی نیهینی پاریز
+ Copyright \u00A9 2013–2015 خاوه نی M. Bokhorst (M66B)
+ Running in compatibility mode
+ License found, thanks for your support!
+ زانیاری به کار هینراو
+ نوی کردنه وه
+ ریک خستن
+ قالب
+ ئاگه دار کردنه وه له بونی هه له
+ هه نارده کردن
+ هاورده کردن
+ ناردنی هه لبژارده کانت
+ دابه زاندنی داتای هه ل بژیردراو
+ گورینی شیوه ی به رنامه
+ ویرژه نی پاره
+ زانیاری زیاتر
+ یارمه تی
+ دیاری کردنی هه موویان
+ ریزکردن
+ پالاوتن
+ هه موو
+ سنوردارکردن / سنوردار نه کردن
+ به تال کردنی هه مویان
+ به تال کردن
+ ره شکردنه وه ی هه موو داتاکان
+ پالاوتن / نه پالاوتن
+ کارپیکردنی قالب
+ به تال کردن
+ هه لگیرساندن
+ ریکخستن
+ پله ی استور
+ داخستنی به رنامه که
+ ریپیدان به به کار هینانی ئه م حيسابانه
+ ریپیدان به به کارهینانی ئه م به رنامانه
+ ریپیدان به به کارهینانی ئه م ژماره ته له فونانه
+ Manage whitelists
+ فیربون
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ پاشگه ز بوونه وه
+ پاشگه ز کرا
+ نوی
+ نوی کردنه وه ی ویرژه ن
+ بارکردن …
+ به کارده هیندریت …
+ قالبه کان به کارهینران
+ زانیاریه کان هه ل گیران له %s
+ هیچ زانیارییه کی سنوردار کراو نه دوزرایه وه
+ ئایا دلنیایت؟
+ ته کایه چه ند به رنامه یک هه لبژیره
+ ته کایه ژماره یه کی که متر له %d به رنامه هه لبژیره
+ جیبه جی کرا
+ پیویست به دوباره هه لگیرساندنی موبایل ده کات
+ هه ره مه کی کردنی زانیاریه کان
+ ناردنی زانیاری هه ره مه کی له کاتی به کارهینانیان
+ هه ره مه كى كردن له كاتى هه لگیرسانی موبایل
+ پیویست به دوباره داگیرساندن ده کات
+ ته کایه خوت تومارکه
+ ته کایه ئيمه يله كه ت داخيل كه:
+ سه ره دانى ئيمه يله كه ت بكه بو ته واو كردنى خو توماركردنه كه ت
+ خزمه تگوزارى نويكردنه وه كارايه
+ گواستنه وه %s
+ هه ره مه كى كردن %s
+ Upgrading %s
+ هه له يه ك هه يه له م به رنامه يه ئايا ده ته ويت خاوه نى ئاگه دار بکه یته وه؟
+ له لایه ن اکسپراوسی یه وه ری لی گیرا
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ هه ول و ماندو بوونیکی زور دراوه بو دروستکردن و تاقیکردنه وه ی ئه م به رنامه يه به لام له گه ل ئه وه شدا ناتوانين دلنياتان بكه ين له وه ىكه ئه م به رنامه يه بى هه له يه و له سه ر هه موو موبايليك ياخود بو هه ر به رنامه يه ك كار ده كات.
+\n\nته نيا خوت به رپرسیاریت له به کارهینانی ئه م به رنامه يه. \n\nهه روه ها سه يريكى موله تى ريپیدان بکه:
+ حیسابه کان (گوگل, فه یسبوک, هتد)
+ Browser (bookmarks/history)
+ روژ ژمیر
+ ته له فون کردن (ته له فون,کورته نامه, نامه ی ره نگی)
+ ئه و نوسينانه ى کوپیت کردون
+ ژماره ته له فونه کان
+ فه رهه نگ (به کار هینه ر)
+ ئيمه يل
+ ناسینه وه (موبایل)
+ ئينته رنيت
+ شوین (شوینه که ت/جیگه ت)
+ میدیا (ده نگ, وینه, ویدیو)
+ نامه کان (کورته نامه, نامه ی ره نگی)
+ تور (ئه دريسه كان)
+ ئاگه داریه کان
+ داپوشین
+ موبایل (ناوه کان, ژماره کان, ته له فونه کان)
+ هه سته وه ره کان
+ کوگا (میدیا, کارت حافیزه)
+ Shell (commands, superuser)
+ سیسته م (ئه م به رنامانه ى دانراون)
+ View (browser)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ هه ل بژیره بوو سنوردارکردنی:
+ Check to allow:
+ پالاوتن به هوی داتا به کارهینراوه کان
+ پالاوتنی ئه و به رنامانه ی ئينته ر نيت به كاردينن
+ پالاوتنی ئه و زانياريانه ى كه ده توانريت به كاربهينرين
+ پالاوتنی به رنامه ی سنوردارکراو
+ پالاوتنی به رنامه کانی به کار هینه ر
+ پالاوتنی ئه و به رنامانه ی که بو سنوردارکردنیان داوات لی بکریت
+ پالاوتنی به رنامه کانی سیسته م
+ پیچه وانه
+ به پی ناوه کان
+ به پی uid
+ به پی کاتی دابه زاندن
+ به پی کاتی نوی کردن بوونه وه
+ به پی کاتی دروست بوونی (اکس پرایوسی)
+ By state (XPrivacy)
+ پیچه وانه ی شیوه ی ریز بوون
+ هه ول ده دات ئه مانه به كاربينت:
+ پول:
+ ئيش:
+ Parameters:
+ بو هه موو به شه که
+ Once for
+ White/blacklist \'%s\'
+ ریگه دان
+ ریگه نه دان
+ Don\'t know
+ ته کایه بو یارمه تی دانی که سانی تریش ئه و شتانه ى سنوردارتكردوون به لاو بكه
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ سريال نه مبرى موبايل
+ هیلی پانی
+ هیلی دریژی
+ به رزی له ئاستى ده يا
+ مه ك ئه دريس
+ ئاي پی ئه دريس
+ ژماره ی ته له فون
+ ناسنامه ئه ندرويد
+ ناسنامه ى ريكلامه كان
+ ولات
+ Operator
+ ناسنامه ی به شداربوو
+ User agent
+ گشتی
+ زانیاری هه له
+ نوی کردنه وهی ئاگه داریه کان
+ داوات لیبکریت بو سنوردار کردنیان
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ چه ند هه لبژاردنیکی مه ترسیدار که تایبه ته به که سانی شاره زا
+ زورترین راده ی دلنیابوون له زانیاریه دابه زینراوه کان
+ فرمانی ئه زمونى(پیویست به دوباره داگیرساندنی موبایل ده کات)
+ به کارهینانی هیلی پاریزراو
+ سنوردار کردنی شته بنچینه یه کانی سیسته مه که ت (موبایله که ت)
+ پیشاندنی ئه و زانياريانه ى به كارهينراون
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ په نجه ت دابگره له سه ر ئه و ناوه ى كه ده ته ویت هه لی بژیریت
+ داوات لیده کریت بو سنوردار کردن
+ به رنامه کان
+ توانای به کارهینانی ئينته رنيتى هه يه
+ تواناى به كار هينانى ئه م زانياريانه ى هه يه
+ ئه م زانياريانه ى به كار هيناوه
+ زانيارى به كار هينراو به رده ست نیه
+ راگیراوه
+ مه ترسیداره سنوردار کردنی له وانه یه ببیته هوی دروست بوونی کیشه
+ به شیکی سنورداره کراوه
+ ئه وشتانه ى سنورداركراون پیویستیان به سه رنجدانه
+ گورانیک له سنوردار کراوه کان رویداوه
+ ئه و شتانه ى سنوردارت كردوون به لاو كران
+ has application specific fake values
+ ئه و به شه ی ده ته ویت سنورداری بکه یت هه لبژیره
+ ئه و به شه هه لبژیره که ده ته ویت سنورداری بکه یت بو به رنامه یک\n
+\nبه رنامه که زانیاری به تال یاخود هه له ی پیده دریت له سه ر ئه م به شه\n
+\nپه نجه بنی له سه ر ئايكونى به رنامه که بو سنوردار کردنی ووردتر و ریکخستنه کانی
+ په نجه بنی به سه ر ئايكونى به رنامه كه بو فرمانى زياتر
+ په نجه بنی له سه ر هیمای به ره و خوار بو دیتنی فرمانه کان و ووردتر سنوردار کردنی به شه که
+ به ریوه بردنی به رنامه کان ,داخستنیشیان
+ Manage XPrivacy restrictions and settings
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-lt/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-lt/strings.xml
new file mode 100644
index 0000000..448d491
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-lt/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy neaktyvuota Xposed programoje
+ Tik nuo Android 4.0.3+ versijos
+ XPrivacy yra nesuderinama su %s
+ XPrivacy programos versija: %s (%d)
+ The ultimate privacy manager
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Veikia suderinamumo režimu
+ Licenzijuota, ačiū už Jūsų paramą!
+ Duomenų naudojimas
+ Atnaujinti
+ Parametrai
+ Šablonai
+ Pranešti problemą
+ Eksportuoti
+ Importuoti
+ Pateikti leidimus į serverį
+ Gauti leidimus iš serverio
+ Keisti temą
+ Pro versija aktyvi
+ Apie
+ Pagalba
+ Pažymėti viską
+ Rūšiuoti
+ Filtras
+ Visos
+ Išvalyti visus ribojimus
+ Išvalyti viską
+ Valyti
+ Išvalyti visus duomenis
+ Perjungti filtrą
+ Taikyti šabloną
+ Išvalyti
+ Paleisti programą
+ Programos informacija
+ Google play
+ Sustabdyti programą
+ Leisti pažymėtas paskyras
+ Leisti pažymėtas programas
+ Leisti pažymėtus kontaktus
+ Baltasis sąrašas
+ Instrukcija
+ Pakeitimai
+ Išvalyti talpyklą
+ Patikrinti atnaujinimus
+ Operacijos
+ Paaiškinimai
+ Nutraukti
+ Atmesti
+ Naujas
+ Atnaujinta
+ Lukterkite
+ Vykdoma
+ Šablonas pritaikytas
+ Išsaugomi %s
+ Nerasta ribojimų
+ Įsitikinę?
+ Prašome pasirinkti keletą programų
+ Prašome pasirinkti mažiau nei %d programų
+ Atlikta
+ Reikia perkrauti prietaisą
+ Atsitiktiniai duomenys
+ Atsitiktiniai duomenys prieeigai
+ Atsitiktiniai duomenys po perkrovimo
+ Programą reikia perkrauti
+ Prašome užregistruoti savo įrenginį
+ Prašome įvesti savo el. pašto adresą:
+ Patikrinkite savo el. paštą, kad aktyvuoti savo prietaisą
+ Atnaujinimo paslauga veikia
+ Migruojama %s
+ Keičiama %s
+ Atnaujinama %s
+ Vidinis patikrinimas nepavyko, ar norite siųsti paramos informaciją?
+ Ribojama su XPrivacy
+ Privacy procesas nerastas. Ar aktyvavote XPrivacy sistemoje Xposed ir perkrovėte prietaisą?
+ Privacy procesas veikia netinkamai. Ar perkrovėte prietaisą po XPrivacy atnaujinimo?
+ Prašome palaukti, kol atnaujinimas bus baigtas
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Funkcijų ribojimai yra skirti patyrusiems naudotojams. Ar esate ekspertas?
+ Ilgai paspauskite ant funkcijos, norint itraukti į baltą arba juodą sąrašą
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Puiku, kad sutikote išbandyti XPrivacy.
+Tačiau neįmanoma garantuoti, kad dirbs nepriekaištingai su kiekvienu prietaisu.
+\n\nTodėl naudokite visiškai savo pačių rizika. \n\nTaip pat žiūrėkite licenciją:
+ Paskyra
+ Naršyklė
+ Kalendorius
+ Skambinimas
+ Iškarpinė
+ Kontaktai
+ Žodynas
+ El. paštas
+ Identifikacija
+ Internetas
+ Vieta
+ Media
+ Pranešimų saugykla
+ Tinklas
+ Įspėjimai
+ Perdanga
+ Telefonas
+ Sensoriai
+ Atmintis
+ Vykdymas
+ Sistema
+ Peržiūra
+ Galima riboti prieigą veiksmų ir informacijos peržiūrai
+ Galima riboti prieigą prie sistemos informacijos (pvz: įdiegtas programas)
+ Galima riboti prieigą prie shell komandų, įskaitant administratoriaus komandų
+ Galima riboti prieigą prie atminties (pvz: failai iš SD kortelės arba vidinės atminties)
+ Galima riboti prieigą prie jutiklių (pvz: kaip judesio davikliu)
+ Galima riboti priėjimą prie telefono informacijos, kaip jūsų telefono numeris
+ Galima riboti perdangos langus, išvengti sukčiavimo apsimetant
+ Galima riboti prieigą prie sistemos ir taikomųjų programų pranešimų ir "Google" pranešimų
+ Galima riboti prieigą prie NFC komunikacijos
+ Galima riboti prieigą prie tinklo informacijos, kaip IP ir MAC adresai ir "Wi-Fi" tinklo informacija
+ Galima riboti prieigą prie saugomų ir gautų žinučių (SMS / MMS) ir skambučių
+ Galima riboti prieigą prie fotoaparato (nuotraukos ir vaizdo įrašai) ir mikrofono
+ Addresai
+ Veiksmas
+ Galima riboti prieigą prie jūsų buvimo vietos
+ Galima riboti tarp-procesines komunikacijas, kai naudojamos apeiti kitus ribojimus
+ Galima riboti prieigą prie interneto
+ Galima riboti informaciją, pagal kurią galima jus identifikuoti (pvz: serijinį numerį jūsų prietaiso)
+ Galima riboti prieigą prie elektroninio pašto (pvz: adresai, žinutės)
+ Galima riboti vartotojo žodyną
+ Galima riboti prieigą prie jūsų kontaktų
+ Galima riboti prieigą prie informacijos, esančios iškarpinėje
+ Galima riboti skambinti telefono numeriais, siųsti žinutes (SMS / MMS) ir prieigą prie jūsų telefono žurnalo
+ Galima riboti prieigą prie kalendoriaus informacijos
+ Galima riboti prieigą prie naršyklės informacijos (pvz: žymos, parsisiuntimų istorija
+ Galima riboti prieigą prie paskyros informacijos
+ IP adresai
+ Gimtosios bibliotekos
+ Metodų pavadinimai
+ failų vardai
+ Vykdymo komandos
+ URL adresai
+ Tranzakcijos
+ Leidimai
+ Naudoti ribojimus:
+ Žiurėti leidžiamus:
+ Duomenų naudojimas
+ Interneto prieiga
+ Aktyvūs leidimai
+ Riboti leidimai
+ Vartotojo programos
+ Pagal reikalavimą
+ Sistemos programos
+ neriboti
+ Pagal pavadinimą
+ Pagal UID
+ Pagal įdiegimo datą
+ Pagal atnaujinimo datą
+ Pagal modifikavimo datą (XPrivacy)
+ Pagal statusą (XPrivacy)
+ Atvirkštinė rūšiavimo tvarka
+ Bando naudoti:
+ Kategorija:
+ Funkcija:
+ Parameterai:
+ Taikyti visą kategoriją
+ Kartą
+ Baltasis sąrašas \'%s\'
+ Leisti
+ Drausti
+ Nežinau
+ Prašome pateikti savo leidimą
+ Leidimai
+ Riboti
+ Taikyti šabloną (kategorijos)
+ Taikyti šabloną (kategorijos+funkcijos)
+ Taikyti šabloną (sujungti)
+ Taikyti šabloną (sujungti naujai)
+ Įjungti ribojimus pagal reikalavimą
+ Išjungti ribojimus pagal reikalavimą
+ Užklausos laikas:
+ Atstatyti
+ Numatytasis
+ Atsarginis
+ Rename
+ Naudojimas
+ 1. Rastite norimą riboti programą pagrindiniame sąraše
+ 2. Bakstelėkite programos piktogramą
+ 3. Bakstelėkite ant ketegorijų, norėdami riboti
+ Naudokite apgalvotai, apribojus interneto kategoriją, nereikia tikėtis, kad nebus interneto prieigos ir t.t.
+ Ilgai paspausti ant programos pavadinimo, perjungti pavojingas funkcijas
+ Kategorijai galite atstatyti funcijas, išskyrus pradinius duomenis
+ Funkcijų dokumentacija
+ Nesaugus, gali būti apeinamas
+ Ieškoma atnaujinimo
+ Atsiunčiamas atnaujinimas
+ Bakstelėkite, jei norite įdiegti atnaujinimą
+ Nėra atnaujinimų
+ XPrivacy 2 nebe nepalaikomas, prašome apsvarstyti galimybę atnaujinti į XPrivacy 3
+ Original
+ Serial#
+ Platuma
+ Ilguma
+ Aukštis
+ MAC adresas
+ IP addresas
+ Telefono nr.
+ Android ID
+ Reklamos ID
+ Šalis
+ Operatorius
+ Abonento ID
+ Vartotojo agentas
+ Bendras
+ Netikri duomenys
+ Atnaujinimų pranešimas
+ Riboti pagal reikalavimą
+ Vartotojų, programų, kontaktų juodasis sąrašas
+ DEBUG žurnalas (perkrauti prietaisą)
+ Eksperto režimas
+ Maks. pasitikėjimo gavimo intervalas
+ Eksperimentinės funkcijos (perkrauti prietaisą)
+ Naudojamas saugus ryšys
+ Riboti sistemos komponentus (Android) (reikia perkrauti)
+ Rodyti programos duomenų naudojimą (reikia perkrauti)
+ Rodyti duomenų naudojimo parametrus
+ Rodyti duomenų naudojimo kiekį
+ GSM stoties ID
+ GSM LAC
+ Quirks
+ AOSP mode (reikia perkrauti)
+ Pirmas langelis: apriboti kategoriją arba funkciją
+ Antras langelis: apriboti pagal reikalavimą
+ Išjungta/Įjungta: įjungti arba išjungti visus apribojimus
+ Ilgai spausti ant programos pavadinimo, norint ją pasirinti
+ apribojimai bus paprašyti
+ Programa
+ Interneto leidimai
+ Android leidimai
+ Privačių duomenų leidimai
+ Nepalaikomi duomenų leidimai
+ Išjungtų programų leidimai
+ Pavojingi ribojimai, gali sukelti problemų
+ Dalinai riboti leidimai
+ Leidimams reikia dėmesio
+ Leidimai yra pakeisti
+ Leidimai yra pateikti
+ Programa naudoja atsitiktinius duomenis
+ Pasirinkite kategoriją ribojimui
+ Bakstelėkite žymės langelį apriboti pasirinktą kategoriją\n
+\nProgramos bus įtrauktos ribojimų kategorijas\n
+\nBakstelėkite piktogramą išsamiems ribojimams ir parametrams
+ Bakstelėkite ant piktogramos papildomiems veiksmams
+ Paspauskite rodyklę žemyn, kad pamatytumėte funkcijų kategorijas
+ Valdyti programas, įskaitant nutrauktus veikimus
+ Valdyti XPrivacy apribojimus ir parametrus
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ms/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ms/strings.xml
new file mode 100644
index 0000000..82b1ff6
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ms/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy tidak diaktifkan di dalam pemasang Xposed
+ Hanya untuk Android versi 4.0.3+
+ XPrivacy tidak serasi dengan %s
+ XPrivacy versi: %s (%d)
+ Pengurus Privasi Yang Muktamad
+ Hak Cipta \u00A9 2013–2015 oleh M. Bokhorst (M66B)
+ Sedang digunakan di dalam mod keserasian
+ Berlesen, terima kasih di atas sokongan anda!
+ Penggunaan data
+ Penyegaran
+ Tetapan
+ Template
+ Lapor Isu
+ Eksport
+ Import
+ Kemuka Sekatan
+ Peroleh Sekatan
+ Tukar Tema
+ Versi Pakar
+ Tentang
+ Bantuan
+ Pilih semua
+ Susun
+ Tapis
+ Semua
+ Aktif sekatan
+ Bersih semua
+ Bersih
+ Bersih semua data XPrivacy
+ Aktif tapisan
+ Pasang template
+ Bersih
+ Lancar
+ Tetapan
+ Play Store
+ Matikan
+ Pilih akaun yang dibenarkan
+ Pilih aplikasi yang dibenarkan
+ Pilih hubungan yang dibenarkan
+ Uruskan senarai putih
+ Bimbingan
+ Pertukaran log
+ Buang cache
+ Semak jika ada pengemaskinian
+ Operasi …
+ Legenda
+ Sedang dibatalkan
+ Dibatalkan
+ Baru
+ Mengemaskini
+ Memuatkan …
+ Melaksanakan …
+ Template dilaksanakan
+ Disimpan di %s
+ Tiada sekatan ditemui
+ Anda pasti?
+ Sila pilih beberapa aplikasi
+ Sila pilih kurang daripada %d applikasi
+ Selesai
+ Peranti perlu dimulakan semula
+ Rawakkan sekarang
+ Rawakkan bila diakses
+ Rawakkan semasa peranti dihidupkan
+ Perlu mula semula
+ Sila daftarkan peranti anda
+ Sila isikan e-mel anda:
+ Sila semak e-mel untuk mengaktifkan peranti
+ Perkhidmatan mengemaskini sedang berjalan
+ Menghijrahkan %s
+ Merawakkan %s
+ Mengemaskinikan %s
+ Satu pemeriksaan dalaman gagal, hantar maklumat sokongan?
+ Disekatkan oleh XPrivacy
+ Servis Privasi tidak dijumpai; adakah anda membolehkan XPrivacy di dalam pemasang Xposed dan menghidupkan semula peranti anda?
+ Versi servis Privasi ketidaksepadanan; adakah anda menghidupkan semula peranti selepas menaiktaraf XPrivacy?
+ Sila tunggu sehingga servis menaiktaraf selesai
+ Pengguna pakar sepatutnya menyelesaikan masalah sendiri di mana boleh dan mengikuti forum XPrivacy XDA dan menolong orang lain jika boleh
+ Fungsi sekatan adalah untuk pengguna pakar. Adakah anda pengguna pakar?
+ Tekan dengan lama nama fungsi untuk menyenarai putih atau menyenarai hitam senarai parameter
+ Tanda semak dan nilai mengambil keutamaan daripada tanda semak global dan nilai; kotak tanda semak dan nilai yang kosong tidak diutamakan
+ The privacy database was reset, because it was corrupt
+ Penjagaan rapi telah diambil untuk membangunkan dan menguji XPrivacy,
+namun ia adalah mustahil untuk menjaminkan penggunaan sempurna untuk setiap peranti dan untuk semua applikasi.
+\n\nPenggunaan adalah sepenuhnya di atas risiko sendiri. \n\nLihat juga lesen:
+ Akaun (Google, Facebook, dll)
+ Pelayar (penanda buku/sejarah)
+ Kalendar
+ Panggilan (telefon, SMS, MMS)
+ Papan klip
+ Hubungan
+ Kamus (pengguna)
+ E-mel
+ Identiti (peranti)
+ Internet
+ Lokasi (terperinci/am)
+ Media (bunyi, gambar, video)
+ Mesej (SMS, MMS)
+ Rangkaian (alamat)
+ Pemberitahuan
+ Lapisan
+ Telefon (identiti, nombor, panggilan)
+ Penderia
+ Simpanan (media, kad SD)
+ Cengkerang (arahan, pengguna berkuasa)
+ Sistem (aplikasi yang dipasangkan)
+ Tinjauan (pelayar)
+ Akan mengehadkan akses kepada penglihatan aksi dan maklumat
+ Akan mengehadkan akses kepada informasi sistem, seperti aplikasi yang dipasang
+ Akan mengehadkan akses kepada arahan \'shell\', termasuk arahan \'superuser\'
+ Akan mengehadkan akses kepada penyimpanan, seperti fail di atas kad SD atau penyimpanan dalaman
+ Akan mengehadkan akses kepada sensor, seperti sensor pergerakan
+ Akan mengehadkan akses kepada informasi telefon, seperti nombor telefon
+ Akan mengehadkan lapisan jendela untuk menghalang \'phishing\'
+ Akan mengehadkan akses kepada sistem dan notifikasi aplikasi and sistem mesej awan Google
+ Akan mengehadkan akses kepada komunikasi jarak dekat
+ Akan mengehadkan akses kepada informasi rangkaian, seperti IP dan alamat MAC dan rangkaian informasi Wi-Fi
+ Akan mengehadkan akses kepada mesej yang disimpan dan diterima (SMS/MMS) dan mel suara
+ Akan mengehadkan akses kepada kamera (gambar dan video) dan mikrofon
+ Akan mengehadkan akses kepada lokasi kasar dan halus anda
+ Akan mengehadkan komunikasi antara proses, apabila digunakan untuk memintas sekatan lain
+ Akan mengehadkan akses kepada Internet
+ Akan mengehadkan maklumat yang boleh mengenalpasti anda, seperti nombor siri peranti anda
+ Akan mengehadkan akses kepada maklumat e-mel , seperti alamat dan mesej (biasa dan aplikasi G-mail sahaja)
+ Akan mengehadkan akses kepada kamus pengguna
+ Akan mengehadkan akses kepada maklumat tentang kenalan anda
+ Akan mengehadkan akses kepada informasi di atas papan klip
+ Akan mengehadkan panggilan nombor telefon, hantaran mesej (SMS/MMS) dan akses kepada sejarah panggilan
+ Akan mengehadkan akses kepada maklumat kalendar anda, seperti temujanji
+ Akan mengehadkan akses kepada maklumat pelayar, seperti penanda buku dan sejarah muat turun
+ Akan mengehadkan akses kepada maklumat akaun, seperti akaun Google, termasuk alamat G-mail anda
+ Alamat
+ Aksi
+ Alamat IP
+ Pusaka Ibunda
+ Nam kaedah
+ Nama fail
+ Arahan \'Shell\'
+ URLs
+ Transaksi
+ Keizinan
+ Tanda untuk sekat:
+ Tanda untuk membenarkan:
+ Tapis data digunakan
+ Tapis internet diakses
+ Tapis kebenaran
+ Tapis sekatan
+ Tapis aplikasi pengguna
+ Tapis atas permintaan
+ Tapis aplikasi sistem
+ Sangkalan
+ Mengikut nama
+ Mengikut uid
+ Mengikut tarikh dipasang
+ Mengikut tarikh dikemaskini
+ Mengikut tarikh diubahsuai (XPrivacy)
+ Mengikut keadaan (XPrivacy)
+ Terbalikkan susunan
+ Percubaan penggunaan:
+ Kategori:
+ Fungsi:
+ Parameter:
+ Laksanakan ke seluruh kategori
+ Sekali untuk
+ Senarai hitam/putih \'%s\'
+ Benarkan
+ Tidak dibenarkan
+ Tidak tahu
+ Sila kemukakan sekatan anda untuk menolong orang lain
+ Kebenaran
+ Sekat
+ Mengenakan template (kategori)
+ Mengenakan template (kategori+fungsi)
+ Mengenakan template (menggabungkan set)
+ Mengenakan template (menggabungkan reset)
+ Membolehkan sekatan atas permintaan
+ Menyahdayakan sekatan atas permintaan
+ Masa tamat akan:
+ Reset
+ Asal
+ Silih
+ Menamakan semula
+ Penggunaan
+ 1. Cari aplikasi untuk sekat di dalam senarai aplikasi utama
+ 2. Tekan ikon aplikasi
+ 3. Tekan tanda kotak pertama kategori yang ingin disekat
+ Gunakan akal apabila menyekat, jangan mengharapkan akses internet jika anda menyekat kategori internet, dll.
+ Tekan lama pada tajuk untuk togol fungsi bahaya
+ Mengaplikasikan kategori akan menetapkan semula fungsi pengecualian kepada nilai asal
+ Dokumentasi fungsi
+ adalah bahaya, boleh dipintas
+ Semak untuk kemas kini
+ Memuat turun kemas kini
+ Tekan untuk memasang kemas kini
+ Tiada kemas kini
+ XPrivacy 2 tidak lagi disokong, sila pertimbangkan untuk menaiktaraf kepada XPrivacy 3
+ Original
+ Siri#
+ Latitud
+ Longitud
+ Altitud
+ Alamat MAC
+ Alamat IP
+ Nombor telefon
+ Identiti Android
+ Identiti iklan
+ Negara
+ Pengendali
+ Identiti pelanggan
+ Ejen pengguna
+ Am
+ Data palsu
+ Pemberitahuan pengemaskinian
+ Sekatan di atas permintaan
+ Akaun senarai hitam, aplikasi dan kenalan
+ Log nyahsilap (perlu mula semula)
+ Mod pakar
+ Selang keyakinan pengambilan maxima
+ Fungsi dalam percubaan (perlu mula semula)
+ Guna sambungan terjamin
+ Sekat komponen sistem (Android)
+ Tunjuk penggunaan data aplikasi
+ Tunjuk parameter penggunaan data
+ Tunjuk nilai penggunaan data
+ GSM Sel ID
+ GSM LAC
+ Aneh
+ Mod AOSP (perlu menghidupkan semula peranti)
+ Tanda kotak pertama: sekat kategori atau fungsi
+ Tanda kotak kedua: sekat atas permintaan
+ Suis buka/tutup: membolehkan atau menyahdayakan semua sekatan
+ Tekan lama pada nama untuk pilih
+ sekatan akan diminta
+ Aplikasi
+ mempunyai kebenaran Internet
+ mempunyai kebenaran Android
+ telah guna data ini
+ tiada penggunaan data
+ telah dilumpuhkan
+ adalah bahaya, sekatan boleh menimbulkan masalah
+ sebahagiannya disekat
+ sekatan memerlukan perhatian
+ sekatan telah berubah
+ sekatan telah dikemukakan
+ mempunyai nilai palsu tertentu aplikasi
+ Pilih kategori untuk sekat
+ Tanda kotak untuk sekat kategori yang dipilih untuk aplikasi\n
+\nAplikasi akan diberikan data kosong atau palsu untuk kategori yang disekat\n
+\nTekan ikon aplikasi untuk sekatan terperinci dan tetapan
+ Tekan ikon aplikasi untuk lebih lagi tindakan
+ Tekan anak panah ke bawah untuk lihat pengecualian fungsi sekatan kategori
+ Menguruskan aplikasi, termasuk mematikan
+ Menguruskan sekatan XPrivacy dan tetapan
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-nb-rNO/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-nb-rNO/strings.xml
new file mode 100644
index 0000000..0e0d798
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-nb-rNO/strings.xml
@@ -0,0 +1,254 @@
+
+
+ XPrivacy er ikke frigitt i Xposed installasjon
+ Kun for Android versjon 4.0.3+
+ XPrivacy er ikke kompatibel med %s
+ XPrivacy versjon: %s (%d)
+ Den ultimative personvernbehandleren
+ Opphavsbeskyttet \u00A9 M. Bokhorst (M66B) 2013–2015
+ Kjører i samsvarende modus
+ Lisensert, takk for støtten!
+ Databruk
+ Oppdater
+ Innstillinger
+ Skjema
+ Rapporter en feil
+ Eksporter
+ Importer
+ Last opp restriksjoner
+ Hent restriksjoner
+ Bytt tema
+ Pro versjon
+ Om
+ Hjelp
+ Marker alle
+ Sorter
+ Filtrer
+ Alle
+ Skift restriksjoner
+ Nullstill alt
+ Nullstill
+ Nullstill XPRivacy data
+ Skift filter
+ Bruk skjema
+ Nullstill
+ Kjør
+ Innstillinger
+ Play Store
+ Avslutt
+ Velg konto som skal tillates
+ Velg apper som skal tillates
+ Velg kontakter som skal tillates
+ Behandle positivlister
+ Innføring
+ Endringsliste
+ Tøm hurtiglager
+ Sjekk for oppdateringer
+ Handlinger …
+ Tegnforklaring
+ Avbryter
+ Avbrutt
+ Nytt
+ Oppdater
+ Lader
+ Legger til endringer
+ Skjema i bruk
+ Lagre til %s
+ Ingen restriksjoner funnet
+ Er du sikker?
+ Vennligst velg noen apper
+ Vennligst velg mindre enn %d apper
+ Ferdig
+ Omstart nødvendig
+ Tilfeldige verdier
+ Tilfeldige verdier ved tilgang
+ Tilfeldige verdier etter omstart
+ Omstart av appen nødvendig
+ Vennligst registrer enheten din
+ Vennligst angi e-mail adressen din:
+ Sjekk e-mailen din for å aktivere enheten din
+ Oppdateringstjeneste startet
+ Migrerer %s
+ Danner tilfeldige verdier %s
+ Oppdaterer %s
+ En intern sjekk mislyktes, vil du sende støtteinformasjon?
+ Blokkert av XPrivacy
+ Personvernservice fantes ikke; har du aktivert XPrivacy i Xposed appen og omstartet enheten din?
+ Personvernservice uoverensstemmelse; har du omstartet enheten din etter oppdatering av XPrivacy?
+ Vennligst vent inntil oppdateringstjenesten er ferdig
+ Ekspert-brukere skal takle sine problemer selvstendig (hvis mulig), følge med i XDA XPrivacy forumet og hjelpe andre så godt som mulig
+ Restriksjon av funksjoner er kun for ekspert-brukere. Er du en ekspert-bruker?
+ Trykk lenge på navnet til en funksjon for å sette en parameter på negativ- eller positivlisten
+ Haker og verdier prioriteres foran globale haker og verdier; tomme avkryssingsbokser og verdier prioriteres ikke foran noen ting
+ XPrivacy databasen ble nullstillet fordi den var ødelagt/mangefull
+ XPrivacy er grundig utviklet og testet, men det er umulig å garantere at appen fungerer feilfritt på alle enheter og for alle applikasjoner.\n\nAppen brukes på egen risiko. \n\nSe også lisensen:
+ Konto (Google, Facebook, osv.)
+ Nettleser (bokmerker/historikk)
+ Kalender
+ Ringe (telefon, SMS, MMS)
+ Utklippstavle
+ Kontakter
+ Ordbok (bruker)
+ E-mail
+ Identifikasjon (enhet)
+ Internett
+ Posisjon (fin/grov)
+ Medier (lyd, foto, video)
+ Meldinger (SMS, MMS)
+ Nettverk (adresser)
+ Varslinger
+ Overlay (overlapping)
+ Telefon (ID, numre, oppringninger)
+ Sensorer
+ Minne (medier, SD kort)
+ Shell (kommandoer, superbruker)
+ System (installerte apper)
+ Betrakte (nettleser)
+ Blokkerer tilgang til betraktning og informasjon
+ Blokkerer tilgang til systeminformasjon, som installerte apper
+ Blokkerer tilgang til shell-kommandoer, til og med superuser kommandoer
+ Blokkerer tilgang til minne, som filer på SD-kortet eller internminnet
+ Blokkerer tilgang til sensorer, som bevegelsessensoren
+ Blokkerer tilgang til informasjon om mobilen, som telefonnummeret ditt
+ Blokkerer overlay-vinduer for å hindre phishing
+ Blokkerer tilgang til system og app varslinger og Google Cloud meldingstjeneste
+ Blokkerer tilgang til nærfeltskommunikasjon
+ Blokkerer tilgang til nettverkinformasjon, som IP og MAC adresser og WiFi nettverk informasjon
+ Blokkerer tilgang til lagrede og mottatte meldinger (SMS/MMS) og mobilsvar
+ Blokkerer tilgang til kameraet (foto og video) og mikrofonen
+ Blokkerer tilgang til posisjonen (fin/grov)
+ Blokkerer kommunikasjon mellom prosesser/apper, når de blir brukt for å unngå andre restriksjoner
+ Blokkerer tilgang til internettet
+ Blokkerer tilgang til informasjon som kan brukes for å identifisere deg, som serienummeret til enheten din
+ Blokkerer tilgang til e-mail informasjon, som adresser og meldinger (bare standardapper og G-mail)
+ Blokkerer tilgang til ordboka til brukeren
+ Blokkerer tilgang til informasjon om kontaktene dine
+ Blokkerer tilgang til informasjon på utklippstavlen
+ Blokkerer å ringe, sende meldinger (SMS/MMS) og tilgang til ringeloggen
+ Blokkerer tilgang til informasjon fra kalenderen, som avtalene dine
+ Blokkerer tilgang til informasjon fra nettleseren, som bokmerkene dine og historikken
+ Blokkerer tilgang til informasjon fra kontoer, som Google-kontoen din (inneholder blant annet G-mail adressen din)
+ Adresser
+ Handling
+ IP adresser
+ Lokale biblioteker
+ Metodenavner
+ Filnavner
+ Shell kommandoer
+ URLer
+ Transaksjoner
+ Tillatelser
+ Marker for å blokkere:
+ Marker for å tillate:
+ Filtrer etter databruk
+ Filtrer etter Internett bruk
+ Filtrer etter tillatelse
+ Filtrer etter restriksjon
+ Filtrer etter vanlige apper
+ Filtrer etter blokkering på forespørsel
+ Filtrer etter system-apper
+ Inverter
+ Etter navn
+ Etter uid
+ Etter dato, installert
+ Etter dato, oppdatert
+ Etter dato, modifisert (XPrivacy)
+ Etter status (XPrivacy)
+ Inverter sorteringsrekkefølge
+ Forsøk å bruke:
+ Kategori:
+ Funksjon:
+ Parametere:
+ Bruk for hele kategorien
+ En gang for
+ Positivliste \'%s\'
+ Tillat
+ Nekt
+ Vet ikke
+ Vennligst last opp restriksjonene dine for å hjelpe andre
+ Tillatelser
+ Blokker
+ Bruk skjema (kategorier)
+ Bruk skjema (kategorier og funksjoner)
+ Bruk skjema (flett)
+ Bruk skjema (flett, gjenopprett)
+ Aktiver blokkering på forespørsel
+ Deaktiver blokkering på forespørsel
+ Tidsavbrudd skal:
+ Nullstille
+ Standard
+ Alternere
+ Gi nytt navn
+ Veiledning
+ 1. Finn appen som skal blokkeres i app-hovedlisten
+ 2. Trykk på ikonen til appen
+ 3. Trykk på den første avkryssingsboksen av en kategori som skal blokkeres
+ Bruk sunn fornuft når du blokkerer noe, ikke forvent at tilgang til internettet virker ettersom du blokkerte internett-kategorien, osv.
+ Trykk lenge på tittelen til en farlig funksjon for å skifte mellom farlig/ufarlig
+ Bruk på en kategori vil nullstille unntakelser av funksjoner til standardverdier
+ Dokumentasjon av funksjoner
+ er utrygg og kan omgås
+ Sjekker for oppdatering
+ Laster ned oppdatering
+ Trykk for å installere oppdatering
+ Ingen oppdatering tilgjengelig
+ XPrivacy 2 støttes ikke lenger, vennligst vurder å oppgradere til XPrivacy 3
+ Original
+ Serienummer
+ Breddegrad
+ Lengdegrad
+ Høyde
+ MAC adresse
+ IP adresse
+ Telefonnummer
+ Android ID
+ Reklame ID
+ Land
+ Operatør
+ Abonnent ID
+ Brukeragent
+ Generell
+ Forfalsket data
+ Oppdater varslinger
+ Blokkering på forespørsel
+ Set kontoer, apper og kontakter på negativlisten
+ Feilsøkingsloggfil (omstart nødvendig)
+ Ekspert modus
+ Maksimalt konfidensintervall for å hente restriksjoner
+ Eksperimentelle funksjoner (omstart nødvendig)
+ Bruk trygg forbindelse
+ Blokker systemkomponenter (Android) (omstart nødvendig)
+ Vis brukerdata til apper (omstart nødvendig)
+ Vis brukerdata-parametere
+ Vis verdier til brukerdata
+ GSM celle ID
+ GSM LAC
+ Særegenheter
+ AOSP modus (omstart nøtvendig)
+ Første avkryssingsboksen: blokker kategori eller funksjon
+ Andre avkryssingsboksen: blokkering på forespørsel
+ Av/på bryter: aktiver eller deaktiver alle restriksjoner
+ Trykk lenge på navnet som skal markeres
+ apper spørrer om tillatelse
+ App
+ har internett tillatelse
+ har Android tillatelse
+ har benyttet denne typen av data
+ databruk er ikke tilgjengelig
+ er deaktivert
+ er farlig
+ delvis blokkert
+ restriksjoner trenger oppmerksomhet
+ restriksjoner ble forandret
+ restriksjoner ble lastet opp
+ forfalsket data er spesifikke for appen
+ Marker kategori som skal blokkeres
+ Sett hake for å blokkere kategorien som er valgt for en app\n
+\nApper får tom eller forfalsket data for kategorier som er blokkert\n
+\nTrykk på ikonet eller navnet til appen for å se detaljerte restriksjoner og innstillinger
+ Trykk på app ikonet for å få flere valg/aksjoner
+ Trykk på pilene som viser ned for å se funksjonene innen en kategori
+ Behandle apper, inklusive avslutting
+ Behandle XPrivacy restriksjoner og innstillinger
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-nl/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-nl/strings.xml
new file mode 100644
index 0000000..b1e6ebe
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-nl/strings.xml
@@ -0,0 +1,257 @@
+
+
+ XPrivacy is niet ingeschakeld in de Xposed installer
+ Alleen voor Android versie 4.0.3+
+ XPrivacy is niet verenigbaar met %1$s
+ XPrivacy versie: %1$s (%2$d)
+ De ultieme privacy manager
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Loopt in compatibiliteitsmodus
+ Gelicenseerd, bedankt voor uw ondersteuning!
+ Gebruik
+ Ververs
+ Instellingen
+ Sjabloon
+ Meld probleem
+ Exporteer
+ Importeer
+ Zend beperkingen
+ Haal beperkingen op
+ Wissel thema
+ Pro versie
+ Over
+ Help …
+ Selecteer alles
+ Sorteer
+ Filter
+ Alles
+ Schakel beperkingen
+ Alles wissen
+ Wissen
+ Wis alle XPrivacy gegevens
+ Schakel filter
+ Pas sjabloon toe
+ Wissen
+ Uitvoeren
+ Instellingen
+ Play Store
+ Geforceerd stoppen
+ Sta accounts toe
+ Sta applicaties toe
+ Sta contacten toe
+ Beheer negeerlijsten
+ Zelfstudie
+ Wijzigingslog
+ Leeg cache
+ Controleer op nieuwe versie
+ Bewerkingen …
+ Legenda
+ Afbreken
+ Afgebroken
+ Nieuw
+ Bijgewerkt
+ Laden …
+ Toepassen …
+ Sjabloon toegepast
+ Bewaard als %1$s
+ Geen beperkingen gevonden
+ Zeker weten?
+ Selecter a.u.b enkele applicaties
+ Selecteer a.u.b. minder dan %1$d applicaties
+ Gereed
+ Herstart apparaat vereist
+ Willekeurig
+ Willekeurig bij gebruik
+ Willekeurig na herstart
+ Applicatie herstart vereist
+ Registreer a.u.b. uw apparaat
+ Vul a.u.b. uw e-mail adres in:
+ Controleer uw e-mail om uw apparaat te activeren
+ Bijwerken
+ Migratie %1$s
+ Willekeurig %1$s
+ Bijwerken %1$s
+ Een interne controle faalde, wilt u de ondersteuningsinformatie sturen?
+ Beperkt door XPrivacy
+ Privacy service niet gevonden; heeft u XPrivacy aangezet in de Xposed installer en uw apparaat opnieuw gestart?
+ Privacy service versie verkeerd; heeft u uw apparaat opnieuw gestart na het bijwerken van XPrivacy?
+ Wacht a.u.b. tot het bijwerken voltooid is
+ Van ervaren gebruikers wordt verwacht dat zij waar mogelijk hun eigen problemen oplossen en dat zij het XDA XPrivacy forum volgen en anderen helpen waar mogelijk
+ Functie beperkingen zijn bedoeld voor experts. Bent u een expert?
+ Druk lang op een functienaam om een parameter op de witte of zwarte lijst te zetten
+ Vinkjes en waarden gaan voor globale vinkjes en waarden; lege vinkjes en waarden gaan niet voor
+ De privacy database werd opnieuw ingesteld, omdat hij beschadigd was
+ XPrivacy is zorgvuldig ontwikkeld en getest,
+maar het is onmogelijk om te garanderen dat het op elk apparaat en voor elke applicatie foutloos werkt.
+\n\nGebruik is geheel op eigen risico. \n\nZie ook de licentie:
+ Accounts
+ Browser
+ Kalender
+ Oproepen
+ Prikbord
+ Contacten
+ Woordenboek
+ E-mail
+ Identificatie
+ Internet
+ Locatie
+ Media
+ Berichten
+ Netwerk
+ Meldingen
+ Overlapping
+ Telefoon
+ Sensoren
+ Opslag
+ Shell
+ Systeem
+ Tonen
+ Zal de toegang tot vertoningsacties en -informatie beperken
+ Zal de toegang tot systeeminformatie, zoals geinstalleerde applicaties, beperken
+ Zal de toegang tot shell commando\'s, inclusief superuser commando\'s, beperken
+ Zal de toegang tot de opslag, zoals bestanden op uw SD-kaart en de interne opslag, beperken
+ Zal de toegang tot de sensoren, zoals de bewegingssensor, beperken
+ Zal de toegang tot telefooninformatie, zoals uw telefoonnummer, beperken
+ Zal overlappende schermen beperken om phishing te voorkomen
+ Zal de toegang tot systeem- en applicatiemeldingen en Google cloud messaging beperken
+ Zal de toegang tot near field communication beperken
+ Zal de toegang tot netwerkinformatie, zoals IP- en MAC-addressen and Wi-Fi netwerkinformatie, beperken
+ Zal de toegang tot opgeslagen en ontvangen berichten (SMS/MMS) en voicemail beperken
+ Zal de toegang tot de camera (foto\'s en video\'s) en de microfoon beperken
+ Zal de toegang tot uw grove en fijne locatie beperken
+ Zal inter-process communication beperken, wanneer gebruikt om andere beperkingen te omzeilen
+ Zal de toegang tot het internet beperken
+ Zal de toegang tot informatie welke u kunt identificeren, zoals het serienummer van uw apparaat, beperken
+ Zal de toegang tot uw e-mail informatie, zoals adressen en berichten, beperken (alleen standaard en G-mail applicatie)
+ Zal de toegang tot het gebruikerswoordenboek beperken
+ Zal de toegang tot informatie over uw contacten beperken
+ Zal de toegang tot informatie op het klembord beperken
+ Zal oproepen, sturen van berichten (SMS/MMS) en de toegang tot uw oproepgeschiedenis beperken
+ Zal de toegang tot uw kalender, zoals uw afspraken, beperken
+ Zal de toegang tot browser informatie, zoals uw favorieten en download geschiedenis, beperken
+ Zal de toegang tot uw account informatie, zoals uw Google account, inclusief uw G-mail adres, beperken
+ Adressen
+ Action
+ IP adressen
+ Native libraries
+ Methode namen
+ Bestandsnamen
+ Shell commando\'s
+ URLs
+ Transacties
+ Rechten
+ Vink aan om te beperken:
+ Vink aan om toe te staan:
+ Filter op gegevensgebruik
+ Filter op internettoegang
+ Filter op rechten
+ Filter op beperkingen
+ Filter op gebruikersapplicaties
+ Filter op on-demand
+ Filter op systeemapplicaties
+ Negatief
+ Op naam
+ Op UID
+ Op datum geïnstalleerd
+ Op datum bijgewerkt
+ Op datum gewijzigd (XPrivacy)
+ Op status (XPrivacy)
+ Omgekeerde sorteervolgorde
+ Poging tot gebruik van:
+ Categorie:
+ Functie:
+ Parameters:
+ Pas toe op gehele categorie
+ Eén keer voor
+ Negeerlijst ‘%1$s’
+ Toestaan
+ Blokkeren
+ Ik weet het niet
+ Zend a.u.b. uw beperkingen om anderen te helpen
+ Rechten
+ Beperk (categorieën)
+ Pas sjabloon toe (categorieën)
+ Pas sjabloon toe (categorieën+functies)
+ Pas sjabloon toe (samenvoegen zetten)
+ Pas sjabloon toe (samenvoegen herstellen)
+ Zet op verzoek beperken aan
+ Zet op verzoek beperken uit
+ Timeout zal:
+ Reset
+ Standaard
+ Alternatief
+ Hernoemen
+ Gebruik
+ 1. Zoek de te beperken applicatie op in de lijst met applicaties
+ 2. Klik op het icoon of de naam van de applicatie
+ 3. Vink het eerste vakje van elke categorie die je wilt beperken aan
+ Gebruik gezond verstand bij het beperken, verwacht geen internet toegang als je internet beperkt, etc.
+ Druk lang op een titel om gevaarlijke functies te schakelen
+ Toepassen op de categorie zal de functie-uitzondering herstellen naar standaard waarden
+ Functie documentatie
+ is onveilig, kan worden omzeild
+ Controleren op nieuwe versie
+ Downloaden van nieuwe versie
+ Raak aan om nieuwe versie te installeren
+ Geen nieuwe versie beschikbaar
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serienummer
+ Breedtegraad
+ Lengtegraad
+ Hoogte
+ MAC adres
+ IP adres
+ Telefoonnummer
+ Android ID
+ Advertentie ID
+ Land
+ Operator
+ Abonnee ID
+ User agent
+ Algemeen
+ Nepgegevens
+ Bijgewerkt notificaties
+ Beperken op verzoek
+ Zwarte lijst voor accounts, applicaties en contacten
+ Debug log (herstart vereist)
+ Expertmodus
+ Maximum betrouwbaarheidsinterval voor ophalen
+ Experimentele functies (herstart vereist)
+ Gebruik veilige verbindingen
+ Beperk systemcomponenten (Android)
+ Toon gebruiksgegevens
+ Toon parameters bij gebruiksgegevens
+ Toon waarden bij gebruiksgegevens
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP modus (herstart vereist)
+ Eerste vinkje: beperk categorie of functie
+ Tweede vinkje: beperk op aanvraag; eerste vinkje is standaardwaarde
+ Aan/uit schakelaar: zet alle beperkingen aan of uit
+ Druk lang op een applicatienaam om te selecteren
+ beperkingen worden gevraagd
+ Applicatie
+ heeft internet rechten
+ heeft Android rechten
+ heeft deze gegevens gebruikt
+ geen gebruiksgegevens beschikbaar
+ is uitgezet
+ is gevaarlijk
+ is gedeeltelijk beperkt
+ beperkingen hebben aandacht nodig
+ beperkingen zijn gewijzigd
+ beperkingen zijn verzonden
+ heeft applicatie-specifieke nepwaarden
+ Selecteer de te beperken categorie
+ Zet het eerste vinkje om de geselecteerde categorie te beperken voor een app\n
+\nZet het tweede vinkje om te beperken op aanvraag\n
+\nApps worden gevoed met lege of nepgegevens voor beperkte categorieën\n
+\nKlik op het icoon of de naam van de app voor gedetailleerde beperkingen en instellingen
+ Klik op het app icoon voor meer acties
+ Klik op de pijl naar beneden voor functie-uitzonderingen
+ Applicaties beheren, inclusief geforceerd stoppen
+ XPrivacy beperkingen en instellingen beheren
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-nn-rNO/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-nn-rNO/strings.xml
new file mode 100644
index 0000000..0e0d798
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-nn-rNO/strings.xml
@@ -0,0 +1,254 @@
+
+
+ XPrivacy er ikke frigitt i Xposed installasjon
+ Kun for Android versjon 4.0.3+
+ XPrivacy er ikke kompatibel med %s
+ XPrivacy versjon: %s (%d)
+ Den ultimative personvernbehandleren
+ Opphavsbeskyttet \u00A9 M. Bokhorst (M66B) 2013–2015
+ Kjører i samsvarende modus
+ Lisensert, takk for støtten!
+ Databruk
+ Oppdater
+ Innstillinger
+ Skjema
+ Rapporter en feil
+ Eksporter
+ Importer
+ Last opp restriksjoner
+ Hent restriksjoner
+ Bytt tema
+ Pro versjon
+ Om
+ Hjelp
+ Marker alle
+ Sorter
+ Filtrer
+ Alle
+ Skift restriksjoner
+ Nullstill alt
+ Nullstill
+ Nullstill XPRivacy data
+ Skift filter
+ Bruk skjema
+ Nullstill
+ Kjør
+ Innstillinger
+ Play Store
+ Avslutt
+ Velg konto som skal tillates
+ Velg apper som skal tillates
+ Velg kontakter som skal tillates
+ Behandle positivlister
+ Innføring
+ Endringsliste
+ Tøm hurtiglager
+ Sjekk for oppdateringer
+ Handlinger …
+ Tegnforklaring
+ Avbryter
+ Avbrutt
+ Nytt
+ Oppdater
+ Lader
+ Legger til endringer
+ Skjema i bruk
+ Lagre til %s
+ Ingen restriksjoner funnet
+ Er du sikker?
+ Vennligst velg noen apper
+ Vennligst velg mindre enn %d apper
+ Ferdig
+ Omstart nødvendig
+ Tilfeldige verdier
+ Tilfeldige verdier ved tilgang
+ Tilfeldige verdier etter omstart
+ Omstart av appen nødvendig
+ Vennligst registrer enheten din
+ Vennligst angi e-mail adressen din:
+ Sjekk e-mailen din for å aktivere enheten din
+ Oppdateringstjeneste startet
+ Migrerer %s
+ Danner tilfeldige verdier %s
+ Oppdaterer %s
+ En intern sjekk mislyktes, vil du sende støtteinformasjon?
+ Blokkert av XPrivacy
+ Personvernservice fantes ikke; har du aktivert XPrivacy i Xposed appen og omstartet enheten din?
+ Personvernservice uoverensstemmelse; har du omstartet enheten din etter oppdatering av XPrivacy?
+ Vennligst vent inntil oppdateringstjenesten er ferdig
+ Ekspert-brukere skal takle sine problemer selvstendig (hvis mulig), følge med i XDA XPrivacy forumet og hjelpe andre så godt som mulig
+ Restriksjon av funksjoner er kun for ekspert-brukere. Er du en ekspert-bruker?
+ Trykk lenge på navnet til en funksjon for å sette en parameter på negativ- eller positivlisten
+ Haker og verdier prioriteres foran globale haker og verdier; tomme avkryssingsbokser og verdier prioriteres ikke foran noen ting
+ XPrivacy databasen ble nullstillet fordi den var ødelagt/mangefull
+ XPrivacy er grundig utviklet og testet, men det er umulig å garantere at appen fungerer feilfritt på alle enheter og for alle applikasjoner.\n\nAppen brukes på egen risiko. \n\nSe også lisensen:
+ Konto (Google, Facebook, osv.)
+ Nettleser (bokmerker/historikk)
+ Kalender
+ Ringe (telefon, SMS, MMS)
+ Utklippstavle
+ Kontakter
+ Ordbok (bruker)
+ E-mail
+ Identifikasjon (enhet)
+ Internett
+ Posisjon (fin/grov)
+ Medier (lyd, foto, video)
+ Meldinger (SMS, MMS)
+ Nettverk (adresser)
+ Varslinger
+ Overlay (overlapping)
+ Telefon (ID, numre, oppringninger)
+ Sensorer
+ Minne (medier, SD kort)
+ Shell (kommandoer, superbruker)
+ System (installerte apper)
+ Betrakte (nettleser)
+ Blokkerer tilgang til betraktning og informasjon
+ Blokkerer tilgang til systeminformasjon, som installerte apper
+ Blokkerer tilgang til shell-kommandoer, til og med superuser kommandoer
+ Blokkerer tilgang til minne, som filer på SD-kortet eller internminnet
+ Blokkerer tilgang til sensorer, som bevegelsessensoren
+ Blokkerer tilgang til informasjon om mobilen, som telefonnummeret ditt
+ Blokkerer overlay-vinduer for å hindre phishing
+ Blokkerer tilgang til system og app varslinger og Google Cloud meldingstjeneste
+ Blokkerer tilgang til nærfeltskommunikasjon
+ Blokkerer tilgang til nettverkinformasjon, som IP og MAC adresser og WiFi nettverk informasjon
+ Blokkerer tilgang til lagrede og mottatte meldinger (SMS/MMS) og mobilsvar
+ Blokkerer tilgang til kameraet (foto og video) og mikrofonen
+ Blokkerer tilgang til posisjonen (fin/grov)
+ Blokkerer kommunikasjon mellom prosesser/apper, når de blir brukt for å unngå andre restriksjoner
+ Blokkerer tilgang til internettet
+ Blokkerer tilgang til informasjon som kan brukes for å identifisere deg, som serienummeret til enheten din
+ Blokkerer tilgang til e-mail informasjon, som adresser og meldinger (bare standardapper og G-mail)
+ Blokkerer tilgang til ordboka til brukeren
+ Blokkerer tilgang til informasjon om kontaktene dine
+ Blokkerer tilgang til informasjon på utklippstavlen
+ Blokkerer å ringe, sende meldinger (SMS/MMS) og tilgang til ringeloggen
+ Blokkerer tilgang til informasjon fra kalenderen, som avtalene dine
+ Blokkerer tilgang til informasjon fra nettleseren, som bokmerkene dine og historikken
+ Blokkerer tilgang til informasjon fra kontoer, som Google-kontoen din (inneholder blant annet G-mail adressen din)
+ Adresser
+ Handling
+ IP adresser
+ Lokale biblioteker
+ Metodenavner
+ Filnavner
+ Shell kommandoer
+ URLer
+ Transaksjoner
+ Tillatelser
+ Marker for å blokkere:
+ Marker for å tillate:
+ Filtrer etter databruk
+ Filtrer etter Internett bruk
+ Filtrer etter tillatelse
+ Filtrer etter restriksjon
+ Filtrer etter vanlige apper
+ Filtrer etter blokkering på forespørsel
+ Filtrer etter system-apper
+ Inverter
+ Etter navn
+ Etter uid
+ Etter dato, installert
+ Etter dato, oppdatert
+ Etter dato, modifisert (XPrivacy)
+ Etter status (XPrivacy)
+ Inverter sorteringsrekkefølge
+ Forsøk å bruke:
+ Kategori:
+ Funksjon:
+ Parametere:
+ Bruk for hele kategorien
+ En gang for
+ Positivliste \'%s\'
+ Tillat
+ Nekt
+ Vet ikke
+ Vennligst last opp restriksjonene dine for å hjelpe andre
+ Tillatelser
+ Blokker
+ Bruk skjema (kategorier)
+ Bruk skjema (kategorier og funksjoner)
+ Bruk skjema (flett)
+ Bruk skjema (flett, gjenopprett)
+ Aktiver blokkering på forespørsel
+ Deaktiver blokkering på forespørsel
+ Tidsavbrudd skal:
+ Nullstille
+ Standard
+ Alternere
+ Gi nytt navn
+ Veiledning
+ 1. Finn appen som skal blokkeres i app-hovedlisten
+ 2. Trykk på ikonen til appen
+ 3. Trykk på den første avkryssingsboksen av en kategori som skal blokkeres
+ Bruk sunn fornuft når du blokkerer noe, ikke forvent at tilgang til internettet virker ettersom du blokkerte internett-kategorien, osv.
+ Trykk lenge på tittelen til en farlig funksjon for å skifte mellom farlig/ufarlig
+ Bruk på en kategori vil nullstille unntakelser av funksjoner til standardverdier
+ Dokumentasjon av funksjoner
+ er utrygg og kan omgås
+ Sjekker for oppdatering
+ Laster ned oppdatering
+ Trykk for å installere oppdatering
+ Ingen oppdatering tilgjengelig
+ XPrivacy 2 støttes ikke lenger, vennligst vurder å oppgradere til XPrivacy 3
+ Original
+ Serienummer
+ Breddegrad
+ Lengdegrad
+ Høyde
+ MAC adresse
+ IP adresse
+ Telefonnummer
+ Android ID
+ Reklame ID
+ Land
+ Operatør
+ Abonnent ID
+ Brukeragent
+ Generell
+ Forfalsket data
+ Oppdater varslinger
+ Blokkering på forespørsel
+ Set kontoer, apper og kontakter på negativlisten
+ Feilsøkingsloggfil (omstart nødvendig)
+ Ekspert modus
+ Maksimalt konfidensintervall for å hente restriksjoner
+ Eksperimentelle funksjoner (omstart nødvendig)
+ Bruk trygg forbindelse
+ Blokker systemkomponenter (Android) (omstart nødvendig)
+ Vis brukerdata til apper (omstart nødvendig)
+ Vis brukerdata-parametere
+ Vis verdier til brukerdata
+ GSM celle ID
+ GSM LAC
+ Særegenheter
+ AOSP modus (omstart nøtvendig)
+ Første avkryssingsboksen: blokker kategori eller funksjon
+ Andre avkryssingsboksen: blokkering på forespørsel
+ Av/på bryter: aktiver eller deaktiver alle restriksjoner
+ Trykk lenge på navnet som skal markeres
+ apper spørrer om tillatelse
+ App
+ har internett tillatelse
+ har Android tillatelse
+ har benyttet denne typen av data
+ databruk er ikke tilgjengelig
+ er deaktivert
+ er farlig
+ delvis blokkert
+ restriksjoner trenger oppmerksomhet
+ restriksjoner ble forandret
+ restriksjoner ble lastet opp
+ forfalsket data er spesifikke for appen
+ Marker kategori som skal blokkeres
+ Sett hake for å blokkere kategorien som er valgt for en app\n
+\nApper får tom eller forfalsket data for kategorier som er blokkert\n
+\nTrykk på ikonet eller navnet til appen for å se detaljerte restriksjoner og innstillinger
+ Trykk på app ikonet for å få flere valg/aksjoner
+ Trykk på pilene som viser ned for å se funksjonene innen en kategori
+ Behandle apper, inklusive avslutting
+ Behandle XPrivacy restriksjoner og innstillinger
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-no-rNO/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-no-rNO/strings.xml
new file mode 100644
index 0000000..0e0d798
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-no-rNO/strings.xml
@@ -0,0 +1,254 @@
+
+
+ XPrivacy er ikke frigitt i Xposed installasjon
+ Kun for Android versjon 4.0.3+
+ XPrivacy er ikke kompatibel med %s
+ XPrivacy versjon: %s (%d)
+ Den ultimative personvernbehandleren
+ Opphavsbeskyttet \u00A9 M. Bokhorst (M66B) 2013–2015
+ Kjører i samsvarende modus
+ Lisensert, takk for støtten!
+ Databruk
+ Oppdater
+ Innstillinger
+ Skjema
+ Rapporter en feil
+ Eksporter
+ Importer
+ Last opp restriksjoner
+ Hent restriksjoner
+ Bytt tema
+ Pro versjon
+ Om
+ Hjelp
+ Marker alle
+ Sorter
+ Filtrer
+ Alle
+ Skift restriksjoner
+ Nullstill alt
+ Nullstill
+ Nullstill XPRivacy data
+ Skift filter
+ Bruk skjema
+ Nullstill
+ Kjør
+ Innstillinger
+ Play Store
+ Avslutt
+ Velg konto som skal tillates
+ Velg apper som skal tillates
+ Velg kontakter som skal tillates
+ Behandle positivlister
+ Innføring
+ Endringsliste
+ Tøm hurtiglager
+ Sjekk for oppdateringer
+ Handlinger …
+ Tegnforklaring
+ Avbryter
+ Avbrutt
+ Nytt
+ Oppdater
+ Lader
+ Legger til endringer
+ Skjema i bruk
+ Lagre til %s
+ Ingen restriksjoner funnet
+ Er du sikker?
+ Vennligst velg noen apper
+ Vennligst velg mindre enn %d apper
+ Ferdig
+ Omstart nødvendig
+ Tilfeldige verdier
+ Tilfeldige verdier ved tilgang
+ Tilfeldige verdier etter omstart
+ Omstart av appen nødvendig
+ Vennligst registrer enheten din
+ Vennligst angi e-mail adressen din:
+ Sjekk e-mailen din for å aktivere enheten din
+ Oppdateringstjeneste startet
+ Migrerer %s
+ Danner tilfeldige verdier %s
+ Oppdaterer %s
+ En intern sjekk mislyktes, vil du sende støtteinformasjon?
+ Blokkert av XPrivacy
+ Personvernservice fantes ikke; har du aktivert XPrivacy i Xposed appen og omstartet enheten din?
+ Personvernservice uoverensstemmelse; har du omstartet enheten din etter oppdatering av XPrivacy?
+ Vennligst vent inntil oppdateringstjenesten er ferdig
+ Ekspert-brukere skal takle sine problemer selvstendig (hvis mulig), følge med i XDA XPrivacy forumet og hjelpe andre så godt som mulig
+ Restriksjon av funksjoner er kun for ekspert-brukere. Er du en ekspert-bruker?
+ Trykk lenge på navnet til en funksjon for å sette en parameter på negativ- eller positivlisten
+ Haker og verdier prioriteres foran globale haker og verdier; tomme avkryssingsbokser og verdier prioriteres ikke foran noen ting
+ XPrivacy databasen ble nullstillet fordi den var ødelagt/mangefull
+ XPrivacy er grundig utviklet og testet, men det er umulig å garantere at appen fungerer feilfritt på alle enheter og for alle applikasjoner.\n\nAppen brukes på egen risiko. \n\nSe også lisensen:
+ Konto (Google, Facebook, osv.)
+ Nettleser (bokmerker/historikk)
+ Kalender
+ Ringe (telefon, SMS, MMS)
+ Utklippstavle
+ Kontakter
+ Ordbok (bruker)
+ E-mail
+ Identifikasjon (enhet)
+ Internett
+ Posisjon (fin/grov)
+ Medier (lyd, foto, video)
+ Meldinger (SMS, MMS)
+ Nettverk (adresser)
+ Varslinger
+ Overlay (overlapping)
+ Telefon (ID, numre, oppringninger)
+ Sensorer
+ Minne (medier, SD kort)
+ Shell (kommandoer, superbruker)
+ System (installerte apper)
+ Betrakte (nettleser)
+ Blokkerer tilgang til betraktning og informasjon
+ Blokkerer tilgang til systeminformasjon, som installerte apper
+ Blokkerer tilgang til shell-kommandoer, til og med superuser kommandoer
+ Blokkerer tilgang til minne, som filer på SD-kortet eller internminnet
+ Blokkerer tilgang til sensorer, som bevegelsessensoren
+ Blokkerer tilgang til informasjon om mobilen, som telefonnummeret ditt
+ Blokkerer overlay-vinduer for å hindre phishing
+ Blokkerer tilgang til system og app varslinger og Google Cloud meldingstjeneste
+ Blokkerer tilgang til nærfeltskommunikasjon
+ Blokkerer tilgang til nettverkinformasjon, som IP og MAC adresser og WiFi nettverk informasjon
+ Blokkerer tilgang til lagrede og mottatte meldinger (SMS/MMS) og mobilsvar
+ Blokkerer tilgang til kameraet (foto og video) og mikrofonen
+ Blokkerer tilgang til posisjonen (fin/grov)
+ Blokkerer kommunikasjon mellom prosesser/apper, når de blir brukt for å unngå andre restriksjoner
+ Blokkerer tilgang til internettet
+ Blokkerer tilgang til informasjon som kan brukes for å identifisere deg, som serienummeret til enheten din
+ Blokkerer tilgang til e-mail informasjon, som adresser og meldinger (bare standardapper og G-mail)
+ Blokkerer tilgang til ordboka til brukeren
+ Blokkerer tilgang til informasjon om kontaktene dine
+ Blokkerer tilgang til informasjon på utklippstavlen
+ Blokkerer å ringe, sende meldinger (SMS/MMS) og tilgang til ringeloggen
+ Blokkerer tilgang til informasjon fra kalenderen, som avtalene dine
+ Blokkerer tilgang til informasjon fra nettleseren, som bokmerkene dine og historikken
+ Blokkerer tilgang til informasjon fra kontoer, som Google-kontoen din (inneholder blant annet G-mail adressen din)
+ Adresser
+ Handling
+ IP adresser
+ Lokale biblioteker
+ Metodenavner
+ Filnavner
+ Shell kommandoer
+ URLer
+ Transaksjoner
+ Tillatelser
+ Marker for å blokkere:
+ Marker for å tillate:
+ Filtrer etter databruk
+ Filtrer etter Internett bruk
+ Filtrer etter tillatelse
+ Filtrer etter restriksjon
+ Filtrer etter vanlige apper
+ Filtrer etter blokkering på forespørsel
+ Filtrer etter system-apper
+ Inverter
+ Etter navn
+ Etter uid
+ Etter dato, installert
+ Etter dato, oppdatert
+ Etter dato, modifisert (XPrivacy)
+ Etter status (XPrivacy)
+ Inverter sorteringsrekkefølge
+ Forsøk å bruke:
+ Kategori:
+ Funksjon:
+ Parametere:
+ Bruk for hele kategorien
+ En gang for
+ Positivliste \'%s\'
+ Tillat
+ Nekt
+ Vet ikke
+ Vennligst last opp restriksjonene dine for å hjelpe andre
+ Tillatelser
+ Blokker
+ Bruk skjema (kategorier)
+ Bruk skjema (kategorier og funksjoner)
+ Bruk skjema (flett)
+ Bruk skjema (flett, gjenopprett)
+ Aktiver blokkering på forespørsel
+ Deaktiver blokkering på forespørsel
+ Tidsavbrudd skal:
+ Nullstille
+ Standard
+ Alternere
+ Gi nytt navn
+ Veiledning
+ 1. Finn appen som skal blokkeres i app-hovedlisten
+ 2. Trykk på ikonen til appen
+ 3. Trykk på den første avkryssingsboksen av en kategori som skal blokkeres
+ Bruk sunn fornuft når du blokkerer noe, ikke forvent at tilgang til internettet virker ettersom du blokkerte internett-kategorien, osv.
+ Trykk lenge på tittelen til en farlig funksjon for å skifte mellom farlig/ufarlig
+ Bruk på en kategori vil nullstille unntakelser av funksjoner til standardverdier
+ Dokumentasjon av funksjoner
+ er utrygg og kan omgås
+ Sjekker for oppdatering
+ Laster ned oppdatering
+ Trykk for å installere oppdatering
+ Ingen oppdatering tilgjengelig
+ XPrivacy 2 støttes ikke lenger, vennligst vurder å oppgradere til XPrivacy 3
+ Original
+ Serienummer
+ Breddegrad
+ Lengdegrad
+ Høyde
+ MAC adresse
+ IP adresse
+ Telefonnummer
+ Android ID
+ Reklame ID
+ Land
+ Operatør
+ Abonnent ID
+ Brukeragent
+ Generell
+ Forfalsket data
+ Oppdater varslinger
+ Blokkering på forespørsel
+ Set kontoer, apper og kontakter på negativlisten
+ Feilsøkingsloggfil (omstart nødvendig)
+ Ekspert modus
+ Maksimalt konfidensintervall for å hente restriksjoner
+ Eksperimentelle funksjoner (omstart nødvendig)
+ Bruk trygg forbindelse
+ Blokker systemkomponenter (Android) (omstart nødvendig)
+ Vis brukerdata til apper (omstart nødvendig)
+ Vis brukerdata-parametere
+ Vis verdier til brukerdata
+ GSM celle ID
+ GSM LAC
+ Særegenheter
+ AOSP modus (omstart nøtvendig)
+ Første avkryssingsboksen: blokker kategori eller funksjon
+ Andre avkryssingsboksen: blokkering på forespørsel
+ Av/på bryter: aktiver eller deaktiver alle restriksjoner
+ Trykk lenge på navnet som skal markeres
+ apper spørrer om tillatelse
+ App
+ har internett tillatelse
+ har Android tillatelse
+ har benyttet denne typen av data
+ databruk er ikke tilgjengelig
+ er deaktivert
+ er farlig
+ delvis blokkert
+ restriksjoner trenger oppmerksomhet
+ restriksjoner ble forandret
+ restriksjoner ble lastet opp
+ forfalsket data er spesifikke for appen
+ Marker kategori som skal blokkeres
+ Sett hake for å blokkere kategorien som er valgt for en app\n
+\nApper får tom eller forfalsket data for kategorier som er blokkert\n
+\nTrykk på ikonet eller navnet til appen for å se detaljerte restriksjoner og innstillinger
+ Trykk på app ikonet for å få flere valg/aksjoner
+ Trykk på pilene som viser ned for å se funksjonene innen en kategori
+ Behandle apper, inklusive avslutting
+ Behandle XPrivacy restriksjoner og innstillinger
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-pl/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-pl/strings.xml
new file mode 100644
index 0000000..ff6b1aa
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-pl/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy nie został włączony w instalatorze Xposed
+ Tylko dla Androida w wersji 4.0.3+
+ XPrivacy jest niekompatybilny z %s
+ Wersja XPrivacy: %s (%d)
+ Kompleksowy menadżer prywatności
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Uruchomiono w trybie kompatybilności
+ Zarejestrowana, dziekuję za wsparcie!
+ Dostęp do danych
+ Odśwież
+ Ustawienia
+ Szablon
+ Zgłoś problem
+ Eksport
+ Import
+ Wyślij restrykcje
+ Pobierz restrykcje
+ Zmień motyw
+ Wersja Pro
+ O programie
+ Pomoc
+ Zaznacz wszystko
+ Sortuj
+ Filtruj
+ Wszystko
+ Przełącz restrykcje
+ Wyczyść wszystko
+ Wyczyść
+ Wyczyść wszystkie dane
+ Przełącz filtry
+ Zastosuj szablon
+ Wyczyść
+ Uruchom
+ Ustawienia
+ Sklep Play
+ Zatrzymaj
+ Wybierz dozwolone konta
+ Wybierz dozwolone aplikacje
+ Wybierz dozwolone kontakty
+ Zarządzaj białymi listami
+ Samouczek
+ Lista zmian
+ Wyczyść cache
+ Sprawdź aktualizacje
+ Operacje …
+ Legenda
+ Przerywanie
+ Przerwano
+ Nowa aplikacja
+ Aktualizacja
+ Ładowanie
+ Stosowanie
+ Zastosowano szablon
+ Zapisane do %s
+ Nie znaleziono reguł blokowania
+ Czy jesteś pewny/a?
+ Proszę wyberz jakieś aplikacje
+ Proszę wybierz mniej niż %d aplikacji
+ Gotowe
+ Wymagany restart urządzenia
+ Losuj teraz
+ Losuj przy próbie odczytu
+ Losuj przy restarcie
+ Wymagany restart
+ Proszę zarejestruj swoje urządzenie
+ Porszę podaj swój adres e-mail:
+ Sprawdź swój e-mail aby aktywować urządzenie
+ Usługa aktualizacji działa w tle
+ Migrowanie %s
+ Losowanie %s
+ Aktualizacja %s
+ Wewnętrzna kontrola się nie powiodła. Czy chcesz wysłać informacje do supportu?
+ Ograniczone przez XPrivacy
+ Usługa prywatności nie została znaleziona; czy włączyłeś XPrivacy w instalatorze Xposed oraz uruchomiłeś ponownie urządzenie?
+ Inna wersja usługi prywatności; czy uruchomiłeś ponownie urządzenie po aktualizacji XPrivacy?
+ Proszę zaczekaj aż usługa aktualizacji zostanie zakończona
+ Eksperci powinni sami rozwiązywać swoje problemy w miarę możliwości, śledzić forum XDA XPrivacy oraz pomagać innym o ile to możliwe
+ Restrykcje funkcji są przeznaczone dla ekspertów. Czy jesteś ekspertem?
+ Przytrzymaj długo nazwę funkcji aby dodać do białej lub czarnej listy parametr
+ "Ptaszki" i wartości mają pierwszeństwo nad globalnymi "ptaszkami" i wartościami; puste "ptaszki" i wartości nie mają pierwszeństwa
+ Baza danych XPrivacy została zresetowana, ponieważ była uszkodzona
+ Dołożyliśmy wszelkich starań podczas programowania i testów XPrivacy.
+ Jednak nie możemy zagwarantować, że będzie on działać bezbłędnie na każdym urządzeniu oraz z każdą aplikacją.
+\n\nUżywasz go całkowicie na własne ryzyko. \n\nZobacz też licencję:
+ Konta (Google, Facebook, etc)
+ Przeglądarka (zakładki/historia)
+ Kalendarz
+ Połączenia (telefoniczne, SMS, MMS)
+ Schowek
+ Kontakty
+ Słownik (użytkownik)
+ E-mail
+ Identyfikacja (urządzenie)
+ Internet
+ Położenie (dokładne/przybliżone)
+ Media (audio, foto, wideo)
+ Wiadomości (SMS, MMS)
+ Sieć (adresy)
+ Powiadomienia
+ Overlay
+ Telefon (ID, numery, połączenia)
+ Czujniki
+ Storage (media, karta SD)
+ Powłoka (polecenia, superuser)
+ System (zainstalowane aplikacje)
+ Widok (przeglądarka)
+ Ograniczy dostęp do akcji view oraz informacji
+ Ograniczy dostęp do informacji o systemie, np. listy zainstalowanych aplikacji
+ Ograniczy dostęp do polecen powłoki, łącznie z poleceniem superuser
+ Ograniczy dostęp do storage, np. pliki na twojej karcie SD albo w pamięci telefonu
+ Ograniczy dostęp do czujników, np. czujnika ruchu
+ Ograniczy dostęp do informacji o telefonie, np. twój numer telefonu
+ Ograniczy okienka typu overlay aby zapobiec phishingowi
+ Ograniczy dostęp do systemowych i aplikacyjnych powiadomień oraz Google cloud messaging
+ Ograniczy dostęp do near field communication
+ Ograniczy dostęp do informacji o sieci, np. adres IP oraz MAC oraz informacje o sieci WiFi
+ Ograniczy dostęp do otrzymanych i zapisanych wiadomości (SMS/MMS) oraz do poczty głosowej
+ Ograniczy dostęp do aparatu (zdjęcia i filmy) oraz mikrofonu
+ Ograniczy dostęp do twojej przybliżonej i dokładnej lokalizacji
+ Ograniczy międzyprocesową komunikację, gdy jest używana do omijania innych ograniczeń
+ Ograniczy dostęp do internetu
+ Ograniczy informacje które mogą posłużyć do twojej identyfikacji, np. numer seryjny twojego urządzenia
+ Ograniczy dostęp do informacji e-mail, np. adresy oraz wiadomości (tylko standardowa aplikacja oraz Gmail)
+ Ograniczy dostęp do słownika użytkownika
+ Ograniczy dostęp do informacji o twoich kontaktach
+ Ograniczy dostęp do informacji w schowku
+ Ograniczy możliwość dzwonienia na numery telefonów, wysyłania wiadomości (SMS/MMS) orad dostępu do historii połączeń
+ Ograniczy dostęp do twojego kalendarza, np. twoich spotkań
+ Ograniczy dostęp do twojej przeglądarki, np. zakładek oraz historii pobierania plików
+ Ograniczy dostęp do informacji o twoim koncie, np. konice Google, które zawiera również twój adres e-mail
+ Adresy
+ Akcje
+ Adresy IP
+ Biblioteki natywne
+ Nazwy metod
+ Nazwy plików
+ Polecenia powłoki
+ URLe
+ Transakcje
+ Uprawnienia
+ Zaznacz aby zablokować:
+ Zaznacz aby zezwolić
+ Filtruj wg odczytu danych
+ Filtruj wg dostępu do internetu
+ Filtruj wg uprawnień
+ Filtruj wg ograniczeń
+ Filtruj wg aplikacji użytkownika
+ Filtruj wg dostępu na żądanie
+ Filtruj wg aplikacji systemowych
+ Odwróć
+ Po nazwie
+ Po uid
+ Po dacie instalacji
+ Po dacie aktualizacji
+ Po dacie modyfikacji (XPrivacy)
+ Po stanie (XPrivacy)
+ Odwróć porządek sortowania
+ Próba odczytu:
+ Kategoria:
+ Funkcja:
+ Parametry:
+ Zastosuj do całej kategorii
+ Jednorazowo dla
+ Biała lista \'%s\'
+ Pozwól
+ Zabroń
+ Nie wiem
+ Proszę wyślij twoje ograniczenia aby pomóc innym
+ Uprawnienia
+ Ogranicz
+ Zastosuj szablon (kategorie)
+ Zastosuj szablon (kategorie+funkcje)
+ Zastosuj szablon (scalenie)
+ Zastosuj szablon (merge reset)
+ Włącz ograniczanie na żądanie
+ Wyłącz ograniczanie na żądanie
+ Timeout spowoduje:
+ Reset
+ Domyślnie
+ Alternate
+ Zmień nazwę
+ Użycie
+ 1. Znajdź aplikację którą chcesz ograniczyć na głównej liście aplikacji
+ 2. Tapnij na ikonie aplikacji
+ 3. Tapnij na pierwszym checkboksie z danej kategorii, którą chcesz ograniczyć
+ Zachowaj zdrowy rozsądek podczas ograniczania, nie spodziewaj się dostępu do internetu jeśli ograniczyłeś kategorię Internet itp.
+ Przytrzymaj dużej na tytule aby przełączyć niebezpieczne funkcje
+ Zastosowanie kategorii zresetuje wyjątki funkcji do wartości domyślnych
+ Dokumentacja funkcji
+ jest niebezpieczne, może być ominięte
+ Sprawdzam czy są aktualizacje
+ Pobieranie aktualizacji
+ Tapnij by zainstalować aktualizację
+ Brak aktualizacji
+ XPrivacy 2 nie jest już wspierane, proszę rozważ upgrade do XPrivacy 3
+ Original
+ Numer seryjny
+ Szerokość geograficzna
+ Długość geograficzna
+ Wysokość
+ Adres MAC
+ Adres IP
+ Numer telefonu
+ Android ID
+ ID reklam
+ Kraj
+ Operator
+ Subscriber ID
+ User agent
+ Ogólne
+ Fałszowanie danych
+ Aktualizuj powiadomienia
+ Ograniczanie na żądanie
+ Umieść na czarnej liście konta, aplikacje i kontakty
+ Log debugowania (wymaga restartu)
+ Tryb eksperta
+ Maksymalna wartość wspołczynnika zaufania
+ Eksperymentalne funkcje (wymaga restartu)
+ Użyj bezpiecznych połaczeń
+ Ogranicz komponenty systemowe (Android) (wymaga restartu)
+ Pokaż użycie danych przez aplikacje (wymaga restartu)
+ Pokaż parametry odczytu danych
+ Pokaż wartości odczytanych danych
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ Tryb AOSP (wymaga restartu)
+ Pierwszy check box: ogranicz kategorię lub funkcję
+ Drugi "ptaszek": ogranicz na żądanie
+ Przełącznik On/off: włącz lub wyłącz wszystkie ograniczenia
+ Przytrzymaj na nazwie aby wybrać
+ będą pytania o ograniczenia
+ Aplikacja
+ ma dostęp do internetu
+ ma dostęp do uprawnień Androida
+ odczytała dane
+ brak informacji o odczycie danych
+ jest wyłączona
+ jest niebezpieczne, ograniczenie może spowodować problemy
+ częściowo ograniczone
+ restrykcje wymagają sprawdzenia
+ restrykcje się zmieniły
+ restrykcje zostały wysłane
+ aplikacja ma specyficzne sfałszowane wartości
+ Wybierz kategorię do ograniczenia
+ Tapnij "ptaszka" aby ograniczyć wybraną kategorię dla danej aplikacji\n
+\nDla ograniczonych kategorii aplikacjom będą podawane puste albo sfałszowane wartości\n
+\nTapnij ikonę aplikacji aby uzyskać dostęp do szczegółowych ograniczeń i ustawień
+ Tapnij na ikone aplikacji po więcej akcji
+ Tapnij na strzałkę w dół aby zobaczyć wyjątki ograniczeń w danej kategorii
+ Zarządzaj aplikacjami, włącznie z zabijaniem
+ Zarządzaj ograniczeniami i ustawieniami XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-pt/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-pt/strings.xml
new file mode 100644
index 0000000..9acd55d
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-pt/strings.xml
@@ -0,0 +1,256 @@
+
+
+ O XPrivacy não está ativado no Xposed installer
+ Apenas para a versão de Android 4.0.3+
+ O XPrivacy é incompatível com %s
+ XPrivacy versão: %s (%d)
+ The ultimate privacy manager
+ Direitos de autor \u00A9 2013–2015 por M. Bokhorst (M66B)
+ A correr em modo de compatibilidade
+ Licenciado, obrigado pelo apoio!
+ Uso
+ Atualizar
+ Definições
+ Modelo
+ Reportar problemas
+ Exportar
+ Importar
+ Enviar restrições
+ Procurar restrições
+ Mudar o tema
+ Versão Pro
+ Sobre
+ Ajuda
+ Selecionar tudo
+ Ordenar
+ Filtrar
+ Tudo
+ Alternar restrições
+ Apagar tudo
+ Apagar
+ Apagar todos os dados
+ Alternar filtro
+ Aplicar modelo
+ Limpar
+ Iniciar
+ Detalhes da aplicação
+ Play Store
+ Terminar
+ Selecione contas a autorizar
+ Selecione aplicações a autorizar
+ Selecione contactos a autorizar
+ Gerir lista de exclusões
+ Guia
+ Registo de alterações
+ Apagar cache
+ Verificar por atualizações
+ Operações …
+ Legenda
+ Abortando
+ Abortado
+ Novo
+ Atualização
+ A carregar
+ A aplicar
+ Modelo aplicado
+ Guardado em %s
+ Nenhuma restrição encontrada
+ Tem a certeza?
+ Selecione algumas aplicações
+ Selecione menos de %d aplicações
+ Concluído
+ É necessário reiniciar o dispositivo
+ Aleatório
+ Randomize ao aceder
+ Aleatório depois de iniciar
+ Reinício da aplicação necessário
+ Por favor, registe o seu dispositivo
+ Por favor, insira o seu endereço de e-mail:
+ Verifique o seu e-mail para ativar o seu dispositivo
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ A aplicação XPrivacy foi desenvolvida e testada com todo o cuidado,
+porém é impossível garantir que irá funcionar sem problemas em todos os dispositivos e com todas as aplicações.
+\n\nO uso desta aplicação é inteiramente por sua conta e risco. \n\nVer também a licença:
+ Contas (Google, Facebook, etc)
+ Navegador (favoritos/histórico)
+ Calendário
+ Chamada (telefone, SMS, MMS)
+ Área de transferência
+ Contactos
+ Dicionário (usuário)
+ E-mail
+ Identificação (dispositivo)
+ Internet
+ Localização (boa/vulgar)
+ Média (áudio, foto, vídeo)
+ Mensagens (SMS, MMS)
+ Rede (endereços)
+ Notificações
+ Overlay
+ Telefone (identidade, números, chamadas)
+ Sensors
+ Armazenamento (média, cartão de memória)
+ Shell (linha de comandos, superuser)
+ Sistema (aplicações instaladas)
+ Ver (navegador)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Ação
+ IP addresses
+ Native libraries
+ Method names
+ Nomes de ficheiros
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Clique para restringir:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Categoria:
+ Função:
+ Parâmetros:
+ Aplicar a toda a categoria
+ Uma vez por
+ White/blacklist \'%s\'
+ Permitir
+ Bloquear
+ Não sei
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Valor por defeito
+ Alternativo
+ Mudar o nome
+ Uso
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ é inseguro, pode ser contornado
+ A procurar por atualização
+ A descarregar atualização
+ Clique para instalar atualização
+ Não existem atualizações disponíveis
+ O XPrivacy 2 já não é suportado, por favor, considere atualizar para o XPrivacy 3
+ Original
+ Serial#
+ Latitude
+ Longitude
+ Altitude
+ Endereço MAC
+ Endereço IP
+ Número de telefone
+ Identidade do Android
+ Identificador de publicidade
+ País
+ Operador
+ Identidade do subscritor
+ User agent
+ Geral
+ Dados falsos
+ Notificações de atualização
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Relatório de depuração (requer reinicialização)
+ Modo avançado
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ Modo AOSP (requer reinício do dispositivo)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Aplicação
+ Tem permissão da Internet
+ Tem permissão do Android
+ Tem usado estes dados
+ no usage data available
+ Está desativado
+ É perigoso
+ parcialmente restrito
+ restrições requerem atenção
+ restrições são alteradas
+ restrições submetidas
+ has application specific fake values
+ Selecione a categoria para restringir
+ Tap a check box to restrict the selected category for an app\n
+\nAs aplicações não receberão dados ou estes serão falsos para as categorias restritas\n
+\nClique no icon da aplicação para obter informação detalhada sobre restrições e definições
+ Clique no icon da aplicação para mais ações
+ Clique na seta para baixo para ver as exceções das funções de uma categoria restrita
+ Gerir aplicações, incluindo terminar
+ Gerir restrições e definições do XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ro/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ro/strings.xml
new file mode 100644
index 0000000..afd0220
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ro/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy nu este bifat in Xposed installer
+ Only for Android version 4.0.3+
+ XPrivacy is incompatible with %s
+ versiunea XPrivacy: %s (%d)
+ The ultimate privacy manager
+ Drepturi de autor rezervate \u00A9 2013–2015 M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Usage
+ Refresh
+ Setari
+ Template
+ Raporteaza o problema
+ Exporta
+ Importa
+ Submit restrictions
+ Fetch restrictions
+ Schimba tema
+ Versiunea Pro
+ Despre
+ Help …
+ Select all
+ Sort
+ Filter
+ Tot
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ Clear
+ Launch
+ Settings
+ Play Store
+ Kill
+ Select accounts to allow
+ Select applications to allow
+ Select contacts to allow
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ Loading
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ Are you sure?
+ Please select some applications
+ Please select fewer than %d applications
+ Done
+ Reboot required
+ Randomize
+ Randomize on access
+ Randomize after boot
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Great care has been taken to develop and test XPrivacy,
+however it is impossible to guarantee it will work flawless on each and every device and for each and every application.
+\n\nUse is entirely at your own risk. \n\nSee also the license:
+ Conturi (Google, Facebook, etc)
+ Browser (semne de carte/istorie)
+ Calendar
+ Conversatii (apeluri, SMS, MMS)
+ Clipboard
+ Contacte
+ Dictionary (user)
+ E-mail
+ Date de identificare (dispozitivul propriu)
+ Internet
+ Locatie (fina/in mare)
+ Media (audio, foto, video)
+ Mesaje (SMS, MMS)
+ Retea Internet (adrese)
+ Notifications
+ Overlay
+ Telefon (date proprii de identificare, numere, apeluri)
+ Sensors
+ Stocare (media, card SD)
+ Interfata (Shell) (comenzi, superuser)
+ Sistem (aplicatii instalate)
+ Acces browser
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Bifeaza pentru a restrictiona:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serial#
+ Latitudine
+ Longitudine
+ Altitude
+ MAC address
+ IP address
+ Phone number
+ Android ID
+ Advertisement ID
+ Country
+ Operator
+ Subscriber ID
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Aplicatie
+ are permisiune Internet
+ are permisiune Android
+ a utilizat aceste date
+ no usage data available
+ is disabled
+ is dangerous
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-ru/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-ru/strings.xml
new file mode 100644
index 0000000..8576aac
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-ru/strings.xml
@@ -0,0 +1,257 @@
+
+
+ Модуль XPrivacy не активирован в Xposed installer
+ Только для Android версии 4.0.3 и выше
+ XPrivacy не совместим с %1$s
+ Версия XPrivacy: %1$s (%2$d)
+ Продвинутый менеджер конфиденциальности
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Запущен в режиме совместимости
+ Зарегистрировано. Спасибо за Вашу поддержку!
+ Данные об использовании
+ Обновить
+ Параметры
+ Шаблон
+ Сообщить об ошибке
+ Экспорт
+ Импорт
+ Отправить ограничения
+ Получить ограничения
+ Переключить тему
+ Pro-версия
+ О программе
+ Помощь …
+ Выбрать всё
+ Сортировка
+ Фильтр
+ Все
+ Переключить ограничения
+ Очистить все
+ Очистить
+ Очистить все данные XPrivacy
+ Переключить фильтр
+ Применить шаблон
+ Очистить
+ Запустить
+ Настройки
+ Play Маркет
+ Завершить
+ Разрешенные учетные записи
+ Разрешенные приложения
+ Разрешенные контакты
+ Управление списком исключений
+ Обучение
+ Список изменений
+ Сбросить кэш
+ Проверка обновлений
+ Операции …
+ Легенда
+ Прерывается
+ Прервано
+ Новое
+ Обновить
+ Загрузка …
+ Применение …
+ Шаблон применен
+ Сохранено в %1$s
+ Не найдено ограничений
+ Вы уверены?
+ Пожалуйста, выберите приложения
+ Можно выбрать не более %1$d приложений
+ Готово
+ Требуется перезагрузка устройства
+ Случайные значения
+ Случайные значения при запросе
+ Случайные значения при перезагрузке
+ Требуется перезапуск приложения
+ Зарегистрируйте своё устройство, пожалуйста
+ Введите, пожалуйста, адрес своей почты:
+ Проверьте почту, чтобы активировать устройство
+ Сервис обновлений запущен
+ Миграция %1$s
+ Генерация случайных значений %1$s
+ Обновление %1$s
+ Внутренняя проверка не удалась. Хотите отправить информацию в службу поддержки?
+ Запрещено XPrivacy
+ Служба Privacy не найдена; Вы активировали XPrivacy в Xposed и перезагрузили своё устройство?
+ Версия службы Privacy не совпадает; Вы перезагрузили своё устройство после обновления XPrivacy?
+ Пожалуйста, подождите завершения обновления
+ Предполагается, что эксперты решают проблемы самостоятельно, следят за темой XPrivacy на XDA и помогают другим по возможности
+ Данные ограничения предназначены для экспертов. Вы уверены?
+ Долгое нажатие на имени функции для добавления параметра в список исключений
+ Галочки и введенные значения имеют приоритет перед глобальными настройками, пустые поля не имеют приоритета
+ База настроек очищена, так как была повреждена
+ Большое внимание было уделено разработке и тестированию XPrivacy,
+однако нельзя гарантировать, что оно будет работать безупречно на всех устройствах и со всеми приложениями.
+\n\nИспользуйте исключительно на свой страх и риск. \n\nСм. также лицензию:
+ Учетные записи
+ Браузер
+ Календарь
+ Вызовы
+ Буфер обмена
+ Контакты
+ Словарь
+ E-mail
+ Идентификация
+ Интернет
+ Местоположение (точное/приблизительное)
+ Медиа
+ Сообщения
+ Сеть
+ Уведомления
+ Наложение
+ Телефон
+ Датчики
+ Хранилище
+ Команды shell
+ Система
+ Просмотр
+ Ограничивает доступ к просмотру и информации
+ Ограничивает доступ к системной информации, такой как установленные приложения
+ Ограничивает доступ к командам shell, включая команды суперпользователя
+ Ограничивает доступ к хранилищу, например файлы в телефоне и на карте памяти
+ Ограничивает доступ к датчикам, например к датчику движения
+ Ограничивает доступ к информации о телефоне, такой как Ваш номер
+ Ограничивает возможность размещения окон поверх других приложений для предотвращения фишинга
+ Ограничивает доступ к уведомлениям от системы и приложений, а также Google cloud messaging
+ Ограничивает доступ к NFC
+ Ограничивает доступ к сетевой информации, например IP/MAC-адреса и информация о сети Wi-Fi
+ Ограничивает доступ к сохраненным и получаемым сообщениям СМС/ММС и голосовой почты
+ Ограничивает доступ к камере (фото и видео) и микрофону
+ Ограничивает доступ к Вашему приблизительному и точному местоположению
+ Ограничивает взаимодействие между процессами, использующееся для обхода разрешений
+ Ограничивает доступ к интернету
+ Ограничивает доступ к информации, по которой можно узнать Вас, например, серийный номер Вашего устройства
+ Ограничивает доступ к такой информации, как адреса и сообщения (только для стандартного приложения и Gmail)
+ Ограничивает доступ к пользовательскому словарю
+ Ограничивает доступ к информации о Ваших контактах
+ Ограничивает доступ к буферу обмена
+ Ограничивает возможность набора номера, отправки сообщений (СМС/ММС) и доступа к журналу вызовов
+ Ограничивает доступ к Вашему календарю, например встречам
+ Ограничивает доступ к информации браузера, такой как закладки и история загрузок
+ Ограничивает доступ к информации об аккаунтах, например, к Вашей учётной записи Google, которая содержит Ваш адрес Gmail
+ Адреса
+ Действия
+ IP адреса
+ Системные библиотеки
+ Имена методов
+ Имена файлов
+ Команды shell
+ URL
+ Транзакции
+ Разрешения
+ Отметьте для запрета:
+ Отметьте для разрешения:
+ использовавшие данные
+ с доступом к Интернету
+ с разрешениями
+ запрещенные
+ пользовательские приложения
+ с запросом ограничений
+ системные приложения
+ переключить
+ По имени
+ По uid
+ По дате установки
+ По дате обновления
+ По дате изменения (XPrivacy)
+ По состоянию (XPrivacy)
+ Инвертировать порядок сортировки
+ Попытка использования:
+ Категория:
+ Функция:
+ Параметры:
+ Применить ко всей категории
+ Один раз
+ В исключения ‘%1$s’
+ Разрешить
+ Запретить
+ Не знаю
+ Пожалуйста, отправьте Ваши ограничения, чтобы помочь остальным
+ Разрешения
+ Запретить (категории)
+ Применить шаблон (категории)
+ Применить шаблон (категории+функции)
+ Применить шаблон (слияние)
+ Применить шаблон (сброс)
+ Включить запрос ограничений
+ Отключить запрос ограничений
+ Временный выбор:
+ Сбросить
+ По умолчанию
+ Альтернативный
+ Переименовать
+ Использование
+ 1. Найдите приложение для запрета в главном списке приложений
+ 2. Нажмите на значок приложения
+ 3. Отметьте галочкой первый пункт в любой категории, которую Вы хотите запретить
+ Запрещая, используйте здравый смысл. Не ожидайте доступа в интернет, запретив категорию Интернет, и т.д.
+ Долгое нажатие на имени для переключения опасных функций
+ Применение к категории сбросит исключения для функций к значениям по умолчанию
+ Справка по функции
+ небезопасно, можно обойти
+ Проверка обновления
+ Загрузка обновления
+ Нажмите для установки обновления
+ Нет доступных обновлений
+ XPrivacy 2 больше не поддерживается, обновитесь, пожалуйста, до XPrivacy 3
+ Оригинал
+ Серийный номер
+ Широта
+ Долгота
+ Высота
+ MAC-адрес
+ IP-адрес
+ Номер телефона
+ Android ID
+ Рекламный ID
+ Страна
+ Оператор
+ ID подписчика
+ Польз. агент
+ Общее
+ Фальшивые данные
+ Уведомления при обновлениях
+ Запрос ограничений
+ Черный список аккаунтов, приложений и контактов
+ Журнал отладки (требуется перезагрузка)
+ Режим эксперта
+ Макс. доверительный интервал выборки
+ Экспериментальные функции (требуется перезагрузка)
+ Использовать безопасные соединения
+ Запрет системных компонентов (Android)
+ Показывать данные об использовании
+ Показывать параметры в данных об использовании
+ Показывать значения в данных об использовании
+ ID соты GSM
+ GSM LAC
+ Модификации
+ Режим AOSP (требуется перезагрузка)
+ Первая галочка: ограничить категорию или функцию
+ Вторая галочка: ограничить при запросе; первая галочка является значением по умолчанию
+ Переключатель вкл/выкл: включить или выключить все ограничения
+ Долгое нажатие на имени для выбора
+ Ограничения будут запрошены
+ Приложение
+ Имеет разрешение на доступ в интернет
+ Имеет разрешение Android
+ Есть данные по использованию
+ Нет данных по использованию
+ Отключено
+ Ограничения могут привести к проблемам
+ Частично запрещено
+ Ограничения требуют внимания
+ Ограничения изменены
+ Ограничения отправлены
+ Имеет специфичные для себя фальшивые данные
+ Выберите категорию для ограничения
+ Отметьте галочкой первую клетку для ограничения выбранной категории для приложения\n
+\nОтметьте вторую клетку для ограничений по запросу\n
+\nПриложения будут получать пустые или фальшивые данные для ограниченных категорий\n
+\nНажмите на значке приложения, чтобы увидеть подробные ограничения и настройки.
+ Нажмите на значке приложения для дополнительных действий
+ Нажмите на стрелке, чтобы увидеть отдельные функции и их ограничения в категории
+ Управление приложениями, включая завершение
+ Управление ограничениями и настройками XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-sk/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-sk/strings.xml
new file mode 100644
index 0000000..c76d28c
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-sk/strings.xml
@@ -0,0 +1,256 @@
+
+
+ Modul XPrivacy nie je aktivovaný v Xposed Installeri
+ Len pre Android 4.0.3+
+ Aplikácia XPrivacy nie je kompatibilná s %1$s
+ Verzia XPrivacy: %1$s (%2$d)
+ Pokročilý správca súkromia
+ Autorské práva \u00A9 2013–2015 od M. Bokhorst (M66B)
+ Spustené v režime kompatibility
+ Licencované. Ďakujeme za vašu podporu!
+ Využitie dát
+ Obnoviť
+ Nastavenia
+ Šablóna
+ Nahlásiť problém
+ Exportovať
+ Importovať
+ Zmeniť tému
+ Odoslať obmedzenia
+ Stiahnuť obmedzenia
+ Pro verzia
+ O aplikácii
+ Pomocník…
+ Vybrať všetky
+ Zoradiť
+ Filtrovať
+ Všetko
+ Prepnúť obmedzenia
+ Vymazať všetky
+ Vymazať
+ Vymazať všetky údaje
+ Prepnúť filter
+ Aplikovať šablónu
+ Vymazať
+ Spustiť
+ Nastavenia
+ Obchod Play
+ Ukončiť
+ Povolené účty
+ Povolené aplikácie
+ Povolené kontakty
+ Spravovať biele listiny
+ Príručka
+ Zoznam zmien
+ Vymazať vyrovnávaciu pamäť
+ Skontrolovať aktualizácie
+ Operácie…
+ Legenda
+ Rušenie
+ Zrušené
+ Nové
+ Aktualizácia
+ Načítavanie…
+ Aplikácia…
+ Šablóny bola aplikovaná
+ Uložené do %1$s
+ Nenájdené žiadne obmedzenia
+ Ste si istý?
+ Vyberte, prosím, nejaké aplikácie
+ Vyberte, prosím, menej než %1$d aplikácií
+ Hotovo
+ Vyžadovaný reštart zariadenia
+ Náhodné hodnoty
+ Náhodné hodnoty po prístupe
+ Náhodné hodnoty pri štarte zariadenia
+ Vyžadovaný reštart aplikácie
+ Zaregistruje, prosím, vaše zariadenie
+ Zadajte, prosím, vašu e-mailovú adresu:
+ Skontrolujte váš e-mail pre aktiváciu vášho zariadenia
+ Aktualizačná služba je spustená
+ Migrácia %1$s
+ Randomizácia %1$s
+ Aktualizácia %1$s
+ Vnútorná kontrola zlyhala. Chcete odoslať informácie na podporu?
+ Obmedzené pomocou XPrivacy
+ Nenájdená služba súkromia; povolili ste XPrivacy v Xposed Installeri a vykonali reštart vášho zariadenia?
+ Verzia služby súkromia sa nezhoduje; vykonali ste reštart vášho zariadenia po aktualizovaní XPrivacy?
+ Prosím, počkajte, kým nebude dokončená aktualizačná služba
+ Skusení používatelia dokážu vyriešiť svoje problémy vo väčšine prípadov a nasledovať tému XPrivacy na XDA fóre a pomáhať ostatným, ak je to možné
+ Obmedzenia funkcií sú určené pre skúsených užívateľov. Ste skúsený používateľ?
+ Dlho stlačte názov funkcie pre umiestnenie parametra na bielu alebo čiernu listinu
+ Zaškrtávacie polia a hodnoty majú prednosť pred globálnymi zaškrtávacími poliami a hodnotami; prázdne zaškrtávacie polia a hodnoty nemajú prednosť
+ Súkromná databáza sa obnovila, pretože bola poškodená
+ Veľká starostlivosť bola venovaná vývoju a testovaniu XPrivacy,
+avšak nie je nemožné zaručiť, že bude fungovať bezchybne na každom zariadení a na každú aplikáciu.
+\n\nPoužitie je plne na vlastné riziko. \n\nPozrite tiež licenciu:
+ Účty (Google, Facebook, atď.)
+ Prehliadač (záložky/história)
+ Kalendár
+ Volanie (telefón, SMS, MMS)
+ Schránka
+ Kontakty
+ Slovník (používateľ)
+ E-mail
+ Identifikácia (zariadenie)
+ Internet
+ Poloha (presná/približná)
+ Médiá (hudba, fotky, videá)
+ Správy (SMS, MMS)
+ Sieť (adresy)
+ Oznámenia
+ Prekrytie
+ Telefón (ID, čísla, hovory)
+ Sensory
+ Úložisko (médiá, karta SD)
+ Konzola (príkazy, superuser)
+ Systém (nainštalované aplikácie)
+ Zobrazenie (prehliadač)
+ Obmedzí prístup k akciám zobrazenia a informáciám
+ Obmedzí prístup k informáciám o systéme, akými sú napríklad nainštalované aplikácie
+ Obmedzí prístup k príkazom konzoly, vrátane superuser príkazov
+ Obmedzí prístup k úložisku, akými sú napríklad súbory na karte SD alebo na internom úložisku
+ Obmedzí prístup k snímačom, akým je napríklad snímač pohybu
+ Obmedzí prístup k informáciám o telefóne, akým je napríklad vaše telefónne číslo
+ Obmedzí prekrývanie okien na predídenie phishingu
+ Obmedzí prístup k systému, oznámeniam aplikácií a Google cloudovým správam
+ Obmedzí prístup k NFC
+ Obmedzí prístup k informáciám o sieti, akými sú napríklad adresy IP a MAC a sieťové informácie o Wi-Fi
+ Obmedzí prístup k uloženým a prijatým správam (SMS/MMS) a hlasovej pošte
+ Obmedzí prístup k fotoaparátu (fotografie a videá) a mikrofónu
+ Obmedzí prístup k vašej približnej a presnej polohe
+ Obmedzí komunikáciu medzi procesmi, keď sa používajú na obídenie ďalších obmedzení
+ Obmedzí prístup k internetu
+ Obmedzí všetky informácie, ktoré vás môžu identifikovať, akým je napríklad sériové číslo vášho zariadenia
+ Obmedzí prístup k e-mailovým informáciám, akými sú napríklad adresy a správy (len štandardná a G-mail aplikácia)
+ Obmedzí prístup ku slovníku používateľa
+ Obmedzí prístup k informáciám o kontaktoch
+ Obmedzí prístup k informáciám v schránke
+ Obmedzí volanie telefónnych čísel, posielanie správ (SMS/MMS) a prístup k vašej histórii hovorov
+ Obmedzí prístup k informáciám kalendára, akými sú napríklad vaše stretnutia
+ Obmedzí prístup k informáciám prehliadača, akými sú napríklad vaše záložky a história sťahovaní
+ Obmedzí prístup k informáciám o účtoch, akým je napríklad váš účet Google, ktorý obsahuje vašu G-mailovú adresu
+ Adresy
+ Akcie
+ Adresy IP
+ Natívne knižnice
+ Názvy metód
+ Názvy súborov
+ Konzolové príkazy
+ Adresy URL
+ Transakcie
+ Povolenia
+ Zaškrtnite pre obmedzenie:
+ Zaškrtnite pre povolenie:
+ Filtrovať využitie dát
+ Filtrovať prístup k internetu
+ Filtrovať povolenie
+ Filtrovať obmedzené
+ Filtrovať používateľské aplikácie
+ Filtrovať podľa požiadavkov
+ Filtrovať systémové aplikácie
+ Obrátiť
+ Podľa názvu
+ Podľa UID
+ Podľa dátumu inštalácie
+ Podľa dátumu aktulizácie
+ Podľa dátumu zmeny (XPrivacy)
+ Podľa stavu (XPrivacy)
+ Obrátiť poradie zoradenia
+ Pokus o použitie:
+ Kategória:
+ Funkcia:
+ Parametre:
+ Použiť na celú kategóriu
+ Raz za
+ Biela/čierna listina \'%1$s\'
+ Povoliť
+ Odmietnuť
+ Neviem
+ Odošlite, prosím, vaše obmedzenia na pomoc ostatným
+ Povolenia
+ Obmedziť (kategórie)
+ Použiť šablónu (kategórie)
+ Použiť šablónu (kategórie+funkcie)
+ Použiť šablónu (nastaviť zlúčenie)
+ Použiť šablónu (obnoviť zlúčenie)
+ Povoliť obmedzenie na požiadanie
+ Zakázať obmedzenie na požiadanie
+ Časový limit bude:
+ Obnoviť
+ Predvolená
+ Alternatívna
+ Premenovať
+ Použitie
+ 1. Nájdite aplikáciu na obmedzenie v hlavnom zozname aplikácií
+ 2. Kliknite na ikonu aplikácie
+ 3. Kliknite na prvé zaškrtávacie pole v akejkoľvek kategórii, ktorú chcete obmedziť
+ Používajte zdravý rozum pri obmedzovaní. Nočakávajte prístup k internetu, ak ste obmedzili kategóriu Internet, atď.
+ Dlho stlačte názov pre prepnutie nebezpečných funkcií
+ Použitie kategórie obnoví výnimky funkcií na predvolené hodnoty
+ Dokumentácia funkcie
+ je nebezpečná, môže byť obídená
+ Kontrola aktualizácií
+ Sťahovanie akualizácie
+ Dotykom nainštalujete aktualizáciu
+ Žiadne aktualizácie k dispozícii
+ Aplikácia XPrivacy 2 už nie je podporovaná, prosím, zvážte aktualizáciu na XPrivacy 3
+ Pôvodná hodnota
+ Sériové číslo
+ Zemepisná šírka
+ Zemepisná dĺžka
+ Nadmorská výška
+ Adresa MAC
+ Adresa IP
+ Telefónne číslo
+ Android ID
+ ID reklamy
+ Krajina
+ Operátor
+ IMSI
+ Používateľský agent
+ Všeobecné
+ Falošné údaje
+ Oznámenia o aktualizáciách
+ Obmedziť na požiadanie
+ Účty, aplikácie a kontakty na čiernej listine
+ Záznam na ladenie (vyžadovaný reštart)
+ Režim experta
+ Maximálny interval spoľahlivosti sťahovania
+ Experimentálne funkcie (vyžadovaný reštart)
+ Použiť zabezpečené pripojenie
+ Obmedziť systémové komponenty (Android) (vyžadovaný reštart)
+ Zobraziť využitie dát aplikáciou (vyžadovaný reštart)
+ Zobraziť parametre využitia dát
+ Zobraziť hodnoty využitia dát
+ Identifikátor bunky GSM
+ Kód lokality GSM
+ Quirky
+ Režim AOSP (vyžadovaný reštart)
+ Prvé zaškrtávacie pole: obmedziť kategóriu alebo funkciu
+ Druhé zaškrtávacie pole: obmedziť na požiadanie
+ Prepínač zapnutia/vypnutia: povoliť alebo zakázať všetky obmedzenia
+ Vyberte dlhým stlačením názvu
+ obmedzenia budú požadované
+ Aplikácia
+ má internetové povolenie
+ má Android povolenie
+ používala tieto dáta
+ nedostupné využitie dát
+ je zakázaná
+ je nebezpečná
+ čiastočne obmedzené
+ obmedzenia vyžadujú pozornosť
+ obmedzenia sú zmenené
+ obmedzenia sú odoslané
+ aplikácia má určité falošné hodnoty
+ Vyberte kategóriu na obmedzenie
+ Kliknite na zaškrtávacie pole pre obmedzenie vybranej kategórie pre aplikáciu\n
+\nPri obmedzených kategóriách budú aplikáciám poskytované prázdne, alebo falošné údaje\n
+\nKliknite na ikonu alebo na názov aplikácie pre podrobné obmedzenia a nastavenia
+ Kliknite na ikonu aplikácie pre viac akcií
+ Kliknite na šípku nadol pre zobrazenie funkčných výnimiek pre kategóriu obmedzení
+ Spravovať aplikácie, vrátane ich ukončenia
+ Spravovať obmedzenia a nastavenia XPrivacy
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-sl/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-sl/strings.xml
new file mode 100644
index 0000000..fbf2492
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-sl/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy ni omogočen v Xposed installer
+ Samo za Android različice 4.0.3+
+ XPrivacy ni kompatibilen z %1$s
+ XPrivacy različica: %1$s (%2$d)
+ Odlični upravljalec pravic
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Aplikacija teče v kompatibilnem načinu
+ Lincecirano, hvala za Vašo podporo!
+ Uporaba
+ Osveži
+ Nastavitve
+ Predloga
+ Javi napako
+ Izvozi
+ Uvozi
+ Pošlji omejitve
+ Prenesi omejitve
+ Spremeni temo
+ Pro različica
+ O programu
+ Pomoč
+ Izberi vse
+ Razvrsti
+ Filtriranje
+ Vse
+ Preklopi omejitve
+ Počisti vse
+ Počisti
+ Počisti vse podatke
+ Preklopi filtre
+ Uporabi predlogo
+ Počisti
+ Zaženi
+ Podrobnosti programa
+ Trgovina Play
+ Ubij
+ Izberi dovoljene račune
+ Izberi dovoljene aplikacije
+ Izberi dovoljene stike
+ Upravljanje bele liste
+ Navodila
+ Changelog
+ Počisti predpomnilnik
+ Preveri za posodobitvami
+ Operations …
+ Legend
+ Preklicujem
+ Preklicano
+ Novo
+ Posodobitev
+ Nalagam
+ Uveljavljam
+ Predloga uveljavljena
+ Shranjeno v %1$s
+ Ni bilo najdenih omejitev
+ Ste prepričani?
+ Prosimo, izberite nekaj programov
+ Prosimo, izberite manj kot %1$d programov
+ Dokončano
+ Zahtevan ponovni zagon
+ Naključni podatki
+ Naključni podatki ob dostopu
+ Naključni podatki ob zagonu
+ Potreben je ponoven zagon aplikacije
+ Prosimo, registrirajte svojo napravo
+ Prosimo, vnesite svoj e-mail naslov:
+ Za aktiviranje Vaše naprave, preverite e-pošto
+ Storitev za posodobitve se zaganja
+ Migriram %1$s
+ Ustvarjam naključne podatke %1$s
+ Nadgrajujem %1$s
+ Napaka pri notranjem preverjanju, želite poslati podatke podpori?
+ Omejeno z XPrivacy
+ Storitev za zasebnost ni bila najdena; ste omogočili XPrivacy v programu Xposed installer in ponovno zagnali Vašo napravo?
+ Različica storitve za zasebnost se ne ujema; ste zagnali ponovno Vašo napravo po nadgradnji programa XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ V razvoj in preizkušanje programa XPrivacy je bilo vloženo veliko truda, vendar pa
+ je nemogoče zagotoviti brezhibno delovanje na vsaki napravi in za vsak program.\n\nUporaba programa je na lastno
+ odgovornost \n\nPreberite si tudi licenco:
+ Računi (Google, Facebook, itd)
+ Brskalnik (zaznamki/zgodovina)
+ Koledar
+ Klicanje (telefon, SMS, MMS)
+ Odložišče
+ Stiki
+ Slovar (uporabnik)
+ E-mail
+ Identifikacija (naprava)
+ Internet
+ Lokacija (približna/natančna)
+ Medij (zvok, slike, video)
+ Sporočila (SMS, MMS)
+ Omrežje (naslovi)
+ Obvestila
+ Prekrivanje
+ Telefon (ID, številke, klici)
+ Senzorji
+ Pomnilnik (medij, SD kartica)
+ Lupina (ukazi, superuser)
+ Sistem (nameščeni programi)
+ Pogled (brskalnik)
+ Bo preprečilo dostop do računov
+ Bo preprečilo dostop do sistemskih informacij, kot so nameščene aplikacije
+ Bo preprečilo dostop do ukazov v lupini, vključno s superuser ukazi
+ Bo preprečilo dostop do shrambe, kot sta spominska kartica in notranji pomnilnik
+ Bo preprečilo dostop do senzorjev, kot je senzor gibanja
+ Bo preprečilo dostop do informacij telefona, kot je telefonska številka
+ Bo preprečilo prekivanje oken, kar bo preprečilo \"ribarjenje\"
+ Bo preprečilo dostop do sistemskih in programskih obvestil, ter storitve Google cloud messaging
+ Bo preprečilo dostop do NFC-ja(near field communication)
+ Bo preprečilo dostop do informacij omrežja, kot so IP in MAC naslovi in informacij Wi-Fi omrežij
+ Bo preprečilo dostop do shranjenih in prejetih sporočil (SMS/MMS) in glasovnih sporočil
+ Bo preprečilo dostop do kamere(slikanje in snemanje) in mikrofona
+ Bo preprečilo dostop do približne(mobilno omrežje) in natančne(GPS) lokacije
+ Bo preprečilo dostop do medprocesorske komunikacije, ki se uporablja pri izogibanju omejitvam
+ Bo preprečilo dostop do interneta
+ Bo preprečilo dostop do informacij, ki vas lahko identificirajo, kot je serijska številka vaše naprave
+ Bo preprečilo dostop do informacij o email-ih, kot so naslovi in sporočila (samo za G-mail in privzeto mail aplikacijo)
+ Bo preprečilo dostop do uporabniških slovarjev
+ Bo preprečilo dostop do informacij o vaših stikih
+ Bo preprečilo dostop do informacij v odložišču
+ Bo preprečilo klicanje telefonskih številk, pošiljanje sporočil(SMS/MMS) in dostop do zgodovine klicanja
+ Bo preprečilo dostop do Vaših informacij v koledarju, kot so Vaši sestanki
+ Bo preprečilo dostop do informacij v brskalniku, kot so zaznamki in zgodovina prenosov
+ Bo preprečilo dostop do informacij o računih, kot so Google računi, ki vsebujejo Vaš G-mail naslov
+ Naslovi
+ Dejanje
+ IP naslovi
+ Nativne knjižice
+ Imena metod
+ Imena datotek
+ Ukazi lupine
+ URLji
+ Transakcije
+ Dovoljenja
+ Označi za omejitev pravic:
+ Izberi za dovoljevanje:
+ Filtriraj po uporabi podatkov
+ Filtriraj po internetnem dostopu
+ Filtriraj po pravicah
+ Filtriraj po omejitvah
+ Filtriraj uporabniške programe
+ Filtriraj po "na-zahtevo"
+ Filtriraj sistemske programe
+ Negiraj
+ Po imenu
+ Po uid
+ Po datumu namestitve
+ Po datumu posodobitve
+ Po datumu spremembe (XPrivacy)
+ Po stanju (XPrivacy)
+ Obrni zaporedje razvrščanja
+ Poskus uporabe:
+ Kategorija:
+ Funkcija:
+ Parametri:
+ Uveljavi za celotno kategorijo
+ Enkrat za
+ Dodaj \'%1$s\' na belo listo
+ Dovoli
+ Zavrni
+ Ne vem
+ Prosimo, pošljite Vaše omejitve za pomoč drugim
+ Pravice
+ Omeji
+ Uveljavi predlogo (kategorije)
+ Uveljavi predlogo (kategorije+funkcije)
+ Uveljeavi predlogo (združevanje)
+ Apply template (merge reset)
+ Omogoči omejevanje na zahtevo
+ Onemogoči omejevanje na zahtevo
+ Čas. omejitev bo:
+ Ponastavi
+ Privzeto
+ Nadomestno
+ Rename
+ Uporaba
+ 1. Na seznamu programov poiščite program, ki mu želite pravice omejiti
+ 2. Dotaknite se njegove ikone
+ 3. Izberite potrditveno polje ob kategoriji, ki jo želite omejiti
+ Ko umejujete pravice, uporabite možgane; ne pričakujte, da bo aplikacija imela internetni dostop, če ji boste omejili internet.
+ Pridržite naslov, da preklopite nevarne funkcije
+ Uveljavljanje kategorij bo ponastavilo izjeme funkcij na privzete vrednosti
+ Dokumentacija o funkciji
+ ni varno, program jo lahko obide
+ Preverjam za posodobitvami
+ Prenašam posodobiev
+ Tapni za namestitev posodobitve
+ Na voljo ni posodobitev
+ XPrivacy 2 ni več podprt, priporočamo Vam, da nadgradite na XPrivacy 3
+ Original
+ Serijska št.
+ Geografska širina
+ Geografska dolžina
+ Nadmorska višina
+ MAC naslov
+ IP naslov
+ Telefonska številka
+ Android ID
+ Oglaševalski ID
+ Država
+ Operater
+ ID naročnika
+ Uporabniški agent
+ Splošno
+ Lažni podatki
+ Obvestila ob posodobitvi
+ Omeji na zahtevo
+ Dodaj račune, programe in kontakte na črno listo
+ Beleženje za razvijalce (zahtevan ponovni zagon)
+ Način za strokovnjake
+ Največji interval prenašanja omejitev
+ Funkcije za strokovnjake (zahtevan ponovni zagon)
+ Uporabi varne povezave
+ Omeji sistemske komponente (Android) (zahtevan ponovni zagon)
+ Prikaži uporabo podatkov aplikacije (zahtevan ponovni zagon)
+ Prikaži parametre za uporabo podatkov
+ Show values of usage data
+ ID GSM telefona
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Za izbiranje pridržite ime
+ omejitve bodo vprašane
+ Program
+ uporablja internetne pravice
+ uporablja Android pravice
+ je uporabljal te podatke
+ ni uporabljen podatkov
+ je onemogočen
+ je nevaren
+ delno omejeno
+ omejitve potrebujejo pozornost
+ omejitve so spremenjene
+ omejitve so poslane
+ has application specific fake values
+ Izberite kategorijo za omejevanje
+ Tapni na potrditveno polje za omejitev izbrane kategorije za aplikacije\n
+\nAplikacije bodo nahranjene s praznimi ali lažnimi podatki za omejene kotegorije\n
+\nTapni ikono aplikacije za podrobnejšo omejevanje in nastavljanje
+ Tapni ikono aplikacije za več možnosti
+ Tapni puščico navzdol za pregled izjem funkcij v omejeni kategoriji
+ Upravljaj programe, vključno z ubijanjem(programov)
+ Uporavljaj XPrivacy omejitve in nastavitve
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-sr/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-sr/strings.xml
new file mode 100644
index 0000000..b9f55f9
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-sr/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy није омогућен у Xposed инсталатору
+ Only for Android version 4.0.3+
+ XPrivacy is incompatible with %s
+ XPrivacy верзија: %s (%d)
+ The ultimate privacy manager
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Usage
+ Refresh
+ Подешавања
+ Шаблон
+ Пријави проблем
+ Експорт
+ Импорт
+ Submit restrictions
+ Fetch restrictions
+ Пребаци тему
+ Про верзија
+ О
+ Help …
+ Select all
+ Sort
+ Filter
+ Све
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all data
+ Toggle filter
+ Apply template
+ Clear
+ Покрени
+ Подешавања
+ Продавница Плеј
+ Kill
+ Изабери дозвољене рачуне
+ Select applications to allow
+ Изабери дозвољене контакте
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ Учитавање
+ Applying
+ Template applied
+ Saved to %s
+ No restrictions found
+ Да ли сте сигурни?
+ Please select some applications
+ Please select fewer than %d applications
+ Готово
+ Потребан ребут
+ Randomize
+ Randomize on access
+ Randomize after boot
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Great care has been taken to develop and test XPrivacy,
+however it is impossible to guarantee it will work flawless on each and every device and for each and every application.
+\n\nUse is entirely at your own risk. \n\nSee also the license:
+ Налози (Гугл, Фејсбук, итд)
+ Браузер (букмаркови/историја)
+ Календар
+ Позиви (телефон, СМС, ММС)
+ Clipboard
+ Контакти
+ Речник (кориснички)
+ E-mail
+ Идентификација (уређај)
+ Интернет
+ Локација (фина/груба)
+ Медија (аудио, фото, видео)
+ Поруке (СМС, ММС)
+ Мрежа (адресе)
+ Notifications
+ Overlay
+ Телефон (ИД, бројеви, позиви)
+ Sensors
+ Уложни простор (медија, СД карта)
+ Шел (команде, суперкорисник)
+ Систем (инсталиране апликације)
+ Поглед (браузер)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Означи да забраниш:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serial#
+ Ширина
+ Дужина
+ Altitude
+ МЕК адреса
+ IP address
+ Број телефона
+ ИД Андроида
+ Advertisement ID
+ Земља
+ Operator
+ Претплатнички ИД
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Апликација
+ има дозволу за Интернет
+ има дозволу за Андроид
+ је користио ове податке
+ no usage data available
+ is disabled
+ је опасан
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap a check box to restrict the selected category for an app\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-sv/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-sv/strings.xml
new file mode 100644
index 0000000..1cbceff
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-sv/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy är inte aktiverad i Xposed Installer
+ Endast för Android 4.0.3+
+ XPrivacy är inkompatibel med %s
+ XPrivacy version: %s (%d)
+ Den ultimata integritetshanteraren
+ Copyright \u00A9 2013–2015 M. Bokhorst (M66B)
+ Körs i kompatibilitetsläge
+ Licensierad, tack för ditt stöd!
+ Användning
+ Uppdatera
+ Inställningar
+ Mall
+ Rapportera problem
+ Exportera
+ Importera
+ Skicka begränsningar
+ Hämta begränsningar
+ Växla tema
+ Pro-version
+ Om
+ Hjälp
+ Välj alla
+ Sortera efter
+ Filter
+ Alla
+ Växla begränsningar
+ Rensa alla
+ Rensa
+ Rensa all data
+ Växla alla/begränsade
+ Applicera mall
+ Rensa
+ Starta
+ Inställningar
+ Play Butik
+ Framtvinga avslutning
+ Välj tillåtna konton
+ Välj applikationer att tillåta
+ Välj kontakter att tillåta
+ Hantera vitlistor
+ Handledning
+ Ändringslogg
+ Töm cache
+ Kolla efter uppdateringar
+ Operationer …
+ Teckenförklaring
+ Avbryter
+ Avbrutet
+ Ny
+ Uppdatera
+ Laddar
+ Tillämpar
+ Mall tillämpad
+ Spara till %s
+ Inga begränsningar funna
+ Är du säker?
+ Välj några applikationer
+ Välj mindre än %d applikationer
+ Klar
+ Omstart krävs
+ Slumpa
+ Slumpa vid åtkomst
+ Slumpa efter uppstart
+ Omstart av applikationen krävs
+ Registrera din enhet
+ Fyll i din e-postadress:
+ Kontrollera din e-post för att aktivera enheten
+ Uppdateringstjänst körs
+ Migrerar %s
+ Slumpar %s
+ Uppgraderar %s
+ En intern kontroll misslyckades, vill du skicka supportinformationen?
+ Begränsad av XPrivacy
+ Integritetstjänsten hittades inte; aktiverade du XPrivacy i Xposed installer och startade om enheten?
+ Integritetstjänstens version stämmer inte; startade du om din enhet efter uppgraderingen av XPrivacy?
+ Var god vänta tills uppdateringstjänsten är klar
+ Avancerade användare är tänkta att lösa sina egna problem när det är möjligt och att följa XDA XPrivacy forumet och hjälpa andra där så är möjligt
+ Funktionsbegränsningar är avsedda för avancerade användare. Är du en avancerad användare?
+ Håll nere på funktionens namn för att vit- eller svartlista parametern
+ Kryssrutor och värden har företräde framför globala kryssrutor och värden; tomma kryssrutor och värden har inte företräde
+ Integritetsdatabasen återställdes, eftersom den var korrupt
+ XPrivacy utvecklas och testas med stor omsorg.
+Det är emellertid omöjligt att garantera att appen fungerar på alla enheter och appar.
+\n\nAnvänding sker helt på egen risk. \n\nSe också licensen:
+ Konton (Google, Facebook, m.fl.)
+ Webbläsare (bokmärken/historik)
+ Kalender
+ Ringa (telefon, SMS, MMS)
+ Urklipp
+ Kontakter
+ Ordlista (användare)
+ E-post
+ Identifikation (enhet)
+ Internet
+ Position (exakt/ungefärlig)
+ Media (ljud, foto, video)
+ Meddelanden (SMS, MMS)
+ Nätverk (adresser)
+ Notifikationer
+ Overlay
+ Telefon (ID, nummer, samtal)
+ Sensorer
+ Lagring (media, SD-kort)
+ Shell (kommandon, superuser)
+ System (installerade appar)
+ View (webbläsare)
+ Begränsar åtkomst till view åtgärder och information
+ Begränsar åtkomst till systeminformation, såsom installerade applikationer
+ Begränsar åtkomst till shell kommandon, inklusive superuser kommandon
+ Begränsar åtkomst till lagring, såsom filer på ditt SD kort eller den interna lagrningen
+ Begränsar åtkomst till sensorerna, såsom rörelsesensorn
+ Begränsar åtkomst till telefoninformation, såsom ditt telefonnummer
+ Begränsar ovanpåliggande fönster för att förhindra nätfiske (phishing)
+ Begränsar åtkomst till system- och applikationsnotifikationer samt Googles moln meddelandehantering
+ Begränsar åtkomst till närfältskommunikation (NFC)
+ Begränsar åtkomst till nätverksinformation, såsom IP och MAC adresser samt Wi-Fi nätverksinformation
+ Begränsar åtkomst till lagrade och mottagna meddelanden (SMS/MMS) samt röstbrevlådan
+ Begränsar åtkomst till kamerorna (foton och videor) samt mikrofonerna
+ Begränsar åtkomst till din platsinformation (grov- och finkalibrering)
+ Begränsar interprocesskommunikation (IPC), när de används för att kringgå andra begränsningar
+ Begränsar tillgången till Internet
+ Begränsar information som kan identifiera dig, såsom din enhets serienummer
+ Begränsar åtkomst till e-postinformation, såsom adresser och meddelanden (gäller endast standard- och G-mailapplikationen)
+ Begränsar åtkomst till användarordlistan
+ Begränsar åtkomst till information om dina kontakter
+ Begränsar åtkomst till urklipp
+ Begränsar åtkomst till att ringa telefonnummer, skicka meddelanden (SMS/MMS) och åtkomst till din samtalshistorik
+ Begränsar åtkomst till din kalender, såsom dina möten
+ Begränsar åtkomst till webbläsarinformation, såsom dina bokmärken och nerladdningshistorik
+ Begränsar åtkomst till kontoinformation, såsom ditt Google konto, vilket inkluderar din G-mailadress
+ Adresser
+ Åtgärd
+ IP adresser
+ Native bibliotek
+ Metodnamn
+ Filnamn
+ Shell kommandon
+ URLs
+ Överföringar
+ Behörigheter
+ Markera för att blockera:
+ Markera för att tillåta:
+ Filtrera efter använd data
+ Filtrera efter internetbehörighet
+ Filtrera efter behörighet
+ Filtrera efter begränsad
+ Filtrera efter vanliga appar
+ Filtrera efter på-begäran (on-demand)
+ Filtrera efter systemappar
+ Negera
+ Namn
+ UID
+ Installationsdatum
+ Senaste uppdatering
+ Senast modifierad (XPrivacy)
+ Tillstånd (XPrivacy)
+ Invertera sorteringsordning
+ Användsningsförsök av:
+ Kategori:
+ Funktion:
+ Parametrar:
+ Tillämpa för hela kategorin
+ En gång för
+ Vit/svartlista \'%s\'
+ Tillåt
+ Neka
+ Vet inte
+ Skicka in dina begränsningar för att hjälpa andra
+ Behörigheter
+ Begränsa
+ Tillämpa mall (kategorier)
+ Tillämpa mall (kategorier+funktioner)
+ Tillämpa mall (sammanfoga set)
+ Tillämpa mall (återställ sammanfogning)
+ Aktivera på-begäran (on-demand) begränsning
+ Inaktivera på-begäran (on-demand) begränsning
+ Timeout kommer:
+ Återställ
+ Standard
+ Alternera
+ Döp om
+ Användning
+ 1. Hitta applikationen att begränsa i huvudprogramlistan
+ 2. Tryck på applikationsikonen
+ 3. Tryck på den första kryssrutan på vilken kategori som helst som du vill begränsa
+ Använd sunt förnuft när du begränsar, förvänta dig inte internetåtkomst om du begränsat internet kategorin, etc.
+ Håll nere på en titel för att växla farliga funktioner
+ Tillämpning på katalogen återställer funktionsundantagen till standardvärdena
+ Funktionsdokumentation
+ är osäker, kan kringgås
+ Letar efter uppdatering
+ Laddar ner uppdatering
+ Tryck för att installera uppdatering
+ Inga uppdateringar tillgängliga
+ XPrivacy 2 stöds inte längre, överväg att uppgradera till XPrivacy 3
+ Original
+ Serienummer#
+ Latitud
+ Longitud
+ Altitud
+ MAC-adress
+ IP-adress
+ Telefonnummer
+ Android-ID
+ Advertisement ID
+ Land
+ Operatör
+ Abonnent-ID
+ Användaragent
+ Allmän
+ Falsk data
+ Uppdateringsnotifikationer
+ Begränsa på begäran
+ Svartlista konton, applikationer och kontakter
+ Felsökningslogg (kräver omstart)
+ Expertläge
+ Maximal hämtningskonfidensintervall
+ Experimentella funktioner (kräver omstart)
+ Använd säkra anslutningar
+ Begränsa systemkomponenter (Android) (kräver omstart)
+ Visa applikationernas dataförbrukning (kräver omstart)
+ Visa parametrar för användardata
+ Visa värden för användardata
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP läge (kräver omstart)
+ Första kryssrutan: begränsa kategorin eller funktionen
+ Andra kryssrutan: begränsa på begäran (on demand)
+ På/av knapp: aktivera eller inaktivera alla begränsningar
+ Håll nere på namnet för att markera
+ begränsningar kommer att tillfrågas
+ Applikation
+ har internetbehörighet
+ har Android-behörighet
+ har använt denna data
+ ingen användardata tillgänglig
+ är inaktiverad
+ är farlig
+ delvis begränsad
+ begränsningar behöver uppmärksamhet
+ begränsningar är ändrade
+ begränsningar är inlämnade
+ har applikationsspecifika falska värden
+ Välj kategorin att begränsa
+ Tryck på en kryssruta för att begränsa vald kategori för en app\n
+\nAppar kommer förses med tom eller falsk data för de begränsade kategorierna\n
+\nTryck på appikonen för detaljerade begränsningar och inställningar
+ Tryck på appikonen för fler alternativ
+ Tryck på nedåtpilen för att se funktionsundantagen för en begränsad kategori
+ Hantera applikationer, inklusive framtvingad avslutning
+ Hantera XPrivacy begränsningar och inställningar
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-sw600dp/dimens.xml b/src/XPrivacy-master/XPrivacy-master/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000..1ba777d
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-sw600dp/dimens.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-sw720dp-land/dimens.xml b/src/XPrivacy-master/XPrivacy-master/res/values-sw720dp-land/dimens.xml
new file mode 100644
index 0000000..f3fc5f2
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-sw720dp-land/dimens.xml
@@ -0,0 +1,10 @@
+
+
+
+ 128dp
+ 112dp
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-tl-rPH/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-tl-rPH/strings.xml
new file mode 100644
index 0000000..c2b6a9b
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-tl-rPH/strings.xml
@@ -0,0 +1,256 @@
+
+
+ Ang XPrivacy ay hindi gumagana sa Xposed na installer
+ Para lang sa Android na salin 4.0.3+
+ XPrivacy is incompatible with %s
+ XPrivacy na salin: %s (%d)
+ The ultimate privacy manager
+ Ang karapatan \u00A9 2013–2015 nito ay pag-aari ni M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ Kaalaman tungkol sa mga pahintulot na nagamit
+ Paulitin ang nakatakdang kaalaman
+ Palitan ang paglalagay
+ Nakahandang paghihigpit
+ Ipaalam kung mayroon mang suliranin
+ Iluwas ang iyong nakatakdang paghihigpit
+ Iangkat ang dating paghihigpit
+ Ipasa ang iyong paghihigpit
+ Kumuha nang nakatakdang paghihigpit
+ Palitan ang tema
+ Salin na Pro
+ Tungkulin
+ Anong Kahulugan
+ Piliin lahat
+ Sort
+ Filter
+ Kalahatan
+ Bigyan ng lahat o walang paghihigpit
+ Burahin lahat ng paghihigpit
+ Burahin lahat nang nakatakdang kaalaman at ukol sa mga pahintulot na nagamit
+ Clear all data
+ Ipakita sa lahat ng may pahintulot o sa mga may pahigpit lamang
+ Itakda ang nakahandang paghihigpit
+ Burahin lahat
+ Buksan at paumpisahan
+ Palitan ang paglalagay
+ Pumunta sa Play Store
+ Puksain
+ Piliin ang mga Accounts na may pahintulot
+ Piliin ang mga Applications na may pahintulot
+ Piliin ang mga Contacts na may pahintulot
+ Manage whitelists
+ Sangguni
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ Bago
+ Pabaguhin
+ Naglo-load
+ Tinatakda
+ Nakahandang paghihigpit ay ngayon na nakatakda
+ Nailagay sa %s
+ Walang nakatakdang paghihigpit na natagpuan
+ Tiyak ka na ba?
+ Mamili po muna sa iyong mga applications na ibibilang
+ Mamili lang po ng mas kaunti sa %d na applications
+ Tapos na
+ Kailangan paumpisahin muli ang iyong kagamitan
+ Palit-palitan ang mga paghihigpit sa ngayon na
+ Palit-palitan ang mga paghihigpit sa kusang paggamit
+ Palit-palitan ang mga paghihigpit sa unang paggamit
+ Kailangan paumpisahin muli ang Application
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %s
+ Randomizing %s
+ Upgrading %s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Malaking pag-aalaga ang ginampanan sa pagkabuo at sa pagsusuri ng XPrivacy,
+ ngunit sadyang walang garantisado na gagana siya na walang kamali-mali sa lahat ng mga kagamitan o bawat sa isa\'t isang aplikasyon.
+\n\nAng paggamit nito ay ganap na nasa sa iyong pagbabakasakali. \n\nAlamin din ang kanyang lisensiya at sangguni dito sa:
+ Mga Accounts (Google, Facebook, at iba pa)
+ Sa Browser (mga bookmarks/history)
+ Sa Kalendaryo
+ Sa Pagtawag (sa telepono, SMS, MMS)
+ Sa Clipboard
+ Mga Contacts
+ Sa Diksyonaryo (ng gumagamit)
+ Sa E-mail
+ Pagkakakilanlan (ng iyong kagamitan)
+ Sa Internet
+ Sa iyong Lugar (fine/coarse)
+ Sa Media (pagtinig, larawan, bidyo)
+ Sa iyong mga Mensahe (SMS, MMS)
+ Sa Network (mga address)
+ Mga Abiso
+ Sa Overlay
+ Telepono (ID, sa mga numero, sa mga tawag)
+ Mga Sensors
+ Sa Storage (medya, SD card)
+ Sa Shell (commands, superuser)
+ Sa System (ukol sa nailagay mong Apps)
+ Pahintulot sa Pagpapakita (ng Browser)
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ Lagyan ng Check para pahigpitan:
+ Check to allow:
+ Bigyan ng Filter at ipakita lamang sa mga Kaalaman na Nagamit
+ Bigyan ng Filter at ipakita lamang sa Pagdaan ng Internet
+ Bigyan ng Filter at ipakita lamang sa mga may Pahintulot
+ Bigyan ng Filter at ipakita lamang sa mga may Paghihigpit
+ Bigyan ng Filter at ipakita lamang sa iyong mga User Applications
+ Filter by on-demand
+ Bigyan ng Filter at ipakita lamang sa iyong mga System Applications
+ Pagbaliktarin
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist \'%s\'
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Ang iyong Seryal#
+ Latitud
+ Longhitud
+ Altitude
+ MAC address
+ IP address
+ Numero ng iyong telepono
+ Android ID
+ Advertisement ID
+ Bansa
+ Tagapamahala ng iyong telepono
+ Subscriber ID
+ Pagkakakilanlan ng iyong Browser
+ Pangkalahatan
+ Pekeng kaalaman
+ Baguhin ang mga abiso
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Ipakita kaalaman ukol sa Debug (kailangan muling paumpisahin ang iyong kagamitan)
+ Gamitin XPrivacy sa sanay na paraan
+ Pinakamataas na Confidence Interval na puwedeng kunin
+ Gamitin mga hindi pa tiyak na tungkulin (kailangan muling paumpisahin ang iyong kagamitan)
+ Use secure connections
+ Restrict system components (Android) (requires reboot)
+ Show application usage data (requires reboot)
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand
+ On/off switch: enable or disable all restrictions
+ Long press name to select
+ restrictions will be asked
+ Mga Applications
+ may Internet na pahintulot
+ may Android na pahintulot
+ nagamit niya nitong kaalaman
+ walang kaalaman tungkol sa mga pahintulot na nagamit ang mayroon
+ ay winalang gana
+ may panganib, magkakaroon ng problema kapag iyong hinigpitan
+ mayroon paghihigpit
+ mga paghihigpit ay kailangan tingnan
+ mga paghihigpit ay naiba
+ mga paghihigpit ay naipasa
+ has application specific fake values
+ Select the category to restrict
+ Sa tuwing app, lagyan ng Check sa kanang gilid para pahigpitan ang napiling pangkat
+\n\nSa gayon ay ang mga Apps mabibigyan ng wala o pekeng impormasyon ayon sa mga nahigpitan na pangkat
+\n\nPindutin ang App icon sa kaliwang gilid para matignan mabuti tungkol sa kanyang paghihigpit at paglalagay
+ Pindutin ang App icon sa kaliwang gilid para sa iba pang puwedeng mapalitan na paglalagay
+ Pindutin ang down arrow sa kaliwang gilid para makita ang laman ng pangkat na mayroon o walang paghihigpit
+ Pangasiwaan para sa iyong mga applications, pati ang kanyang pagkapuksa
+ Manage XPrivacy restrictions and settings
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-tr/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-tr/strings.xml
new file mode 100644
index 0000000..fd3bc31
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-tr/strings.xml
@@ -0,0 +1,255 @@
+
+
+ XPrivacy, Xposed yükleyicisinden etkinleştirilmedi.
+ Sadece Android 4.0 ve üstünde kullanılabilir.
+ XPrivacy is incompatible with %s
+ XPrivacy versiyon: %s (%d)
+ The ultimate privacy manager
+ Telif hakkı \u00A9 2013–2015, M. Bokhorst (M66B)
+ Uyumluluk modunda çalışıyor
+ Lisanslı, Destek için Teşekkürler!
+ Kullanım
+ Yenile
+ Ayarlar
+ Şablon
+ Problem Bildir
+ Ayarları dışa aktar
+ Ayarları içe aktar
+ Engellemeleri bildir
+ Engellemeleri indir
+ Temayı değiştir
+ Pro versiyon
+ Hakkında
+ Yardım
+ Hepsini seç
+ Sırala
+ Filtrele
+ Tümü
+ Geçiş kısıtlamaları
+ Hepsini temizle
+ Temizle
+ Tüm veriyi temizle
+ Geçiş filtresi
+ Şablonu uygula
+ Temizle
+ Çalıştır
+ Ayarlar
+ Play Store
+ Sonlandır
+ İzin verilecek hesapları seç
+ İzin vermek için uygulamaları seç
+ İzin verilecek kişileri seç
+ Beyaz listeyi yönet
+ Öğretici
+ Değişiklik listesi
+ Önbelleği göm
+ Güncellemeleri kontrol et
+ İşlemler…
+ Legend
+ İptal ediliyor
+ İptal edildi
+ Yeni
+ Güncelle
+ Yükleniyor
+ Uygulanıyor
+ Şablon uygulandı
+ Kaydedildi %s
+ Kısıtlama bulunamadı
+ Emin misin?
+ Birkaç uygulama seç
+ Lütfen %d den daha az uygulama seçin
+ Bitti
+ Yeniden başlatma gerekli
+ Rastgele Oluştur
+ Rastgele erişim
+ Cihaz yeniden başlatılınca; tekrar rastgele oluştur
+ Uygulamayı yeniden başlatmak gerekli
+ Lütfen cihazınızı kaydedin
+ Lütfen e-posta adresinizi girin:
+ Cihazınızı aktifleştirmek için e-postanızı kontrol edin
+ Güncelleme servisi çalışıyor
+ Göçüyor () %s
+ Rastgele seçiyor %s
+ Yükseltiliyor %s
+ Bir iç denetimi başarısız, destek için bilgi göndermek ister misiniz?
+ XPrivacy tarafından sınırlandı
+ Privacy servisi bulunmadı; Xposed Installer\'da XPrivacy\'i etkinleştirmek için cihazınızı yeniden başlatınız mı?
+ Privacy hizmeti sürüm uyuşmazlığı; Eğer XPrivacy yükselttikten sonra cihazınızı yeniden başlatınız mı?
+ Güncelleme hizmeti tamamlanana kadar bekleyin
+ Uzman kullanıcılar mümkünse kendi sorunlarını çözmek için ve XDA XPrivacy forumu takip etmeli ve mümkün olduğunca başkalarına yardım edebilmeli
+ Fonksiyon kısıtlamaları uzman kullanıcılar içindir. Uzman bir kullanıcı mısınız?
+ Beyaz ya da kara liste parametresi için uzun basın
+ Onay işaretleri ve değerleri önceliklidir; Boş onay kutularını ve değerleri önceliklidir yapmayınız.
+ Privacy veritabanı bozuk olduğu için sıfırlandı
+ Xprivacy titizlikle geliştirilmiş ve test edilmiştir, ancak her cihazda veya her uygulamada kusursuz çalışacağını garantilemek imkansızdır.
+\n\nKullanım riski tamamen size aittir. \n\nAyrıca lisansa bakınız:
+ Hesaplar (Google, Facebook, vb)
+ Tarayıcı (yer imleri/geçmiş)
+ Takvim
+ Arama (telefon, SMS, MMS)
+ Pano
+ Kişiler
+ Sözlük (kullanıcı)
+ E-mail
+ Kimlik (cihaz)
+ İnternet
+ Konum (hassas/yaklaşık)
+ Medya (ses, fotoğraf, video)
+ Mesajlar (SMS, MMS)
+ Ağ (adresler)
+ Bildirimler
+ Üstüne çiz
+ Telefon (Kimlik, numaralar, aramalar)
+ Sensörler
+ Depolama (medya, SD kart)
+ Kabuk (komutlar, superuser)
+ Sistem (yüklü uygulamalar)
+ Göster (tarayıcı)
+ Eylem ve bilgileri görüntülemek için erişim kısıtlanacak
+ Yüklü uygulamalar gibi sistem bilgilerine erişimi, sınırlar
+ Superuser komutları dahil kabuk komutları erişimi, sınırlar
+ SD kart veya dahili depolama dosyaları gibi depolama erişimi, sınırlar
+ Hareket sensörü gibi sensörlere erişimi, sınırlar
+ Telefon numarası gibi, telefon bilgilerine erişimi sınırlar
+ Kimlik avını önlemek için üste çizilen pencereleri sınırlar
+ Sistem, uygulama bildirimleri ve Google bulut mesajlaşma erişimi kısıtlanacak
+ Yakın alan iletişimi erişimi kısıtlanacak
+ IP ve Mac adresleri ve wi-Fi ağ bilgi gibi, ağ bilgilerine erişim kısıtlanacak
+ Saklanır, alınan mesajlar (SMS / MMS) ve sesli mesajlara erişim kısıtlanacak
+ Kamera(fotoğraf ve video) ve mikrofona erişim kısıtlanacak
+ Kaba ve hassas konuma erişim kısıtlanacak
+ Diğer kısıtlamaları aşmak için kullanıldığında, süreçler arası iletişim kısıtlanacak(Ben de anlamadım)
+ İnternet erişimi kısıtlanacak
+ Cihazınızın seri numarası gibi sizi belirleyebilir bilgileri, sınırlar
+ Adresler ve mesajlar gibi(G-mail uygulamasında), e-postaya erişimi kısıtlanacak
+ Kişisel Sözlüğe erişim kısıtlanacak
+ Kişilerin hakkında bilgilere erişim kısıtlanacak
+ Panoya erişim kısıtlanacak
+ Gönderilen mesajlar, mesaj deposu(MMS-SMS), arama geçmişi gibi bilgilere erişim kısıtlanacak
+ Takvim etkinlikleri ve oluşturulan olaylara erişim kısıtlanacak
+ İndirme geçmişi ve internet yerimlerine erişim kısıtlanacak
+ Google hesaplarına erişim kısıtlanacak
+ Adresler
+ Eylem
+ IP adresleri
+ Yerel Kütüphaneler
+ Yöntem isimleri
+ Dosya adı
+ Kabuk komutları
+ URL
+ İşlemler
+ İzinler
+ Engellemek için işaretle:
+ İzni kontrol et:
+ Veri kullanımını filtrele
+ İnternet erişimini filtrele
+ İzinleri filtrele
+ Kısıtlamaları filtrele
+ Kullanıcı uygulamalarını filtrele
+ İsteğe göre filtrele
+ Sistem uygulamalarını filtrele
+ Reddet
+ İsme göre
+ Uid\'e göre
+ Kurulum tarihine göre
+ Güncelleme tarihine göre
+ Düzenleme tarihine göre (XPrivacy)
+ Duruma göre (XPrivacy)
+ Haricindeki sıralama düzeni
+ Kullanıma göre:
+ Kategori:
+ İşlev:
+ Katsayı:
+ Tüm kategoriye uygula
+ Bir kez için
+ Beyaz/Karaliste \'%s\'
+ İzin ver
+ Reddet
+ Bilmiyorum
+ Başkalarına yardım etmek için kısıtlamaları gönderin
+ İzinler
+ Kısıtlama
+ Şablonları uygula (kategoriler)
+ Şablonları uygula (kategoriler + işlevler)
+ Şablonları uygula (Birleştirmeyi düzenle)
+ Şablonları uygula (Birleştirmeyi sıfırla)
+ İsteğe göre kısıtlamayı etkinleştir
+ İsteğe göre kısıtlamayı pasifleştir
+ Zaman aşımı:
+ Reset
+ Varsayılan
+ Alternatif
+ Yeniden adlandır
+ Kullanım
+ 1. Ana uygulama listesinde kısıtlamak için uygulamayı bulun
+ 2. Uygulama simgesine dokunun
+ 3. Kısıtlamak istediğiniz herhangi bir kategorinin ilk onay kutusuna dokunun
+ İnternet kısıtlaması için internet erişimi beklemeyin
+ Bir başlık üzerinde tehlikeli işlevler arasında geçiş yapmak için uzun basın
+ Kategoriye uygulanan varsayılan değerler sıfırlanır
+ İşlev Belgeleri
+ güvensizdir, atlatılabilir
+ Güncelleme kontrol ediliyor
+ Güncelleme indiriliyor
+ Güncelleştirmeyi yüklemek için dokunun
+ Mevcut güncelleştirme yok
+ XPrivacy 2 daha fazla desteklemiyor, lütfen XPrivacy 3\'e yükseltin
+ Orijinal
+ Seri no
+ Enlem
+ Boylam
+ İrtifa
+ MAC adresi
+ IP adresi
+ Telefon numarası
+ Android ID
+ Reklam ID
+ Ülke
+ Operatör
+ Sim Numarası (IMSI)
+ Kullanıcı aracı
+ Genel
+ Sahte veri
+ Güncelleme bildirimleri
+ İsteğe göre kısıtla
+ Karaliste hesapları, uygulamalar ve kişiler
+ Hata ayıklama modu (Yeniden başlatma gerekir)
+ Uzman Mod
+ Maks. güven aralığı getirme
+ Deneyimsel işlevler (yeniden başlatma gerektirir)
+ Güvenli bağlantı kullan
+ Sistem bileşenlerini kısıtla (Yeniden başlatma gerektirir) (Android)
+ Uygulama kullanım verilerini göster (yeniden başlatma gerektirir)
+ Kullanım verilerinin katsayılarını göster
+ Kullanım verilerinin değerlerini göster
+ GSM Cep Kimliği
+ GSM LAC
+ Tuhaflıklar
+ AOSP modu (yeniden başlatma gerektirir)
+ İlk onay kutusu: kategoriyi veya işlevleri kısıtlamak
+ İkinci onay kutusu: isteğe göre kısıtlamak
+ Açma / kapama düğmesi: tüm kısıtlamaları etkinleştir veya devre dışı bırak
+ Seçmek için isme uzun bas
+ kısıtlamalar istenecektir
+ Uygulama
+ İnternet izni var
+ Android izni var
+ Bu izni kullandı
+ Henüz kullanım verileri yok
+ Uygulama devredışı
+ Tehlikeli izin
+ Kısmen kısıtlanmış
+ Dikkat edilmesi gereken kısıtlamalar
+ Kısıtlamalar değiştirildi
+ Kısıtlamalar onaylandı
+ uygulamaya özel sahte değerleri vardır
+ Kısıtlamak için kategori seç
+ Bir uygulama için seçilen kategoriyi kısıtlamak için bir onay kutusuna dokunun\n
+\nUygulamalar kısıtlı kategoriler için boş veya sahte veriler beslenecek\n
+\nAyrıntılı kısıtlamalar ve ayarlar için uygulama simgesine dokunun
+ Daha fazla eylem için uygulama ikonuna bas
+ Bir kısıtlama kategorisinin fonksiyon istisnalarını görmek için aşağıdaki oka dokunun
+ Sonlandırılması da dahil uygulamaları yönet
+ XPrivacy kısıtlamaları ve ayarlarını yönetme
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-uk/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-uk/strings.xml
new file mode 100644
index 0000000..0b57b0f
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-uk/strings.xml
@@ -0,0 +1,266 @@
+
+
+ Модуль XPrivacy не активовано в Xposed installer
+ Тільки для Android версії 4.0.3 і новіше
+ XPrivacy не сумісне із %1$s
+ Будь ласка, оновіть Pro enabler
+ Версія XPrivacy: %1$s (%2$d)
+ Просунутий менеджер конфіденційності
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Запущено в режимі сумісності
+ Зареєстровано, дякуємо за вашу підтримку!
+ Використання
+ Оновити
+ Параметри
+ Шаблон
+ Повідомити про помилку
+ Експорт налаштувань
+ Імпорт налаштувань
+ Відправити обмеження
+ Отримати обмеження
+ Переключити тему
+ Pro-версія
+ Про програму
+ Допомога …
+ Обрати все
+ Впорядкування
+ Фільтр
+ Виділити все
+ Переключити дозволи
+ Очистити всі
+ Очистити
+ Очистити всі дані
+ Переключити фільтр
+ Застосувати шаблон
+ Очистити
+ Запустити програму
+ Налаштування програми
+ Play Маркет
+ Завершити
+ Оберіть дозволені облікові записи
+ Оберіть дозволені програми
+ Оберіть дозволені контакти
+ Керування білим списком
+ Навчання
+ Перелік змін
+ Очистити кеш
+ Перевірка оновлень
+ Операції …
+ Легенда
+ Переривання
+ Перервано
+ Нове
+ Оновити
+ Завантаження
+ Застосовується
+ Шаблон застосовано
+ Збережено в %1$s
+ Не знайдено обмежень
+ Ви впевнені?
+ Будь ласка, оберіть додатки
+ Будь ласка, оберіть менше, а ніж %1$d додатків
+ Готово
+ Необхідне перезавантаження пристрою
+ Випадкові значення
+ Випадкові значення при запиті
+ Випадкові значення після перезавантаження
+ Необхідне перезавантаження
+ Будь ласка, зареєструйте свій пристрій
+ Будь ласка, введіть вашу E-mail адресу:
+ Перевірте пошту, аби перевірити пристрій
+ Сервіс оновлень запущено
+ Міграція %1$s
+ Генерація випадкових чисел %1$s
+ Оновлення %1$s
+ Внутрішня перевірка зазнала невдачі, бажаєте відправити звіт до служби підтримки?
+ Заборонено XPrivacy
+ Службу Privacy не виявлено; Ви активували XPrivacy у Xposed та перезавантажили пристрій?
+ Версія служби Privacy відрізняється; Ви перезавантажили пристрій після оновлення XPrivacy?
+ Будь ласка, дочекайтеся завершення встановлення
+ Зазвичай, експерти вирішують проблеми самостійно, слідкують за темою XPrivacy на XDA та за можливістю допомагають іншим
+ Дані обмеження назначені для експертів. Ви впевнені?
+ Натисніть та тримайте на імені функції, аби додати параметр до білого чи чорного списку
+ Чекбокси та введені значення мають більший пріоритет перед глобальними налаштуваннями, пусті поля не мають пріоритету
+ Базу даних дозволів скинуто, через їх пошкодження
+ Велика увага була приділена розробці та тестуванню XPrivacy,
+але не можна гарантувати, що вона буде працювати бездоганно на всіх пристроях та зі всіма програмами.
+\n\nВикористовуйте виключно на свій страх та ризик. \n\nДивіться також ліцензію:
+ Облікові записи (Google, Facebook і т.д.)
+ Браузер (закладки/історія)
+ Календар
+ Ініціація дзвінків, відправлення SMS/MMS
+ Буфер обміну
+ Контакти
+ Словник користувача
+ Електронна пошта
+ Ідентифікація пристрою
+ Інтернет
+ IPC
+ Місце-знаходження (точне/наближене)
+ Медіа (аудіо, фото, відео)
+ Повідомлення (SMS, MMS)
+ Мережа (адреси)
+ NFC
+ Сповіщення
+ Оверлей
+ Телефон (ID, номери, журнал викликів)
+ Сенсори
+ "Сховище даних (медіа, карта пам'яті)"
+ Команди shell (вкл. суперкористувача)
+ Система (встановлені програми)
+ Перегляд (браузер)
+ Буде обмежено доступ до перегляду та інформації (оглядач)
+ Буде обмежено доступ до такої інформації, як встановлені додатки
+ Буде обмежено доступ до команд терміналу, та команд суперкористувача включно
+ Буде обмежено доступ до сховища, файлам в телефоні та карті пам\'яті
+ Буде обмежено доступ до датчиків, наприклад до датчика руху
+ Буде обмежено доступ до такої інформації про телефон, як ваш номер
+ Буде обмежено доступ до можливості розміщуватися поверх всіх вікон інших додатків (оверлей)
+ Буде обмежено доступ до сповіщень та Google cloud messaging
+ Буде обмежено доступ до NFC
+ Буде обмежено доступ до такої інформації о мережі, як IP та MAC адреса, а також інфрмація о Wi-Fi мережі
+ Буде обмежено доступ до збережених та отриманих повідомлень SMS/MMC та голосової пошти
+ Буде обмежено доступ до камери (фото та відео) та мікрофону
+ Буде обмежено доступ до вашого приблизного та точного місця перебування
+ Буде обмежена взаємодія між процесами, при використанні обходу дозволів
+ Буде обмежено доступ до інтернету
+ Буде обмежено доступ до інформації, за якою вас можна ідентифікувати, наприклад серійний номер пристрою
+ Буде обмежено доступ до такої інформації, як адреси та повідомлення (лише для стандартного додатку та Gmail)
+ Буде обмежено доступ до користувацьких словників
+ Буде обмежено доступ до інформації про ваші контакти
+ Буде обмежено доступ до буферу обміну
+ Буде обмежено можливість набору номеру, надсиланню повідомлень (SMS/MMS) та доступ до журналу викликів
+ Буде обмежено доступ до вашого календаря, наприклад зустрічі
+ Буде обмежено доступ до такої інформації з оглядача, як закладки та історія завантажень
+ Буде обмежено доступ до інформації про облікові записи, наприклад до блікового запису Google
+ Адреса
+ Дія
+ IP адреси
+ Системні бібліотеки
+ Імена методів
+ Імена файлів
+ Команди shell
+ URLs
+ Платежі
+ Дозволи
+ /proc
+ Позначте для заборони:
+ Позначте для дозволу:
+ що використовують дані
+ з доступом до Інтернету
+ з дозволами
+ заборонені
+ програми користувача
+ за запитом обмежень
+ системні програми
+ переключити
+ За назвою
+ За uid
+ За датою встановлення
+ За датою оновлення
+ За часом зміни (XPrivacy)
+ За станом (XPrivacy)
+ Інвертувати порядок впорядкування
+ Спроба використання:
+ Категорія:
+ Функція:
+ Параметри:
+ Застосувати до всієї категорії
+ Один раз
+ "Білий/чорний '%1$s'"
+ Дозволити
+ Заборонити
+ Не знаю
+ Будь ласка, відправте ваші обмеження, аби допомогти іншим
+ Дозволи
+ Заборонити
+ Застосувати шаблон (категорії)
+ Застосувати шаблон (категорії+функції)
+ Застосувати шаблон (злиття)
+ Застосувати шаблон (скидання)
+ Увімкнути запит обмежень
+ Вимкнути запит обмежень
+ Час на вибір:
+ Скинути
+ Типовий
+ Альтернативний
+ Перейменувати
+ Використання
+ 1. Знайдіть додаток для заборони в головному переліку додатків
+ 2. Торкніться піктограми додатку
+ 3. Оберіть перший чекбокс в будь-якій категорії , яку ви бажаєте заборонити
+ "Забороняйте з розумом. Не очікуйте доступу до інтернету, якщо ви заборонили категорію Інтернет, і т.п."
+ Натисніть і тримайте на імені для перемикання небезпечних функцій
+ Застосування до категорії скине виключення для функцій до типових значень
+ Документація по функціях
+ небезпечно, є можливість обійти
+ Перевірка оновлення
+ Завантаження оновлення
+ Торкніться, для встановлення оновлення
+ Немає доступних оновлень
+ XPrivacy 2 більше не підтримується, будь ласка, оновіться до XPrivacy 3
+ Оригінал
+ Серійний номер
+ Широта
+ Довгота
+ Висота
+ MAC-адреса
+ IP адреса
+ IMEI
+ Номер телефону
+ Android ID
+ GSF ID
+ Рекламний ID
+ MCC
+ MNC
+ Країна
+ Оператор
+ ICC ID
+ ID підписки
+ SSID
+ User agent
+ Загальне
+ Фальшиві дані
+ Оновити сповіщення
+ Запит обмежень
+ Чорний перелік облікових записів, додатків та контактів
+ Звіт зневадження (потрібне перезавантаження)
+ Експертний режим
+ Максимальний інтервал отримання конфіденційних даних
+ Експериментальні функції (потрібне перезавантаження)
+ Використовувати безпечні з\'єднання
+ Заборона системних компонентів (Android) (потрібне перезавантаження)
+ Показати використання даних
+ Показати параметри даних о використанні
+ Показати значення використання даних
+ ID GSM стільниці
+ GSM LAC
+ Модифікації
+ Режим AOSP (потрібне перезавантаження)
+ Перший чекбокс: обмежити категорію чи функцію
+ Другий чекбокс: обмежити під час запуску; перший чекбокс я типовим значенням
+ Перемикач увім/вимк: включити чи вимкнути всі обмеження
+ Натисніть і тримайте на імені для вибору
+ буде запит на обмеження
+ Додаток
+ запитує доступ до Інтернету
+ має дозвіл Android
+ дані вже використовувались
+ немає даних по використанню
+ вимкнено
+ зміна дозволів небезпечна
+ частково заборонено
+ обмеження потребують уваги
+ обмеження змінені
+ обмеження відправлені
+ має специфічні фальшиві дані про себе
+ Виберіть категорію для обмеження
+ Натисніть чекбокс для застосування обмежень з обраної категоріі до програми\n
+\nВідмітьте другий чекбокс для обмежень по запиту\n
+\nПрограми будуть отримувати порожні або фальшиві дані для обраних категорій\n
+\nНатисніть іконку програми для детальних обмежень та налаштувань.
+ Натисніть іконку програми для додаткових дій
+ Натисніть стрілку, щоб побачити окремі функції та обмеження в категорії
+ Керування додатками, та можливістю їх вимикати
+ Керування обмеженнями та налаштуваннями XPrivacy
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-vi/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-vi/strings.xml
new file mode 100644
index 0000000..a25b4de
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-vi/strings.xml
@@ -0,0 +1,255 @@
+
+
+ XPrivacy chưa được kích hoạt trong Xposed installer
+ Chỉ hỗ trợ Android 4.0.3+
+ XPrivacy không tương thích với %s
+ XPrivacy phiên bản: %s (%d)
+ Ứng dụng quản lý thông tin riêng tư tối đa
+ Bản quyền \u00A9 2013–2015 thuộc về M. Bokhorst (M66B)
+ Đang chạy trong chế độ tương thích
+ Đã cấp bản quyền, cảm ơn vì sự hỗ trợ của bạn!
+ Sử dụng
+ Làm mới
+ Thiết lập
+ Thiết lập mẫu (cho ứng dụng mới)
+ Báo cáo lỗi
+ Xuất thông tin cấu hình
+ Nhập thông tin cấu hình
+ Áp dụng thiết lập
+ Lấy thông tin thiết lập
+ Đổi giao diện
+ Phiên bản Pro
+ Giới thiệu
+ Trợ giúp
+ Chọn tất cả
+ Sắp xếp
+ Lọc
+ Tất cả
+ Thay đổi các sự hạn chế
+ Xóa tất cả
+ Xóa
+ Xóa tất cả dữ liệu
+ Thay đổi bộ lọc
+ Áp dụng thiết lập mẫu
+ Xóa thiết lập
+ Mở ứng dụng
+ Chi tiết ứng dụng
+ Play Store
+ Tắt ứng dụng
+ Chọn tài khoản cho phép
+ Chọn ứng dụng để cấp phép
+ Chọn liên lạc cho phép
+ Quản lý danh sách cho phép
+ Hướng dẫn
+ Nhật ký thay đổi
+ Xóa bộ nhớ đệm
+ Kiểm tra cập nhật
+ Operations …
+ Chú giải
+ Đang hủy
+ Đã hủy
+ Mới
+ Cập nhật
+ Đang tải
+ Đang áp dụng
+ Thiết lập mẫu đã được áp dụng
+ Đã được lưu vào %s
+ Không có thông tin hạn chế nào được tìm thấy
+ Bạn có chắc không?
+ Vui lòng chọn một vài ứng dụng
+ Vui lòng chọn ít hơn %d ứng dụng
+ Hoàn tất
+ Yêu cầu khởi động lại thiết bị
+ Tạo thông tin ngẫu nhiên
+ Tạo thông tin ngẫu nhiên lúc truy cập
+ Tạo thông tin ngẫu nhiên khi khởi động
+ Yêu cầu khởi động lại ứng dụng
+ Vui lòng đăng kí thiết bị của bạn
+ Vui lòng nhập địa chỉ email của bạn:
+ Kiểm tra email của bạn để kích hoạt thiết bị
+ Cập nhật dịch vụ đang chạy
+ Đang di chuyển %s
+ Đang tạo chuỗi ngẫu nhiên %s
+ Đang nâng cấp %s
+ Một kiểm tra của ứng dụng đã thất bại, bạn có muốn gửi thông tin hỗ trợ?
+ Đã hạn chế bởi XPrivacy
+ Không tìm thấy dịch vụ bảo mật; bạn đã kích hoạt XPrivacy trong trình cài đặt Xposed và khởi động lại thiết bị?
+ Phiên bản của dịch vụ bảo mật không trùng khớp; bạn đã khởi động lại thiết bị sau khi cập nhật XPrivacy?
+ Vui lòng chờ đến khi hoàn thành cập nhật dịch vụ
+ Người dùng thành thạo là những người có thể giải quyết những vấn đề họ tạo ra và tham gia vào diễn đàn XPrivacy ở XDA và giúp đỡ những người dùng khác khi có thể.
+ Chức năng hạn chế được dành cho các người dùng thành thạo. Bạn có phải là người dùng thành thạo?
+ Nhấn và giữ tên của hàm chức năng để đưa các thông số vào danh sách đen
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ XPrivacy đã được lập trình và kiểm tra một cách cẩn trọng nhất, tuy nhiên, không thể đảm bảo chắc chắn XPrivacy sẽ hoạt động trơn tru trên mọi thiết bị cũng như với mọi ứng dụng.
+\n\nBạn tự chịu trách nhiệm khi sử dụng ứng dụng này. \n\nXem thêm về bản quyền:
+ Các tài khoản (Google, Facebook, ...)
+ Trình duyệt (đánh dấu/lịch sử duyệt web)
+ Lịch
+ Gọi điện (tạo cuộc gọi, gửi tin nhắn...)
+ Bộ nhớ đệm
+ Danh bạ
+ Từ điển (người dùng)
+ E-mail
+ Định danh (thiết bị)
+ Internet
+ Vị trí (chính xác / gần đúng)
+ Media (nhạc, phim, ảnh)
+ Tin nhắn (SMS, MMS)
+ Mạng (các địa chỉ mạng)
+ Thông báo
+ Hiển thị trên một phần của ứng dụng (đang hiển thị) khác
+ Điện thoại (ID, số điện thoại, cuộc gọi)
+ Cảm biến
+ Lưu trữ (media, thẻ SD)
+ Shell (câu lệnh, superuser)
+ Hệ thống (các ứng dụng)
+ Mở trình duyệt
+ Sẽ không có quyền xem các hành vi, hoạt động và thông tin
+ Sẽ không có quyền truy cập vào thông tin hệ thống, như danh sách ứng dụng đã cài đặt
+ Sẽ không có quyền truy cập các câu lệnh, bao gồm các câu lệnh của superuser
+ Sẽ không có quyền truy cập vào bộ nhớ lưu trữ, như các tập tin trên thẻ nhớ SD hoặc bộ nhớ trong
+ Sẽ không có quyền truy cập vào các bộ cảm biến, như cảm biến chuyển động
+ Sẽ không có quyền truy cập vào thông tin điện thoại, như số điện thoại
+ Sẽ không có quyền việc tạo cửa sổ trên một ứng dụng khác, nhằm ngăn chặn lừa đảo
+ Sẽ không có quyền truy cập vào hệ thống thông báo của ứng dụng, thông báo của hệ thống và tin nhắn đám mây của Google
+ Sẽ không có quyền truy cập vào phương thức giao tiếp tầm ngắn (NFC)
+ Sẽ không có quyền truy cập thông tin mạng, như địa chỉ IP và địa chỉ MAC và thông tin Wi-Fi
+ Sẽ không có quyền lưu trữ và nhận tin nhắn (SMS/MMS) và tin nhắn thoại
+ Sẽ không có quyền truy cập camera (hình ảnh và video) và microphone
+ Không có quyền xem vị trí chính xác và vị trí gần đúng của bạn
+ Sẽ không có quyền giao tiếp liên quá trình, khi được dùng để phá vỡ các hạn chế khác
+ Sẽ không có quyền truy cập Internet
+ Sẽ không có quyền truy cập những thông tin có thể định danh được bạn, như số serial của thiết bị của bạn
+ Sẽ không có quyền truy cập thông tin thư điện tử, như các địa chỉ và các thư điện tử (Chỉ dành cho ứng dụng mail mặc định và G-mail)
+ Sẽ không có quyền truy cập từ điển cá nhân
+ Sẽ không có quyền truy cập vào thông tin về các liên lạc của bạn
+ Sẽ không có quyền truy cập vào bộ nhớ tạm
+ Sẽ không có quyền gọi điện, gửi tin nhắn (SMS/MMS) và truy cập vào lịch sử các cuộc gọi
+ Sẽ không có quyền truy cập thông tin lịch, như các cuộc hẹn
+ Sẽ không có quyền truy cập thông tin trình duyệt, như các địa chỉ được đánh dấu và lịch sử tải xuống
+ Sẽ không có quyền truy cập vào thông tin tài khoản, như tài khoản Google và gồm cả địa chỉ G-mail
+ Các địa chỉ
+ Hành vi
+ Các địa chỉ IP
+ Các thư viện gốc của máy
+ Tên các cách thức
+ Tên các tập tin
+ Các câu lệnh
+ Các URL
+ Các giao dịch
+ Các quyền
+ Đánh dấu để hạn chế:
+ Đánh dấu để chấp nhận:
+ Lọc theo sử dụng dữ liệu
+ Lọc theo truy cập Internet
+ Lọc theo quyền
+ Lọc các ứng dụng đã thiết lập hạn chế
+ Lọc các ứng dụng người dùng
+ Lọc theo on-demand (on-demand: yêu cầu cấp quyền hoặc từ chối khi ứng dụng truy cập dữ liệu)
+ Lọc các ứng dụng hệ thống
+ Không chấp nhận
+ Theo tên
+ Theo uid
+ Theo ngày cài đặt
+ Theo ngày cập nhật
+ Theo ngày chỉnh sửa (XPrivacy)
+ Theo trạng thái (XPrivacy)
+ Đảo ngược vị trí sắp xếp
+ Cố gắng sử dụng của:
+ Danh mục:
+ Chức năng:
+ Các thông số:
+ Áp dụng cho toàn bộ danh mục
+ Một lần cho
+ Danh sách cho phép \'%s\'
+ Cho phép
+ Từ chối
+ Không biết
+ Vui lòng gửi thông tin về các sự hạn chế để giúp đỡ người dùng khác
+ Các quyền
+ Hạn chế
+ Áp dụng mẫu (các danh mục)
+ Áp dụng mẫu (các danh mục+các chức năng)
+ Áp dụng mẫu (kết hợp)
+ Áp dụng mẫu (xóa bỏ kết hợp)
+ Kích hoạt hạn chế theo yêu cầu truy cập
+ Tắt hạn chế theo yêu cầu truy cập
+ Thời gian đếm ngược sẽ:
+ Xác lập lại
+ Mặc định
+ Thay thế
+ Đổi tên
+ Sử dụng
+ 1. Tìm ứng dụng để hạn chế từ danh sách các ứng dụng
+ 2. Chạm vào biểu tượng của ứng dụng
+ 3. Chạm vào ô checkbox đầu tiên của danh mục bạn muốn hạn chế
+ Phán đoán các tình huống thông thường khi hạn chế một ứng dụng, như là sẽ không truy cập internet được nếu bạn hạn chế danh mục internet .v.v.
+ Chạm vào tên và giữ để hiện ra các hàm không nên bị hạn chế
+ Áp dụng cho danh mục sẽ đưa các giá trị về giá trị mặc định
+ Thông tin các chức năng
+ không an toàn, có thể bị vượt qua
+ Đang kiểm tra cập nhật
+ Đang tải bản cập nhật
+ Chạm để cài đặt cập nhật
+ Không có phiên bản cập nhật mới
+ XPrivacy 2 không còn được hỗ trợ, vui lòng nâng cấp lên XPrivacy 3
+ Gốc
+ Serial#
+ Vĩ độ
+ Kinh độ
+ Độ cao
+ Địa chỉ MAC
+ Địa chỉ IP
+ Số điện thoại
+ Android ID
+ ID quảng cáo
+ Nước
+ Nhà mạng
+ ID người đăng kí
+ Nhận dạng trình duyệt
+ Cài đặt chung
+ Dữ liệu giả
+ Cập nhật thông báo
+ Hạn chế theo yêu cầu truy cập dữ liệu
+ Danh sách hạn chế các tài khoản, ứng dụng và liên lạc
+ Nhật ký lỗi (cần khởi động lại ứng dụng)
+ Chế độ nâng cao
+ Tối đa khoảng thời gian lấy về các thiết lập
+ Các chức năng thử nghiệm (Yêu cầu khởi động lại ứng dụng)
+ Sử dụng các kết nối được bảo mật
+ Hạn chế các thành phần hệ thống (Android) (yêu cầu khởi động lại ứng dụng)
+ Hiển thị dữ liệu sử dụng bởi ứng dụng (yêu cầu khởi động lại ứng dụng)
+ Hiển thị các thông số của dữ liệu được sử dụng
+ Hiển thị giá trị của thông tin sử dụng
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (yêu cầu khởi động lại)
+ Ô kiểm đầu tiên: hạn chế danh mục hay chức năng
+ Ô kiểm thứ hai: hạn chế khi có ứng dụng truy cập dữ liệu
+ Chuyển đổi On/off: bật hoặc tắt tất cả các hạn chế
+ Nhấn và giữ để chọn
+ các sự hạn chế sẽ được yêu cầu cấp quyền
+ Ứng dụng
+ có quyền truy cập mạng
+ có quyền của hệ điều hành
+ đã sử dụng dữ liệu này
+ không có thông tin sử dụng dữ liệu
+ đã được tắt
+ nguy hiểm, hạn chế có thể gây lỗi
+ đã hạn chế một phần
+ các sự hạn chế cần xem xét
+ các sự hạn chế đã được thay đổi
+ các sự hạn chế đã được gửi đi
+ has application specific fake values
+ Chọn danh mục để hạn chế
+ Tích vào một ô chọn để hạn chế danh mục đang được chọn cho một ứng dụng\n
+\nỨng dụng sẽ được nhập thông tin giả hoặc thông tin rỗng cho các danh mục bị hạn chế\n
+\nChọn vào biểu tượng của ứng dụng để xem chi tiết các thiết lập và các sự hạn chế
+ Chọn vào biểu tượng của ứng dụng để sử dụng các chức năng khác
+ Chọn vào mũi tên xuống để xem các hàm ngoại lệ của danh mục hạn chế
+ Quản lý các ứng dụng, bao gồm tắt ứng dụng
+ Quản lý các sự hạn chế và cấu hình XPrivacy
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-zh-rCN/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..dea01d1
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-zh-rCN/strings.xml
@@ -0,0 +1,256 @@
+
+
+ XPrivacy 没有在 Xposed 框架中启用
+ 仅支持 Android 4.0.3 以上版本
+ XPrivacy 与 %1$s 不兼容
+ XPrivacy 版本: %1$s (%2$d)
+ 终级隐私管理器
+ 版权所有 \u00A9 2013–2015 M. Bokhorst (M66B)
+ 兼容模式运行
+ 已授权, 感谢您的支持!
+ 权限使用记录
+ 刷新应用列表
+ 设置
+ 新装应用默认权限模板
+ 报告问题
+ 导出全局配置
+ 导入全局配置
+ 提交权限限制规则
+ 下载权限限制规则
+ 切换明/暗主题
+ 专业版
+ 关于
+ 帮助
+ 选择全部
+ 分类
+ 过滤器
+ 全部权限
+ 全选/不选列表中的应用
+ 清除限制
+ 清除权限使用记录
+ 清除全部数据
+ 过滤器开关
+ 应用默认权限模板
+ 清除所有权限限制
+ 启动应用
+ 模拟设置
+ Play 商店
+ 强制停止当前应用
+ 选择允许访问的帐号
+ 选择允许访问的应用
+ 选择允许访问的联系人
+ 管理白名单
+ 界面功能指引
+ 更新日志
+ 清除缓存
+ 检查更新
+ 操作…
+ 图例
+ 正在中止
+ 已中止
+ 新应用
+ 已更新
+ 加载中…
+ 正在应用过滤器…
+ 已应用模版
+ 保存到%1$s
+ 没有找到权限限制规则
+ 是否确定?
+ 请选择一些应用程序
+ 请不要选择 %d 个以上应用程序
+ 完成
+ XPrivacy 需要在重启后才能生效
+ 生成随机数值
+ 访问时随机生成数值
+ 设备启动时重新生成随机数值
+ 需要重启应用使规则生效
+ 请注册你的设备
+ 请输入你的电子邮件地址:
+ 查看激活邮件来激活你的设备
+ 更新服务正在运行
+ 正在移动 %1$s
+ 正在随机化 %1$s
+ 正在升级 %1$s
+ 内部检查出现错误, 要发送支持信息吗?
+ 由 XPrivacy 限制
+ 没有找到Privacy服务,您是否在Xposed Installer中启用XPrivacy并重启设备?
+ Privacy服务版本不对,您是否在升级XPrivacy后忘了重启?
+ 更新服务已完成请等待
+ 如果可能的话,专家用户都应该解决自己问题的同时关注 XDA XPrivacy 论坛并尽可能帮助他人解决问题
+ 函数限制专用于专家用户. 您是专家用户吗?
+ 长按函数名称将参数添加到黑/白名单
+ 复选标记和值优先于全局中复选标记和值;取消复选框和空值则不采取优先
+ 因为已损坏, 已经重置隐私数据库
+ XPrivacy 的开发和测试工作已经非常全面和细致,
+但仍然不可能保证它能完美兼容所有设备及应用。
+\n\n使用者需自行承担风险。 \n\n另请参阅使用许可:
+ 账户( Google/Facebook 账户)
+ 浏览器(收藏夹/历史)
+ 日历
+ 通讯(语音呼叫/发送短信/发送彩信)
+ 剪贴板
+ 联系人(通讯录)
+ 词典(用户词典)
+ 电子邮件
+ 识别码(设备识别信息)
+ 互联网(网络通讯)
+ 位置(精确/粗略)
+ 媒体(声音/图片/视频)
+ 信息(短信/彩信)
+ 网络状态( IP 地址)
+ 通知(通知栏提示)
+ 浮动窗口(在其他应用之上显示内容)
+ 电话(电话号码/通话状态)
+ 感应器(重力方向/光线强度)
+ 存储(内置存储器/存储卡)
+ 命令行(执行命令/获得超级用户权限)
+ 系统(查看已安装的应用)
+ 显示网页(内置浏览器)
+ 将访问视图操作和信息限制
+ 将系统信息限制,比如安装的应用程序
+ 将访问shell命令限制,包括超级用户命令
+ 将访问存储限制,比如SD卡或内部存储文件
+ 将访问传感器限制,比如运动传感器
+ 将访问手机信息限制,比如您的电话号码
+ 将叠加窗口限制,以防止网络钓鱼
+ 将访问系统和应用程序通知和谷歌云消息限制
+ 将访问近场通信(NFC)限制
+ 将访问网络信息限制,比如IP地址和MAC地址和Wi-Fi网络信息
+ 将访问存储和接收的短信/彩信和语音邮件限制
+ 将访问相机(照片和视频)和麦克风限制
+ 将访问你的粗略位置限制
+ 将进程间通信限制,使用时要规避其他限制
+ 将访问互联网限制
+ 将识别您的身份信息限制,如您的设备序列号
+ 将访问电子邮件信息限制,如地址和邮件(仅限标准应用和Gmail)
+ 将访问用户词典限制
+ 将访问有关您的联系人限制
+ 将剪贴板上获取的信息限制
+ 将主叫电话号码,发送短信/彩信,并访问您的通话记录等限制
+ 将访问您的日历信息限制,比如您的约会
+ 将访问浏览器信息限制,比如你的书签和下载历史记录
+ 将访问帐户信息限制,比如您的谷歌帐户,其中包括您的G-mail地址
+ 地址
+ 动作
+ IP 地址
+ 本地库文件
+ 特殊方法名字
+ 文件名称
+ Shell 命令
+ URLs
+ 交易
+ 权限
+ 勾选表示限制:
+ 勾选表示允许:
+ 曾经使用
+ 网络权限
+ 含有权限
+ 限制使用
+ 用户应用
+ 按需过滤
+ 系统应用
+ 反选
+ 按名称
+ 按UID
+ 按安装日期
+ 按更新日期
+ 按修改日期 (XPrivacy)
+ 按状态 (XPrivacy)
+ 反转分类次序
+ 权限使用尝试:
+ 权限类别:
+ 功能:
+ 参数:
+ 应用到整个权限类别
+ 仅一次
+ 白名单/黑名单‘%1$s’
+ 允许
+ 拒绝
+ 不确定
+ 请发送你的应用限制信息来帮助其他人
+ 权限
+ 限制(分类)
+ 应用模板(分类)
+ 应用模板(分类和功能)
+ 应用模板(合并)
+ 应用模板 (合并重置)
+ 开启按需权限限制
+ 关闭按需权限限制
+ 超时将:
+ 复位
+ 默认
+ 备用
+ 重命名
+ 用户指南
+ 1. 找到应用程序的主应用程序列表中以限制
+ 2. 点击应用程序图标
+ 3. 点击任何分类中您要限制的第一个复选框
+ 使用常识限制,如果您不希望互联网接入那么请限制它。
+ 长按标题切换到危险函数
+ 应用异常可在类别功能中重置为默认值
+ 函数文档
+ 是不安全的,可以避免
+ 检查更新
+ 下载更新
+ 点击安装更新
+ 没有可用更新
+ XPrivacy2已经不支持,请考虑升级到XPrivacy3
+ 原始
+ 序列号
+ 纬度
+ 经度
+ 海拔
+ MAC 地址
+ IP 地址
+ 电话号码
+ 安卓ID
+ 广告ID
+ 国家
+ 运营商
+ IMSI
+ 用户代理
+ 一般设置
+ 模拟信息
+ 通知栏提示
+ 按需限制权限
+ 黑名单帐户,应用程序和联系人
+ 调试日志(需要重启)
+ 专家模式
+ 最大采样置信区间
+ 实验性功能 (需要重启)
+ 使用安全连接(https)
+ 限制安卓系统组件
+ 显示应用权限使用情况
+ 显示使用情况参数
+ 显示使用数据的值
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP模式 (需要重新启动)
+ 第一个复选框:限制类或函数
+ 第二个复选框:限制需求
+ 开关:启用或禁用所有限制
+ 长按名称进行选择
+ 当限制时询问
+ 请输入应用名称
+ 应用含有网络访问权限
+ 应用已经含有这种权限
+ 应用曾经用过这种权限
+ 应用没有用过这种权限
+ 应用已被暂停使用
+ 可能导致应用异常的权限
+ 只限制部分权限
+ 可以下载限制规则的应用
+ 限制规则已经生效的应用
+ 已经分享限制规则的应用
+ 有特殊应用假值
+ 选择权限类别进行限制
+ 勾选应用后的复选框以限制所选类别的权限\n
+\n被限制的应用请求该权限时会接收到空或伪造的数据\n
+\n点击应用图标以查看详细权限限制规则和设置
+ 点击应用图标以查看更多操作
+ 点击左侧向下的箭头以查看该类别的子权限
+ 管理应用程序,包括强行停止
+ 管理XPrivacy限制和设置
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values-zh-rTW/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..bac6cf9
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values-zh-rTW/strings.xml
@@ -0,0 +1,256 @@
+
+
+ 尚未於 Xposed installer 啟用 XPrivacy
+ 僅支援版本 Android 4.0.3+
+ %s 與XPrivacy不相容
+ XPrivacy 版本: %s (%d)
+ 超強隱私及權限管理工具,絕讚好評發售中!!
+ 版權所有 \u00A9 2013–2015 by M. Bokhorst (M66B)
+ 相容模式 Compatibility Mode
+ 授權成功,感謝您贊助 XPrivacy!!
+ 操作記錄
+ 重新整理
+ 設定
+ 設定預設規則
+ 回報問題
+ 匯出規則
+ 匯入規則
+ 上傳規則
+ 擷取規則
+ 更換背景
+ 專業版
+ 關於
+ 說明
+ 全選
+ 排序
+ 篩選
+ 所有程式
+ 套用預設規則
+ 清空
+ 清除記錄
+ 清除所有資料
+ 切換顯示限制項目
+ 套用預設規則
+ 清空
+ 執行
+ 應用程式資訊
+ Play 商店
+ 強制停止
+ 設定允許存取之帳戶
+ 設定允許存取之app
+ 設定允許存取之聯絡人
+ 設定白名單
+ 說明
+ 更新履歷
+ 清除快取
+ 檢查更新
+ 規則操作 …
+ 圖示
+ 正在取消...
+ 已取消
+ 已安裝
+ 已更新
+ 載入中...
+ 正在套用設定...
+ 已套用預設規則
+ 已儲存至 %s
+ 找不到限制規則
+ 確定執行操作?
+ 請選擇應用程式
+ 請選擇少於 %d 個應用程式
+ 完成
+ 需要重新啟動
+ 執行亂數
+ 存取資訊時進行亂數
+ 重新啟動後進行亂數
+ 需要重新啓動程式
+ 請先註冊您的 Android 裝置
+ 請輸入E-mail:
+ 請到信箱驗證啟用您的 Android 裝置
+ 更新服務執行中
+ 正在移植 %s
+ 正在產生亂數 %s
+ 正在更新 %s
+ 發生程式內部錯誤,請問是否傳送錯誤報告?
+ 已被 XPrivacy 限制權限
+ 找不到 XPrivacy 服務。請確認已經在 Xposed installer 中啟用 XPrivacy 模組,並且重新開機。
+ XPrivacy 服務版本不符。請確認在更新 XPrivacy 後有重新開機。
+ 請稍等更新完成
+ 進階使用者們請盡可能解決問題、參與XDA討論並且幫忙解決其他使用者的問題。謝謝~
+ 功能限制主要供進階使用者使用,確定要這麼做嗎?
+ 長按功能項目來設定黑/白名單參數
+ 打勾後會用app專屬偽造資訊取代全域設定;反之則套用全域設定的偽造資訊
+ The privacy database was reset, because it was corrupt
+ 儘管 XPrivacy 在開發過程中經過詳細測試,但仍無法保證可以在所有裝置/安卓版本/各app上正常使用
+ \n\n請自行承擔使用XPrivacy的可能風險。
+ \n\n請參閱說明文件:
+ 帳戶 (Google, Facebook, etc)
+ 瀏覽器資訊 (書籤, 記錄)
+ 行事曆
+ 通話功能 (撥號, 傳簡訊, 通話記錄)
+ 剪貼簿
+ 聯絡人
+ 使用者辭典
+ 電子郵件
+ 身分識別碼 (Android ID, proc, etc)
+ 網路功能
+ 位置資訊 (精確/粗略)
+ 媒體功能 (拍照, 錄影, 錄音)
+ 簡訊內容 (SMS, MMS)
+ 網路資訊 (IP, MAC Addr)
+ 通知
+ 畫面混成 (Overlay)
+ 手機資訊 (SIM卡)
+ 感應器 (陀螺儀, 指南針)
+ 儲存空間 (媒體檔案, SD卡)
+ Shell (指令, ROOT指令)
+ 系統資訊 (程式, 服務, etc)
+ 瀏覽及檢視器
+ 限制顯示介面與瀏覽器使用權
+ 限制系統資訊,例如已安裝app清單
+ 限制命令列,包含root後的超級使用者指令
+ 限制存取儲存裝置,例如SD卡, 內部儲存空間
+ 限制存取感應器,例如加速度計, 陀螺儀, 指南針
+ 隱藏手機資訊,例如電話號碼
+ 封鎖畫面混成,可避免釣魚app攻擊
+ 將限制系統通知, app通知, GSM通知
+ 限制存取NFC功能
+ 隱藏網路資訊,例如IP位置, MAC實體位置, Wifi相關資訊
+ 限制存取及接收訊息,包括SMS文字簡訊, MMS多媒體簡訊, 語音訊息
+ 限制存取相機,包括拍照, 錄影, 錄音
+ 隱藏粗略及精細定位資訊
+ 限制IPC (程式間通訊),此功能可能被用來繞過某些限制
+ 限制網路存取
+ 隱藏個人識別資料,例如手機序號、Android ID
+ 隱藏電子郵件地址及內容,但只適用內建電子郵件app和Gmail
+ 隱藏使用者辭典內容
+ 隱藏電話簿內容
+ 限制存取剪貼簿
+ 限制打電話, 傳簡訊, 查看通話記錄
+ 隱藏行事曆內容
+ 隱藏瀏覽器內容,例如書籤和下載記錄
+ 隱藏帳戶資訊,例如Google帳號
+ Addresses
+ Action
+ IP 位址
+ 原生資料庫元件
+ Method names
+ 檔案名稱
+ Shell 指令
+ 網址
+ Transactions
+ Permissions
+ 限制項目:
+ 允許:
+ 程式曾取得過資訊
+ 程式要求網際網路權限
+ 程式要求手機權限
+ 已被限制程式
+ 顯示使用者app
+ 使用互動式限制
+ 顯示系統app
+ ←相反選擇
+ 名稱
+ UID
+ 安裝日期
+ 更新日期
+ 修改日期 (XPrivacy)
+ By state (XPrivacy)
+ 反序排列
+ 本程式嘗試存取:
+ 分類:
+ 功能:
+ 參數:
+ 套用至整個限制分類
+ 再次詢問:
+ 白名單 \'%s\'
+ 允許
+ 封鎖
+ 不確定
+ 稍後請上傳您的設定到社群網路利人利己 :)
+ 權限
+ 限制
+ 套用預設規則 (僅大分類)
+ 套用預設規則 (全部取代)
+ 套用預設規則 (與現有設定整合)
+ 套用預設規則 (merge reset)
+ 開啟互動式限制
+ 關閉互動式限制
+ 若逾時則:
+ 重設
+ 預設
+ 其他
+ Rename
+ 使用方法
+ 1. 從應用程式清單中找出欲限制的APP
+ 2. 點選該APP圖示
+ 3. 點選想限制項目前的核取方塊
+ 請用常理判斷,比如限制了"網際網路",那麼該程式就不能存取網路了。
+ 欲選取不建議限制的項目時,需要長按項目名稱。
+ 套用到整個分類時會覆寫預設限制列表的設定。
+ 功能說明
+ 就算封鎖了還是有可能被繞開的功能
+ 檢查更新
+ 下載更新中....
+ 按下安裝更新
+ 無可用更新。
+ XPrivacy 2 已經停止支援,建議更新到XPrivacy 3。
+ Original
+ 序號
+ 緯度
+ 經度
+ 海拔
+ MAC 位置
+ IP 位置
+ 手機號碼
+ Android ID
+ 個人化廣告識別碼
+ 國家
+ 電信商
+ IMSI
+ User agent
+ 一般設定
+ 偽造資訊設定
+ APP更新時顯示通知
+ 開啟互動式限制設定
+ 黑名單設定(帳戶、程式、聯絡人)
+ 偵錯日誌 (需重新啟動)
+ 進階模式
+ 最大擷取信賴區間
+ 實驗性功能 (需重新啟動)
+ 使用加密連線 (HTTPS)
+ 可限制安卓系統元件
+ 開啟操作記錄
+ 顯示細部操作紀錄參數
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ 使用 AOSP 模式 (需重新啟動)
+ 左邊框框:打勾=限制分類或功能
+ 右邊框框:打勾=會跳視窗出來提示
+ 上面開關:開啟或關閉對該app的操作
+ 長按程式名稱可選取
+ 存取該權限時詢問
+ 程式名稱
+ 表示有網際網路權限
+ 表示有手機權限
+ 表示app曾取得過資訊
+ 表示無法記錄操作
+ 表示app已凍結/停用
+ 不建議限制
+ 只有限制部分權限
+ 限制時需特別注意
+ 規則已變更
+ 規則已上傳
+ 已設定app專用偽造資料
+ 選擇要限制的權限分類
+ 點選勾選框可封鎖APP使無法取得敏感資訊或功能權限\n
+ \n當特定資訊被封鎖時,該APP會接收到假資料或空白資料\n
+ \n點選APP圖示可針對該APP設定細部規則
+ 點選APP圖示顯示進階動作選單
+ 點選﹀符號可編輯細部權限設定
+ 管理/強制停止app
+ XPrivacy 設定及限制
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values/attrs.xml b/src/XPrivacy-master/XPrivacy-master/res/values/attrs.xml
new file mode 100644
index 0000000..4b1fd26
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values/attrs.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values/colors.xml b/src/XPrivacy-master/XPrivacy-master/res/values/colors.xml
new file mode 100644
index 0000000..9de3052
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values/colors.xml
@@ -0,0 +1,24 @@
+
+
+
+ #80cbc4
+ #009688
+ #26a69a
+ #00796b
+ #ff6e40
+ #ff6e40
+ #3CF83A3A
+ #50F83A3A
+ #801D1D
+ #0CF83A3A
+ #20F83A3A
+ #3CF8743A
+ #50F8743A
+ #FFC800
+ #FF8C00
+ #C8C8C8
+ #A9A9A9
+ #00DC00
+ #008000
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values/dimens.xml b/src/XPrivacy-master/XPrivacy-master/res/values/dimens.xml
new file mode 100644
index 0000000..d7e750a
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values/dimens.xml
@@ -0,0 +1,14 @@
+
+
+
+ 16dp
+ 16dp
+ 0dp
+
+
+ 640dip
+ 400dip
+ 400dip
+ 200dip
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values/functions.xml b/src/XPrivacy-master/XPrivacy-master/res/values/functions.xml
new file mode 100644
index 0000000..c06401f
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values/functions.xml
@@ -0,0 +1,466 @@
+
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+
+
+
+
+
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+
+
+
+
+
+ Google documentation]]>
+
+
+ Wikipedia)]]>
+ Wikipedia) See also Phone/getDeviceId]]>
+ Wikipedia)]]>
+
+
+ Manual page)]]>
+
+
+
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ VPN services]]>
+ Mesh networking services]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+
+ Wikipedia)]]>
+ Wikipedia)]]>
+
+
+ geofences]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ geofences]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ phone state listener]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ phone state listener]]>
+ phone state listener]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ ,%20android.hardware.camera2.CameraCaptureSession.CaptureCallback,%20android.os.Handler)">Google documentation]]>
+ ,%20android.hardware.camera2.CameraCaptureSession.CaptureCallback,%20android.os.Handler)">Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+
+
+ Google documentation]]>
+
+
+
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentationGoogle documentation ]]>
+ Google documentation]]>
+ Google documentationGoogle documentation ]]>
+ Google documentationGoogle documentation ]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ WifiConfiguration]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ WifiConfiguration]]>
+
+
+ Google documentation]]>
+
+
+ NfcAdapter]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ ISIM information]]>
+ ISIM information]]>
+ ISIM information]]>
+
+ Google documentation]]>
+ MSISDN]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ APN information]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ MCC]]>
+ MNC]]>
+ Google documentation]]>
+ Google documentation]]>
+ ISIM information]]>
+ ISIM information]]>
+ ISIM information]]>
+
+ Google documentation]]>
+ MSISDN]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+
+
+
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ ISIM information]]>
+ ISIM information]]>
+ ISIM information]]>
+
+
+
+ Google documentation]]>
+ MSISDN]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation ]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation ]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ article)]]>
+ article)Google documentation ]]>
+ MTP]]>
+ Google documentation]]>
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Documentation]]>
+ Documentation]]>
+ Documentation]]>
+ Documentation]]>
+ Documentation]]>
+ Documentation]]>
+ Documentation]]>
+ Documentation]]>
+
+
+ Google documentation]]>
+ Google documentation]]>
+
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+ Google documentation]]>
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values/once.xml b/src/XPrivacy-master/XPrivacy-master/res/values/once.xml
new file mode 100644
index 0000000..125feff
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values/once.xml
@@ -0,0 +1,15 @@
+
+
+
+
+ - 15s
+ - 30s
+ - 1m
+ - 2m
+ - 5m
+ - 10m
+ - 20m
+ - 60m
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values/strings.xml b/src/XPrivacy-master/XPrivacy-master/res/values/strings.xml
new file mode 100644
index 0000000..d0ee276
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values/strings.xml
@@ -0,0 +1,272 @@
+
+
+
+ XPrivacy
+ XPrivacy is not enabled in the Xposed installer
+ Only for Android version 4.0.3+
+ XPrivacy is incompatible with %1$s
+ Please upgrade the Pro enabler
+ XPrivacy version: %1$s (%2$d)
+ The ultimate privacy manager
+ Copyright \u00A9 2013–2015 by M. Bokhorst (M66B)
+ Running in compatibility mode
+ Licensed, thanks for your support!
+ https://github.com/M66B/XPrivacy#xprivacy
+ http://forum.xda-developers.com/showthread.php?t=2320783
+ Usage data
+ Refresh
+ Settings
+ Template
+ Report issue
+ Export
+ Import
+ Submit restrictions
+ Fetch restrictions
+ Switch theme
+ Pro version
+ About
+ Help …
+ Select all
+ Sort
+ Filter
+ All
+ Toggle restrictions
+ Clear all
+ Clear
+ Clear all XPrivacy data
+ Toggle all/restricted
+ Apply template
+ Clear
+ Launch
+ Settings
+ Play Store
+ Kill
+ Select accounts to allow
+ Select applications to allow
+ Select contacts to allow
+ Manage whitelists
+ Tutorial
+ Changelog
+ Flush cache
+ Check for updates
+ Operations …
+ Legend
+ Aborting
+ Aborted
+ New
+ Update
+ Loading …
+ Applying …
+ Template applied
+ Saved to %1$s
+ No restrictions found
+ Are you sure?
+ Please select some applications
+ Please select fewer than %1$d applications
+ Done
+ Device restart required
+ Randomize now
+ Randomize on access
+ Randomize on boot
+ Application restart required
+ Please register your device
+ Please enter your e-mail address:
+ Check your e-mail to activate your device
+ Update service running
+ Migrating %1$s
+ Randomizing %1$s
+ Upgrading %1$s
+ An internal check failed, do you want to send the support info?
+ Restricted by XPrivacy
+ Privacy service not found; did you enable XPrivacy in the Xposed installer and reboot your device?
+ Privacy service version mismatch; did you reboot your device after upgrading XPrivacy?
+ Please wait until the update service has been completed
+ Expert users are supposed to solve their own problems where possible and to follow the XDA XPrivacy forum and help others where possible
+ Function restrictions are meant for expert users. Are you an expert user?
+ Long press function name to white or black list parameter
+ Check marks and values take precedence over global check marks and values; empty check boxes and values do not take precedence
+ The privacy database was reset, because it was corrupt
+ Great care has been taken to develop and test XPrivacy,
+however it is impossible to guarantee it will work flawlessly on each and every device and for each and every application.
+\n\nUse is entirely at your own risk. \n\nSee also the license:
+ Accounts
+ Browser
+ Calendar
+ Calling
+ Clipboard
+ Contacts
+ Dictionary
+ E-mail
+ Identification
+ Internet
+ IPC
+ Location
+ Media
+ Messages
+ Network
+ NFC
+ Notifications
+ Overlay
+ Phone
+ Sensors
+ Storage
+ Shell
+ System
+ View
+ Will restrict access to view actions and information
+ Will restrict access to system information, like installed applications
+ Will restrict access to shell commands, including superuser commands
+ Will restrict access to the storage, like files on your SD card or the internal storage
+ Will restrict access to the sensors, like the motion sensor
+ Will restrict access to phone information, like your phone number
+ Will restrict overlay windows to prevent phishing
+ Will restrict access to system and application notifications and Google cloud messaging
+ Will restrict access to near field communication
+ Will restrict access to network information, like IP and MAC addresses and Wi-Fi network information
+ Will restrict access to stored and received messages (SMS/MMS) and voicemail
+ Will restrict access to the camera (photos and videos) and the microphone
+ Will restrict access to your coarse and fine location
+ Will restrict inter-process communication, when used to circumvent other restrictions
+ Will restrict access to the Internet
+ Will restrict information which can identify you, like the serial number of your device
+ Will restrict access to e-mail information, like addresses and messages (standard and G-mail application only)
+ Will restrict access to the user dictionary
+ Will restrict access to information about your contacts
+ Will restrict access to information on the clipboard
+ Will restrict calling phone numbers, sending messages (SMS/MMS) and access to your calling history
+ Will restrict access to your calendar information, like your appointments
+ Will restrict access to browser information, like your bookmarks and the download history
+ Will restrict access to account information, like your Google account, which includes your G-mail address
+ Addresses
+ Action
+ IP addresses
+ Native libraries
+ Method names
+ File names
+ Shell commands
+ URLs
+ Transactions
+ Permissions
+ /proc
+ Check to restrict:
+ Check to allow:
+ Filter on data usage
+ Filter on internet access
+ Filter on permission
+ Filter on restricted
+ Filter on user applications
+ Filter by on-demand
+ Filter on system applications
+ Negate
+ By name
+ By uid
+ By date installed
+ By date updated
+ By date modified (XPrivacy)
+ By state (XPrivacy)
+ Invert sort order
+ Usage attempt of:
+ Category:
+ Function:
+ Parameters:
+ Apply to entire category
+ Once for
+ White/blacklist ‘%1$s’
+ Allow
+ Deny
+ Don\'t know
+ Please submit your restrictions to help others
+ Permissions
+ Restrict (categories)
+ Apply template (categories)
+ Apply template (categories+functions)
+ Apply template (merge set)
+ Apply template (merge reset)
+ Enable on demand restricting
+ Disable on demand restricting
+ Timeout will:
+ Reset
+ Default
+ Alternate
+ Rename
+ Usage
+ 1. Find the application to restrict in the main application list
+ 2. Tap on the application icon or name
+ 3. Tap the first check box of any category you want to restrict
+ Use common sense when restricting, don\'t expect internet access if you restricted the internet category, etc.
+ Long press on a title to toggle dangerous functions
+ Applying to the category will reset the function exceptions to default values
+ Function documentation
+ is unsafe, can be circumvented
+ Checking for update
+ Downloading update
+ Tap to install update
+ No updates available
+ XPrivacy 2 is not supported anymore, please consider upgrading to XPrivacy 3
+ Original
+ Serial#
+ Latitude
+ Longitude
+ Altitude
+ MAC address
+ IP address
+ IMEI
+ Phone number
+ Android ID
+ GSF ID
+ Advertisement ID
+ MCC
+ MNC
+ Country
+ Operator
+ ICC ID
+ Subscriber ID
+ SSID
+ User agent
+ General
+ Fake data
+ Update notifications
+ Restrict on demand
+ Blacklist accounts, applications and contacts
+ Debug log (requires reboot)
+ Expert mode
+ Maximum fetch confidence interval
+ Experimental functions (requires reboot)
+ Use secure connections
+ Restrict system components (Android)
+ Show application usage data
+ Show parameters of usage data
+ Show values of usage data
+ GSM Cell ID
+ GSM LAC
+ Quirks
+ AOSP mode (requires reboot)
+ First check box: restrict category or function
+ Second check box: restrict on demand; first check box is default value
+ On/off switch: enable or disable all restrictions
+ Long press an application name to select
+ restrictions will be asked
+ Application
+ has internet permission
+ has Android permission
+ has used this data
+ no usage data available
+ is disabled
+ is dangerous, restricting may cause problems
+ partly restricted
+ restrictions need attention
+ restrictions are changed
+ restrictions are submitted
+ has application specific fake values
+ Select the category to restrict
+ Tap the first check box to restrict the selected category for an app\n
+\nTap the second check box to restrict on demand\n
+\nApps will be fed empty or fake data for restricted categories\n
+\nTap the app icon or name for detailed restrictions and settings
+ Tap the app icon for more actions
+ Tap the down arrow to see the function exceptions of a restriction category
+ Manage applications, including killing
+ Manage XPrivacy restrictions and settings
+ 10620ae961d78854f6c9cd872c4388232849c799
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/values/styles.xml b/src/XPrivacy-master/XPrivacy-master/res/values/styles.xml
new file mode 100644
index 0000000..4f08089
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/values/styles.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/res/xml/device_admin.xml b/src/XPrivacy-master/XPrivacy-master/res/xml/device_admin.xml
new file mode 100644
index 0000000..c412ad1
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/res/xml/device_admin.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/about.png b/src/XPrivacy-master/XPrivacy-master/screenshots/about.png
new file mode 100644
index 0000000..62f8101
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/about.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/application.png b/src/XPrivacy-master/XPrivacy-master/screenshots/application.png
new file mode 100644
index 0000000..78d7abb
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/application.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/applications.png b/src/XPrivacy-master/XPrivacy-master/screenshots/applications.png
new file mode 100644
index 0000000..3ba3249
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/applications.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/categories.png b/src/XPrivacy-master/XPrivacy-master/screenshots/categories.png
new file mode 100644
index 0000000..ac48623
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/categories.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/expert-2.png b/src/XPrivacy-master/XPrivacy-master/screenshots/expert-2.png
new file mode 100644
index 0000000..24add14
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/expert-2.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/expert.png b/src/XPrivacy-master/XPrivacy-master/screenshots/expert.png
new file mode 100644
index 0000000..c7f32c2
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/expert.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/filter.png b/src/XPrivacy-master/XPrivacy-master/screenshots/filter.png
new file mode 100644
index 0000000..015ce1b
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/filter.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/help.png b/src/XPrivacy-master/XPrivacy-master/screenshots/help.png
new file mode 100644
index 0000000..2e4e78a
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/help.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/menu.png b/src/XPrivacy-master/XPrivacy-master/screenshots/menu.png
new file mode 100644
index 0000000..308d20b
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/menu.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/on-demand-dialogue.png b/src/XPrivacy-master/XPrivacy-master/screenshots/on-demand-dialogue.png
new file mode 100644
index 0000000..24210f3
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/on-demand-dialogue.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/settings-2.png b/src/XPrivacy-master/XPrivacy-master/screenshots/settings-2.png
new file mode 100644
index 0000000..0def18f
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/settings-2.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/settings-3.png b/src/XPrivacy-master/XPrivacy-master/screenshots/settings-3.png
new file mode 100644
index 0000000..358f4aa
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/settings-3.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/settings.png b/src/XPrivacy-master/XPrivacy-master/screenshots/settings.png
new file mode 100644
index 0000000..538e806
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/settings.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/sort.png b/src/XPrivacy-master/XPrivacy-master/screenshots/sort.png
new file mode 100644
index 0000000..1376eda
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/sort.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/template.png b/src/XPrivacy-master/XPrivacy-master/screenshots/template.png
new file mode 100644
index 0000000..6507bcb
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/template.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/toggle.png b/src/XPrivacy-master/XPrivacy-master/screenshots/toggle.png
new file mode 100644
index 0000000..3339628
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/toggle.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/usagedata.png b/src/XPrivacy-master/XPrivacy-master/screenshots/usagedata.png
new file mode 100644
index 0000000..d12ea13
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/usagedata.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/screenshots/whitelist.png b/src/XPrivacy-master/XPrivacy-master/screenshots/whitelist.png
new file mode 100644
index 0000000..ee221b4
Binary files /dev/null and b/src/XPrivacy-master/XPrivacy-master/screenshots/whitelist.png differ
diff --git a/src/XPrivacy-master/XPrivacy-master/server/index.php b/src/XPrivacy-master/XPrivacy-master/server/index.php
new file mode 100644
index 0000000..11d740b
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/server/index.php
@@ -0,0 +1,842 @@
+ false, 'errno' => 101, 'error' => 'Empty request'));
+ exit();
+ }
+
+ // Check XPrivacy version
+ if (empty($data->xprivacy_version) || (int)$data->xprivacy_version < 219) {
+ header('Content-Type: application/json');
+ echo json_encode(array('ok' => false, 'errno' => 102, 'error' => 'Please upgrade to at least XPrivacy version 1.11'));
+ exit();
+ }
+
+ // Connect to database
+ $db = new mysqli($db_host, $db_user, $db_password, $db_database);
+ if ($db->connect_errno) {
+ log_error('json: database connect: ' . $db->connect_error, $my_email, $data);
+ header('Content-Type: application/json');
+ echo json_encode(array('ok' => false, 'errno' => 103, 'error' => 'Error connecting to database'));
+ exit();
+ }
+
+ // Select character set
+ $db->query("SET NAMES 'utf8'");
+
+ // Store/update settings
+ if (empty($action) || $action == 'submit') {
+ header('Content-Type: application/json');
+
+ // Validate
+ if (empty($data->android_id)) {
+ log_error('submit: Android ID missing', $my_email, $data);
+ echo json_encode(array('ok' => false, 'errno' => 202, 'error' => 'Android ID missing'));
+ exit();
+ }
+ if (empty($data->package_name)) {
+ log_error('submit: package name missing', $my_email, $data);
+ echo json_encode(array('ok' => false, 'errno' => 203, 'error' => 'Package name missing'));
+ exit();
+ }
+
+ // Fixes
+ if (empty($data->protocol_version) || $data->protocol_version <= 3)
+ $data->android_id = md5($data->android_id);
+
+ if (empty($data->application_name))
+ $data->application_name = array('');
+ else if (!is_array($data->application_name))
+ $data->application_name = array($data->application_name);
+
+ if (!is_array($data->package_name))
+ $data->package_name = array($data->package_name);
+
+ if (!empty($data->package_version))
+ $data->package_version_name = $data->package_version; // legacy
+
+ if (empty($data->package_version_name))
+ $data->package_version_name = array('');
+ else if (!is_array($data->package_version_name))
+ $data->package_version_name = array($data->package_version_name);
+
+ if (empty($data->package_version_code))
+ $data->package_version_code = array();
+ else if (!is_array($data->package_version_code))
+ $data->package_version_code = array($data->package_version_code);
+
+ // Validate
+ if (count($data->package_name) > $max_packages) {
+ log_error('submit: too many packages count=' . count($data->package_name) . '/' . $max_packages, $my_email, $data);
+ echo json_encode(array('ok' => false, 'errno' => 204, 'error' => 'Too many packages for application'));
+ exit();
+ }
+
+ // Check restrictions
+ if (!empty($data->settings)) {
+ foreach ($data->settings as $restriction) {
+ $found = false;
+
+ if ($restriction->restriction == 'accounts')
+ $found = true;
+ else if ($restriction->restriction == 'browser')
+ $found = true;
+ else if ($restriction->restriction == 'calendar')
+ $found = true;
+ else if ($restriction->restriction == 'calling')
+ $found = true;
+ else if ($restriction->restriction == 'clipboard')
+ $found = true;
+ else if ($restriction->restriction == 'contacts')
+ $found = true;
+ else if ($restriction->restriction == 'dictionary')
+ $found = true;
+ else if ($restriction->restriction == 'email')
+ $found = true;
+ else if ($restriction->restriction == 'identification')
+ $found = true;
+ else if ($restriction->restriction == 'internet')
+ $found = true;
+ else if ($restriction->restriction == 'ipc')
+ $found = true;
+ else if ($restriction->restriction == 'location')
+ $found = true;
+ else if ($restriction->restriction == 'media')
+ $found = true;
+ else if ($restriction->restriction == 'messages')
+ $found = true;
+ else if ($restriction->restriction == 'network')
+ $found = true;
+ else if ($restriction->restriction == 'nfc')
+ $found = true;
+ else if ($restriction->restriction == 'notifications')
+ $found = true;
+ else if ($restriction->restriction == 'overlay')
+ $found = true;
+ else if ($restriction->restriction == 'phone')
+ $found = true;
+ else if ($restriction->restriction == 'sensors')
+ $found = true;
+ else if ($restriction->restriction == 'shell')
+ $found = true;
+ else if ($restriction->restriction == 'storage')
+ $found = true;
+ else if ($restriction->restriction == 'system')
+ $found = true;
+ else if ($restriction->restriction == 'view')
+ $found = true;
+
+ if (!$found) {
+ if (empty($restriction->method))
+ $name = $restriction->restriction;
+ else
+ $name = $restriction->restriction . '/' . $restriction->method;
+ echo json_encode(array('ok' => false, 'errno' => 207, 'error' => 'Unknown category'));
+ exit();
+ }
+ }
+ }
+
+ // Process application
+ foreach ($data->application_name as $application_name)
+ for ($i = 0; $i < count($data->package_name); $i++) {
+ $sql = "INSERT INTO xprivacy_app (application_name, package_name, package_version, package_version_code) VALUES ";
+ $sql .= "('" . $db->real_escape_string($application_name) . "'";
+ $sql .= ",'" . $db->real_escape_string($data->package_name[$i]) . "'";
+ $sql .= ",'" . ($i < count($data->package_version_name) ? $db->real_escape_string($data->package_version_name[$i]) : '') . "'";
+ $sql .= "," . ($i < count($data->package_version_code) ? (int)$data->package_version_code[$i] : 0) . ")";
+ $sql .= " ON DUPLICATE KEY UPDATE";
+ $sql .= " modified=CURRENT_TIMESTAMP()";
+ if (!$db->query($sql)) {
+ log_error('submit: insert application: ' . $db->error . ' query=' . $sql, $my_email, $data);
+ $ok = false;
+ }
+ }
+
+ // Process restrictions
+ for ($i = 0; $i < count($data->package_name); $i++)
+ foreach ($data->settings as $restriction) {
+ // Fixes
+ if (empty($restriction->method))
+ $restriction->method = '';
+ if (empty($restriction->allowed))
+ $restriction->allowed = 0;
+
+ $sql = "INSERT INTO xprivacy (android_id_md5, android_sdk, xprivacy_version,";
+ $sql .= " package_name, package_version, package_version_code,";
+ $sql .= " restriction, method, restricted, allowed, used) VALUES ";
+ $sql .= "('" . $db->real_escape_string($data->android_id) . "'";
+ $sql .= "," . $db->real_escape_string($data->android_sdk) . "";
+ $sql .= "," . (empty($data->xprivacy_version) ? 'NULL' : (int)$data->xprivacy_version) . "";
+ $sql .= ",'" . $db->real_escape_string($data->package_name[$i]) . "'";
+ $sql .= ",'" . ($i < count($data->package_version_name) ? $db->real_escape_string($data->package_version_name[$i]) : '') . "'";
+ $sql .= "," . ($i < count($data->package_version_code) ? (int)$data->package_version_code[$i] : 0);
+ $sql .= ",'" . $db->real_escape_string($restriction->restriction) . "'";
+ $sql .= ",'" . $db->real_escape_string($restriction->method) . "'";
+ $sql .= "," . ($restriction->restricted ? 1 : 0);
+ $sql .= "," . ((int)$restriction->allowed);
+ $sql .= "," . ((int)$restriction->used) . ")";
+ $sql .= " ON DUPLICATE KEY UPDATE";
+ $sql .= " xprivacy_version=VALUES(xprivacy_version)";
+ $sql .= ", restricted=VALUES(restricted)";
+ $sql .= ", allowed=VALUES(allowed)";
+ $sql .= ", used=VALUES(used)";
+ $sql .= ", modified=CURRENT_TIMESTAMP()";
+ $sql .= ", updates=updates+1";
+ if (!$db->query($sql)) {
+ log_error('submit: insert restrictions: error=' . $db->error . ' query=' . $sql, $my_email, $data);
+ $ok = false;
+ }
+ }
+
+ // Send reponse
+ echo json_encode(array('ok' => $ok, 'errno' => ($ok ? 0 : 205), 'error' => ($ok ? '' : 'Error storing restrictions')));
+ exit();
+ }
+
+ // Fetch settings
+ else if (!empty($action) && $action == 'fetch') {
+ header('Content-Type: application/json');
+
+ // Check credentials
+ $signature = '';
+ if (openssl_sign($data->email, $signature, $private_key, OPENSSL_ALGO_SHA1))
+ $signature = bin2hex($signature);
+
+ if (empty($signature) || $signature != $data->signature) {
+ //log_error('fetch: not authorized', $my_email, $data);
+ echo json_encode(array('ok' => false, 'errno' => 301, 'error' => 'Not authorized'));
+ exit();
+ }
+
+ // Check expiry
+ $needle = '@faircode.eu';
+ if (substr($data->email, -strlen($needle)) === $needle) {
+ $timestamp = explode('.', $data->email)[0];
+ if ($timestamp < strtotime('2024-1-1')) {
+ echo json_encode(array('ok' => false, 'errno' => 301, 'error' => 'Permanent license required'));
+ exit();
+ }
+ if ($timestamp < time()) {
+ echo json_encode(array('ok' => false, 'errno' => 301, 'error' => 'License expired'));
+ exit();
+ }
+ }
+
+ // Validate
+ if (empty($data->package_name)) {
+ //log_error('fetch: package name missing', $my_email, $data);
+ echo json_encode(array('ok' => false, 'errno' => 303, 'error' => 'Package name missing'));
+ exit();
+ }
+
+ // Fixes
+ if (!is_array($data->package_name))
+ $data->package_name = array($data->package_name);
+
+ // Validate
+ if (count($data->package_name) > $max_packages) {
+ log_error('fetch: too many packages count=' . count($data->package_name) . '/' . $max_packages, $my_email, $data);
+ echo json_encode(array('ok' => false, 'errno' => 304, 'error' => 'Too many packages for application'));
+ exit();
+ }
+
+ // Get confidence interval
+ $max_ci = (empty($data->confidence) ? $max_confidence : $data->confidence / 100);
+
+ // Get requested package names
+ $package_names = '';
+ foreach ($data->package_name as $package_name) {
+ if (!empty($package_names))
+ $package_names .= ', ';
+ $package_names .= "'" . $db->real_escape_string($package_name) . "'";
+ }
+
+ // Get restrictions
+ $settings = Array();
+ $empty = ($data->xprivacy_version >= 240);
+
+ $sql = "SELECT restriction, method";
+ $sql .= ", SUM(CASE WHEN restricted = 1 THEN 1 ELSE 0 END) AS restricted";
+ $sql .= ", SUM(CASE WHEN restricted != 1 THEN 1 ELSE 0 END) AS not_restricted";
+ $sql .= ", SUM(CASE WHEN allowed > 0 THEN 1 ELSE 0 END) AS allowed";
+ $sql .= ", SUM(CASE WHEN allowed <= 0 THEN 1 ELSE 0 END) AS not_allowed";
+ $sql .= " FROM xprivacy";
+ $sql .= " WHERE package_name IN (" . $package_names . ")";
+ $sql .= " GROUP BY restriction, method";
+ $sql .= " ORDER BY restriction ASC, method ASC";
+ $result = $db->query($sql);
+ if ($result) {
+ while (($row = $result->fetch_object())) {
+ $ci = confidence($row->restricted, $row->not_restricted);
+ $diff = $row->restricted / ($row->restricted + $row->not_restricted);
+ $restrict = ($ci < $max_ci && $diff > $min_diff && $row->allowed <= $row->not_allowed);
+ if ($restrict)
+ $empty = false;
+
+ $entry = Array();
+ $entry['restriction'] = $row->restriction;
+ if (!empty($row->method))
+ $entry['method'] = $row->method;
+ $entry['restricted'] = ($restrict ? 1 : 0);
+ $entry['not_restricted'] = 0; // backward compatibility
+ $settings[] = (object) $entry;
+ }
+ $result->close();
+ } else {
+ log_error('fetch: retrieve restrictions: ' . $db->error . ' query=' . $sql, $my_email, $data);
+ $ok = false;
+ }
+
+ // Send reponse
+ if ($ok && $empty)
+ echo json_encode(array('ok' => false, 'errno' => 305, 'error' => 'No restrictions available', 'settings' => $settings));
+ else
+ echo json_encode(array('ok' => $ok, 'errno' => ($ok ? 0 : 306), 'error' => ($ok ? '' : 'Error retrieving restrictions'), 'settings' => $settings));
+ exit();
+ }
+
+ // Update
+ else if (!empty($action) && $action == 'update') {
+ // Check credentials
+ $signature = '';
+ if (openssl_sign($data->email, $signature, $private_key, OPENSSL_ALGO_SHA1))
+ $signature = bin2hex($signature);
+
+ if (empty($signature) || $signature != $data->signature) {
+ header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
+ exit();
+ }
+
+ // Fixes
+ if (empty($data->android_id))
+ $data->android_id = '';
+ if (empty($data->xprivacy_version))
+ $data->xprivacy_version = 0;
+
+ // Throttling
+ if ($data->xprivacy_version >= 395) { // 2.99.29 (395) / 2.2.9 (397)
+ $sql = "SELECT COUNT(*) AS count FROM xprivacy_update";
+ $sql .= " WHERE android_id_md5 = '" . $db->real_escape_string($data->android_id) . "'";
+ $sql .= " AND time > '" . date('Y-m-d H:i:s', time() - 12 * 3600) . "'";
+ $sql .= " AND installed_version = '" . $db->real_escape_string($data->xprivacy_version_name) . "'";
+ $sql .= " AND installed_version <> current_version";
+ $result = $db->query($sql);
+ if ($result) {
+ if (($row = $result->fetch_object()))
+ if ($row->count >= 5) {
+ header($_SERVER['SERVER_PROTOCOL'] . ' 429 Too Many Requests');
+ exit();
+ }
+ }
+ else
+ log_error('update: error=' . $db->error . ' query=' . $sql, $my_email, $data);
+ }
+
+ // Release type
+ $folder = 'release';
+ if (!empty($data->test_versions) && $data->test_versions)
+ $folder = 'test';
+
+ // Find latest version
+ $latest = null;
+ $modified = null;
+ $files = glob($folder . '/XPrivacy_*.apk');
+ if ($files)
+ foreach ($files as $filename) {
+ $version = explode('_', basename($filename, '.apk'))[1];
+ if ($latest == null || version_compare($version, $latest) >= 0) {
+ $latest = $version;
+ $modified = filemtime($filename);
+ }
+ }
+
+ // Register check
+ $sql = "INSERT INTO xprivacy_update (android_id_md5, installed_version, test_versions, current_version)";
+ $sql .= " VALUES (";
+ $sql .= "'" . $db->real_escape_string($data->android_id) . "'";
+ $sql .= ", '" . $db->real_escape_string($data->xprivacy_version_name) . "'";
+ $sql .= ", " . (int)$data->test_versions;
+ $sql .= ", '" . $db->real_escape_string($latest) . "'";
+ $sql .= ")";
+ if (!$db->query($sql))
+ log_error('update: error=' . $db->error . ' query=' . $sql, $my_email, $data);
+
+ // Check if newer
+ if ($latest == null || version_compare($latest, $data->xprivacy_version_name) <= 0)
+ header($_SERVER['SERVER_PROTOCOL'] . ' 204 No Content');
+ else {
+ // Send latest
+ $apk = $folder . '/XPrivacy_' . $latest . '.apk';
+ header('Content-Type: application/octet-stream');
+ header('Content-Description: File Transfer');
+ header('Content-Disposition: attachment; filename=' . basename($apk));
+ header('Expires: 0');
+ header('Cache-Control: must-revalidate');
+ header('Pragma: public');
+ header('Content-Length: ' . filesize($apk));
+ readfile($apk);
+ }
+ exit();
+ }
+
+ else {
+ log_error('json: unknown action', $my_email, $data);
+ echo json_encode(array('ok' => false, 'errno' => 104, 'error' => 'Unknown action: ' . $action));
+ exit();
+ }
+
+ // Close database
+ $db->close();
+
+ // Failsafe
+ exit();
+ }
+?>
+
+
+
+ XPrivacy
+
+
+
+
+
+
+
+
+
+
+
+
+connect_errno) {
+ log_error('web: database connect: ' . $db->connect_error, $my_email);
+ echo '
Error connecting to database ';
+ exit();
+ }
+
+ // Select character set
+ $db->query("SET NAMES 'utf8'");
+?>
+
+
+
+
+
+';
+ foreach (range('A', 'Z') as $alpha) {
+ echo '
' . $alpha . ' ';
+ }
+ echo '
other ';
+ echo '';
+ }
+ else {
+?>
+
+
Rows marked with a grey background will be restricted when fetched;
+ bold text means data was used
+real_escape_string($package_name) . "'";
+ $sql .= " ORDER BY package_version";
+ $result = $db->query($sql);
+ if ($result) {
+ echo '
';
+ while (($row = $result->fetch_object())) {
+ echo '';
+ echo $row->package_version . ' ';
+ if (version_compare($row->package_version, $last_version, '>'))
+ $last_version = $row->package_version;
+ }
+ echo '
';
+ $result->close();
+ }
+
+ if (empty($package_version))
+ $package_version = $last_version;
+ }
+?>
+
+
+
+
+ Application
+ Package
+
+ All versions deny/allow *
+ Version deny/allow
+ Exceptions (yes/no)
+ CI95 ±% **
+ Used
+ Restriction
+ Method
+ Last update (UTC)
+ Updates
+
+
+
+
+real_escape_string($letter) . "%'";
+ $sql .= " ORDER BY application_name, package_name";
+ $result = $db->query($sql);
+ if ($result) {
+ while (($row = $result->fetch_object())) {
+ $count++;
+ $name = (empty($row->application_name) ? '---' : $row->application_name);
+ echo '';
+
+ echo '';
+ echo htmlentities($name, ENT_COMPAT, 'UTF-8') . ' ';
+
+ echo '' . htmlentities($row->package_name, ENT_COMPAT, 'UTF-8') . ' ';
+ echo ' ' . PHP_EOL;
+ }
+ $result->close();
+ }
+ else
+ log_error('web: query application list: ' . $db->error . ' query=' . $sql, $my_email);
+ } else {
+ // Display application details
+ $sql = "SELECT restriction, method";
+ $sql .= ", SUM(CASE WHEN restricted = 1 THEN 1 ELSE 0 END) AS restricted";
+ $sql .= ", SUM(CASE WHEN restricted != 1 THEN 1 ELSE 0 END) AS not_restricted";
+ $sql .= ", SUM(CASE WHEN allowed > 0 THEN 1 ELSE 0 END) AS allowed";
+ $sql .= ", SUM(CASE WHEN allowed <= 0 THEN 1 ELSE 0 END) AS not_allowed";
+ $sql .= ", SUM(CASE WHEN restricted = 1 AND package_version = '" . $db->real_escape_string($package_version) . "' THEN 1 ELSE 0 END) AS restricted_package";
+ $sql .= ", SUM(CASE WHEN restricted != 1 AND package_version = '" . $db->real_escape_string($package_version) . "' THEN 1 ELSE 0 END) AS not_restricted_package";
+ $sql .= ", SUM(CASE WHEN allowed > 0 AND package_version = '" . $db->real_escape_string($package_version) . "' THEN 1 ELSE 0 END) AS allowed_package";
+ $sql .= ", SUM(CASE WHEN allowed <= 0 AND package_version = '" . $db->real_escape_string($package_version) . "' THEN 1 ELSE 0 END) AS not_allowed_package";
+ $sql .= ", MAX(used) AS used";
+ $sql .= ", MAX(modified) AS modified";
+ $sql .= ", SUM(updates) AS updates";
+ $sql .= " FROM xprivacy";
+ $sql .= " WHERE package_name = '" . $db->real_escape_string($package_name) . "'";
+ $sql .= " GROUP BY restriction, method";
+ $sql .= " ORDER BY restriction, method";
+ $result = $db->query($sql);
+ if ($result) {
+ while (($row = $result->fetch_object())) {
+ $count++;
+ $votes += $row->restricted + $row->not_restricted;
+
+ $ci = confidence($row->restricted, $row->not_restricted);
+ $diff = $row->restricted / ($row->restricted + $row->not_restricted);
+ $restrict = ($ci < $max_confidence && $diff > $min_diff && $row->allowed <= $row->not_allowed);
+
+ echo 'method))
+ echo ' class="details"';
+ echo '>';
+
+ echo '';
+ echo ($row->restricted < $row->not_restricted) ? '' . $row->restricted . ' ' : $row->restricted;
+ echo ' / ';
+ echo ($row->restricted > $row->not_restricted) ? '' . $row->not_restricted . ' ' : $row->not_restricted;
+ echo ' ' . number_format($diff * 100, 0) . '% ';
+ echo ' ';
+
+ echo '';
+ echo $row->restricted_package . ' / ' . $row->not_restricted_package;
+ echo ' ';
+
+ echo '';
+ echo ($row->allowed . ' / ' . $row->not_allowed);
+ echo ' ';
+
+ echo '';
+ echo number_format($ci * 100, 1);
+ echo ' ';
+
+ echo '' . ($row->used ? 'Yes' : '') . ' ';
+
+ echo '' . ($row->method ? '' :
+ '' .
+ htmlentities($row->restriction, ENT_COMPAT, 'UTF-8') . ' ') . ' ';
+
+ echo '' . htmlentities($row->method, ENT_COMPAT, 'UTF-8') . ' ';
+
+ echo '' . $row->modified . ' ';
+ echo '' . ($row->updates > 1 ? $row->updates : '-'). ' ';
+ echo ' ' . PHP_EOL;
+ }
+ $result->close();
+ }
+ else
+ log_error('web: query application details: ' . $db->error . ' query=' . $sql, $my_email);
+ }
+?>
+
+
+
+
+ * More than % of the votes is required
+ ** Calculated using a
+ Agresti-Coull interval of 95%;
+ values below % are considered reliable.
+
+
+
+
+
+
+
+
Privacy policy
+
I will not, under any circumstances whatsoever, give out or sell your information to anyone, unless required by law.
+
Copyright © 2013– by Marcel Bokhorst
+
+close();
+?>
+
+
+
+
+
+
+
diff --git a/src/XPrivacy-master/XPrivacy-master/server/xprivacy.sql b/src/XPrivacy-master/XPrivacy-master/server/xprivacy.sql
new file mode 100644
index 0000000..7efef39
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/server/xprivacy.sql
@@ -0,0 +1,119 @@
+-- phpMyAdmin SQL Dump
+-- version 4.2.0
+-- http://www.phpmyadmin.net
+--
+-- Host: localhost
+-- Generation Time: Aug 18, 2014 at 04:19 PM
+-- Server version: 5.6.19-1~dotdeb.1-log
+-- PHP Version: 5.5.15-1~dotdeb.1
+
+SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
+SET time_zone = "+00:00";
+
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8 */;
+
+--
+-- Database: `updates.faircode.eu`
+--
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `xprivacy`
+--
+
+CREATE TABLE IF NOT EXISTS `xprivacy` (
+`id` int(11) NOT NULL,
+ `android_id_md5` text NOT NULL,
+ `android_sdk` int(11) NOT NULL,
+ `xprivacy_version` int(11) DEFAULT NULL,
+ `package_name` text NOT NULL,
+ `package_version` text NOT NULL,
+ `package_version_code` int(11) NOT NULL,
+ `restriction` text NOT NULL,
+ `method` text NOT NULL,
+ `restricted` bit(1) NOT NULL,
+ `allowed` int(11) NOT NULL DEFAULT '0',
+ `used` bigint(13) NOT NULL,
+ `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `updates` int(11) NOT NULL DEFAULT '1'
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8302378 ;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `xprivacy_app`
+--
+
+CREATE TABLE IF NOT EXISTS `xprivacy_app` (
+`id` int(11) NOT NULL,
+ `application_name` text CHARACTER SET utf8 NOT NULL,
+ `package_name` text CHARACTER SET utf8 NOT NULL,
+ `package_version` text CHARACTER SET utf8 NOT NULL,
+ `package_version_code` int(11) NOT NULL,
+ `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=56302 ;
+
+-- --------------------------------------------------------
+
+--
+-- Table structure for table `xprivacy_update`
+--
+
+CREATE TABLE IF NOT EXISTS `xprivacy_update` (
+`id` int(11) NOT NULL,
+ `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `android_id_md5` text CHARACTER SET utf8,
+ `installed_version` text CHARACTER SET utf8 NOT NULL,
+ `test_versions` int(11) NOT NULL,
+ `current_version` text CHARACTER SET utf8 NOT NULL
+) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1705 ;
+
+--
+-- Indexes for dumped tables
+--
+
+--
+-- Indexes for table `xprivacy`
+--
+ALTER TABLE `xprivacy`
+ ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `restriction` (`android_id_md5`(50),`android_sdk`,`package_name`(100),`package_version`(50),`package_version_code`,`restriction`(20),`method`(70)), ADD KEY `package` (`package_name`(100));
+
+--
+-- Indexes for table `xprivacy_app`
+--
+ALTER TABLE `xprivacy_app`
+ ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `application` (`application_name`(100),`package_name`(100),`package_version`(50),`package_version_code`);
+
+--
+-- Indexes for table `xprivacy_update`
+--
+ALTER TABLE `xprivacy_update`
+ ADD PRIMARY KEY (`id`), ADD KEY `android_id_time` (`android_id_md5`(50),`time`);
+
+--
+-- AUTO_INCREMENT for dumped tables
+--
+
+--
+-- AUTO_INCREMENT for table `xprivacy`
+--
+ALTER TABLE `xprivacy`
+MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8302378;
+--
+-- AUTO_INCREMENT for table `xprivacy_app`
+--
+ALTER TABLE `xprivacy_app`
+MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=56302;
+--
+-- AUTO_INCREMENT for table `xprivacy_update`
+--
+ALTER TABLE `xprivacy_update`
+MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1705;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityApp.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityApp.java
new file mode 100644
index 0000000..16f48dc
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityApp.java
@@ -0,0 +1,1712 @@
+package biz.bokhorst.xprivacy;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.annotation.SuppressLint;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningAppProcessInfo;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.NotificationManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.database.Cursor;
+import android.graphics.Color;
+import android.graphics.Typeface;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Process;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
+import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.support.v4.app.NavUtils;
+import android.support.v4.app.TaskStackBuilder;
+import android.support.v7.widget.SwitchCompat;
+import android.support.v7.widget.Toolbar;
+import android.text.Html;
+import android.text.TextUtils;
+import android.text.format.DateUtils;
+import android.text.method.LinkMovementMethod;
+import android.view.ContextMenu;
+import android.view.ContextMenu.ContextMenuInfo;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.Window;
+import android.widget.BaseExpandableListAdapter;
+import android.widget.Button;
+import android.widget.CompoundButton;
+import android.widget.ExpandableListView;
+import android.widget.ExpandableListView.OnGroupExpandListener;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.ScrollView;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class ActivityApp extends ActivityBase {
+ private ApplicationInfoEx mAppInfo = null;
+ private SwitchCompat swEnabled = null;
+ private RestrictionAdapter mPrivacyListAdapter = null;
+
+ public static final String cUid = "Uid";
+ public static final String cRestrictionName = "RestrictionName";
+ public static final String cMethodName = "MethodName";
+ public static final String cAction = "Action";
+ public static final int cActionClear = 1;
+ public static final int cActionSettings = 2;
+ public static final int cActionRefresh = 3;
+
+ private static final int MENU_LAUNCH = 1;
+ private static final int MENU_SETTINGS = 2;
+ private static final int MENU_KILL = 3;
+ private static final int MENU_STORE = 4;
+
+ private static ExecutorService mExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),
+ new PriorityThreadFactory());
+
+ private static class PriorityThreadFactory implements ThreadFactory {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.NORM_PRIORITY);
+ return t;
+ }
+ }
+
+ private boolean mPackageChangeReceiverRegistered = false;
+
+ private BroadcastReceiver mPackageChangeReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ int uid = intent.getIntExtra(Intent.EXTRA_UID, 0);
+ if (mAppInfo.getUid() == uid)
+ finish();
+ }
+ };
+
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final int userId = Util.getUserId(Process.myUid());
+
+ // Check privacy service client
+ if (!PrivacyService.checkClient())
+ return;
+
+ // Set layout
+ setContentView(R.layout.restrictionlist);
+ setSupportActionBar((Toolbar) findViewById(R.id.widgetToolbar));
+
+ // Annotate
+ Meta.annotate(this.getResources());
+
+ // Get arguments
+ Bundle extras = getIntent().getExtras();
+ if (extras == null) {
+ finish();
+ return;
+ }
+
+ int uid = extras.getInt(cUid);
+ String restrictionName = (extras.containsKey(cRestrictionName) ? extras.getString(cRestrictionName) : null);
+ String methodName = (extras.containsKey(cMethodName) ? extras.getString(cMethodName) : null);
+
+ // Get app info
+ mAppInfo = new ApplicationInfoEx(this, uid);
+ if (mAppInfo.getPackageName().size() == 0) {
+ finish();
+ return;
+ }
+
+ // Set sub title
+ getSupportActionBar().setSubtitle(TextUtils.join(", ", mAppInfo.getApplicationName()));
+
+ // Handle info click
+ ImageView imgInfo = (ImageView) findViewById(R.id.imgInfo);
+ imgInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ // Packages can be selected on the web site
+ Util.viewUri(ActivityApp.this, Uri.parse(String.format(ActivityShare.getBaseURL() + "?package_name=%s",
+ mAppInfo.getPackageName().get(0))));
+ }
+ });
+
+ // Display app name
+ TextView tvAppName = (TextView) findViewById(R.id.tvApp);
+ tvAppName.setText(mAppInfo.toString());
+
+ // Background color
+ if (mAppInfo.isSystem()) {
+ LinearLayout llInfo = (LinearLayout) findViewById(R.id.llInfo);
+ llInfo.setBackgroundColor(getResources().getColor(getThemed(R.attr.color_dangerous)));
+ }
+
+ // Display app icon
+ final ImageView imgIcon = (ImageView) findViewById(R.id.imgIcon);
+ imgIcon.setImageDrawable(mAppInfo.getIcon(this));
+
+ // Handle icon click
+ imgIcon.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ openContextMenu(imgIcon);
+ }
+ });
+
+ // Display on-demand state
+ final ImageView imgCbOnDemand = (ImageView) findViewById(R.id.imgCbOnDemand);
+ boolean isApp = PrivacyManager.isApplication(mAppInfo.getUid());
+ boolean odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem, false);
+ boolean gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ if ((isApp || odSystem) && gondemand) {
+ boolean ondemand = PrivacyManager
+ .getSettingBool(-mAppInfo.getUid(), PrivacyManager.cSettingOnDemand, false);
+ imgCbOnDemand.setImageBitmap(ondemand ? getOnDemandCheckBox() : getOffCheckBox());
+
+ imgCbOnDemand.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ boolean ondemand = !PrivacyManager.getSettingBool(-mAppInfo.getUid(),
+ PrivacyManager.cSettingOnDemand, false);
+ PrivacyManager.setSetting(mAppInfo.getUid(), PrivacyManager.cSettingOnDemand,
+ Boolean.toString(ondemand));
+ imgCbOnDemand.setImageBitmap(ondemand ? getOnDemandCheckBox() : getOffCheckBox());
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ }
+ });
+ } else
+ imgCbOnDemand.setVisibility(View.GONE);
+
+ // Display restriction state
+ swEnabled = (SwitchCompat) findViewById(R.id.swEnable);
+ swEnabled.setChecked(PrivacyManager.getSettingBool(mAppInfo.getUid(), PrivacyManager.cSettingRestricted, true));
+ swEnabled.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ PrivacyManager.setSetting(mAppInfo.getUid(), PrivacyManager.cSettingRestricted,
+ Boolean.toString(isChecked));
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ imgCbOnDemand.setEnabled(isChecked);
+ }
+ });
+ imgCbOnDemand.setEnabled(swEnabled.isChecked());
+
+ // Add context menu to icon
+ registerForContextMenu(imgIcon);
+
+ // Check if internet access
+ if (!mAppInfo.hasInternet(this)) {
+ ImageView imgInternet = (ImageView) findViewById(R.id.imgInternet);
+ imgInternet.setVisibility(View.INVISIBLE);
+ }
+
+ // Check if frozen
+ if (!mAppInfo.isFrozen(this)) {
+ ImageView imgFrozen = (ImageView) findViewById(R.id.imgFrozen);
+ imgFrozen.setVisibility(View.INVISIBLE);
+ }
+
+ // Display version
+ TextView tvVersion = (TextView) findViewById(R.id.tvVersion);
+ tvVersion.setText(TextUtils.join(", ", mAppInfo.getPackageVersionName(this)));
+
+ // Display package name
+ TextView tvPackageName = (TextView) findViewById(R.id.tvPackageName);
+ tvPackageName.setText(TextUtils.join(", ", mAppInfo.getPackageName()));
+
+ // Fill privacy expandable list view adapter
+ final ExpandableListView elvRestriction = (ExpandableListView) findViewById(R.id.elvRestriction);
+ elvRestriction.setGroupIndicator(null);
+ mPrivacyListAdapter = new RestrictionAdapter(this, R.layout.restrictionentry, mAppInfo, restrictionName,
+ methodName);
+ elvRestriction.setAdapter(mPrivacyListAdapter);
+
+ // Listen for group expand
+ elvRestriction.setOnGroupExpandListener(new OnGroupExpandListener() {
+ @Override
+ public void onGroupExpand(final int groupPosition) {
+ if (!PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingMethodExpert, false)) {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityApp.this);
+ alertDialogBuilder.setTitle(R.string.app_name);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setMessage(R.string.msg_method_expert);
+ alertDialogBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingMethodExpert,
+ Boolean.toString(true));
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ }
+ });
+ alertDialogBuilder.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ elvRestriction.collapseGroup(groupPosition);
+ }
+ });
+ alertDialogBuilder.setCancelable(false);
+
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+
+ }
+ }
+ });
+
+ // Go to method
+ if (restrictionName != null) {
+ int groupPosition = new ArrayList(PrivacyManager.getRestrictions(this).values())
+ .indexOf(restrictionName);
+ elvRestriction.setSelectedGroup(groupPosition);
+ elvRestriction.expandGroup(groupPosition);
+ if (methodName != null) {
+ Version version = new Version(Util.getSelfVersionName(this));
+ int childPosition = PrivacyManager.getHooks(restrictionName, version).indexOf(
+ new Hook(restrictionName, methodName));
+ elvRestriction.setSelectedChild(groupPosition, childPosition, true);
+ }
+ }
+
+ // Listen for package add/remove
+ IntentFilter iff = new IntentFilter();
+ iff.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ iff.addDataScheme("package");
+ registerReceiver(mPackageChangeReceiver, iff);
+ mPackageChangeReceiverRegistered = true;
+
+ // Up navigation
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+
+ // Tutorial
+ if (!PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingTutorialDetails, false)) {
+ ((ScrollView) findViewById(R.id.svTutorialHeader)).setVisibility(View.VISIBLE);
+ ((ScrollView) findViewById(R.id.svTutorialDetails)).setVisibility(View.VISIBLE);
+ }
+ View.OnClickListener listener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ ViewParent parent = view.getParent();
+ while (!parent.getClass().equals(ScrollView.class))
+ parent = parent.getParent();
+ ((View) parent).setVisibility(View.GONE);
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingTutorialDetails, Boolean.TRUE.toString());
+ }
+ };
+ ((Button) findViewById(R.id.btnTutorialHeader)).setOnClickListener(listener);
+ ((Button) findViewById(R.id.btnTutorialDetails)).setOnClickListener(listener);
+
+ // Process actions
+ if (extras.containsKey(cAction)) {
+ NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(mAppInfo.getUid());
+ if (extras.getInt(cAction) == cActionClear)
+ optionClear();
+ else if (extras.getInt(cAction) == cActionSettings)
+ optionSettings();
+ }
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ Bundle extras = intent.getExtras();
+ if (extras != null && extras.containsKey(cAction) && extras.getInt(cAction) == cActionRefresh) {
+ // Update on demand check box
+ ImageView imgCbOnDemand = (ImageView) findViewById(R.id.imgCbOnDemand);
+ boolean ondemand = PrivacyManager
+ .getSettingBool(-mAppInfo.getUid(), PrivacyManager.cSettingOnDemand, false);
+ imgCbOnDemand.setImageBitmap(ondemand ? getOnDemandCheckBox() : getOffCheckBox());
+
+ // Update restriction list
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ } else {
+ setIntent(intent);
+ recreate();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Update switch
+ if (swEnabled != null)
+ swEnabled.setChecked(PrivacyManager.getSettingBool(mAppInfo.getUid(), PrivacyManager.cSettingRestricted,
+ true));
+
+ // Update on demand check box
+ int userId = Util.getUserId(Process.myUid());
+ ImageView imgCbOnDemand = (ImageView) findViewById(R.id.imgCbOnDemand);
+ boolean isApp = PrivacyManager.isApplication(mAppInfo.getUid());
+ boolean odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem, false);
+ boolean gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ if ((isApp || odSystem) && gondemand) {
+ boolean ondemand = PrivacyManager
+ .getSettingBool(-mAppInfo.getUid(), PrivacyManager.cSettingOnDemand, false);
+ imgCbOnDemand.setImageBitmap(ondemand ? getOnDemandCheckBox() : getOffCheckBox());
+ }
+
+ // Update list
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+ if (mPackageChangeReceiverRegistered) {
+ unregisterReceiver(mPackageChangeReceiver);
+ mPackageChangeReceiverRegistered = false;
+ }
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(final Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ if (inflater != null && PrivacyService.checkClient()) {
+ inflater.inflate(R.menu.app, menu);
+
+ // Add all contact groups
+ menu.findItem(R.id.menu_contacts).getSubMenu()
+ .add(-1, R.id.menu_contacts, Menu.NONE, getString(R.string.menu_all));
+
+ // Add other contact groups in the background
+ new AsyncTask() {
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ try {
+ String where = ContactsContract.Groups.GROUP_VISIBLE + " = 1";
+ where += " AND " + ContactsContract.Groups.SUMMARY_COUNT + " > 0";
+ Cursor cursor = getContentResolver().query(
+ ContactsContract.Groups.CONTENT_SUMMARY_URI,
+ new String[] { ContactsContract.Groups._ID, ContactsContract.Groups.TITLE,
+ ContactsContract.Groups.ACCOUNT_NAME, ContactsContract.Groups.SUMMARY_COUNT },
+ where, null,
+ ContactsContract.Groups.TITLE + ", " + ContactsContract.Groups.ACCOUNT_NAME);
+
+ if (cursor != null)
+ try {
+ while (cursor.moveToNext()) {
+ int id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Groups._ID));
+ String title = cursor.getString(cursor
+ .getColumnIndex(ContactsContract.Groups.TITLE));
+ String account = cursor.getString(cursor
+ .getColumnIndex(ContactsContract.Groups.ACCOUNT_NAME));
+ menu.findItem(R.id.menu_contacts).getSubMenu()
+ .add(id, R.id.menu_contacts, Menu.NONE, title + "/" + account);
+ }
+ } finally {
+ cursor.close();
+ }
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+
+ return null;
+ }
+ }.executeOnExecutor(mExecutor);
+
+ return true;
+ } else
+ return false;
+ }
+
+ // Application context menu
+
+ @Override
+ public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
+ super.onCreateContextMenu(menu, v, menuInfo);
+
+ // Check if running
+ boolean running = false;
+ ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
+ for (RunningAppProcessInfo info : activityManager.getRunningAppProcesses())
+ if (info.uid == mAppInfo.getUid())
+ running = true;
+
+ PackageManager pm = getPackageManager();
+ List listPackageNames = mAppInfo.getPackageName();
+ List listApplicationName = mAppInfo.getApplicationName();
+ for (int i = 0; i < listPackageNames.size(); i++) {
+ Menu appMenu = (listPackageNames.size() == 1) ? menu : menu.addSubMenu(i, Menu.NONE, Menu.NONE,
+ listApplicationName.get(i));
+
+ // Launch
+ MenuItem launch = appMenu.add(i, MENU_LAUNCH, Menu.NONE, getString(R.string.menu_app_launch));
+ if (pm.getLaunchIntentForPackage(listPackageNames.get(i)) == null)
+ launch.setEnabled(false);
+
+ // Settings
+ appMenu.add(i, MENU_SETTINGS, Menu.NONE, getString(R.string.menu_app_settings));
+
+ // Kill
+ MenuItem kill = appMenu.add(i, MENU_KILL, Menu.NONE, getString(R.string.menu_app_kill));
+ kill.setEnabled(running && PrivacyManager.isApplication(mAppInfo.getUid()));
+
+ // Play store
+ MenuItem store = appMenu.add(i, MENU_STORE, Menu.NONE, getString(R.string.menu_app_store));
+ if (!Util.hasMarketLink(this, listPackageNames.get(i)))
+ store.setEnabled(false);
+ }
+ }
+
+ @Override
+ public boolean onContextItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case MENU_LAUNCH:
+ optionLaunch(item.getGroupId());
+ return true;
+ case MENU_SETTINGS:
+ optionAppSettings(item.getGroupId());
+ return true;
+ case MENU_KILL:
+ optionKill(item.getGroupId());
+ return true;
+ case MENU_STORE:
+ optionStore(item.getGroupId());
+ return true;
+ default:
+ return super.onContextItemSelected(item);
+ }
+ }
+
+ private void optionLaunch(int which) {
+ Intent intentLaunch = getPackageManager().getLaunchIntentForPackage(mAppInfo.getPackageName().get(which));
+ startActivity(intentLaunch);
+ }
+
+ private void optionAppSettings(int which) {
+ Intent intentSettings = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
+ Uri.parse("package:" + mAppInfo.getPackageName().get(which)));
+ startActivity(intentSettings);
+ }
+
+ private void optionKill(final int which) {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityApp.this);
+ alertDialogBuilder.setTitle(R.string.menu_app_kill);
+ alertDialogBuilder.setMessage(R.string.msg_sure);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int _which) {
+ XApplication.manage(ActivityApp.this, mAppInfo.getPackageName().get(which),
+ XApplication.cActionKillProcess);
+ Toast.makeText(ActivityApp.this, getString(R.string.msg_done), Toast.LENGTH_LONG).show();
+ }
+ });
+ alertDialogBuilder.setNegativeButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ private void optionStore(int which) {
+ Util.viewUri(this, Uri.parse("market://details?id=" + mAppInfo.getPackageName().get(which)));
+ }
+
+ // Options
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ boolean accountsRestricted = PrivacyManager.getRestrictionEx(mAppInfo.getUid(), PrivacyManager.cAccounts, null).restricted;
+ boolean appsRestricted = PrivacyManager.getRestrictionEx(mAppInfo.getUid(), PrivacyManager.cSystem, null).restricted;
+ boolean contactsRestricted = PrivacyManager.getRestrictionEx(mAppInfo.getUid(), PrivacyManager.cContacts, null).restricted;
+
+ menu.findItem(R.id.menu_accounts).setEnabled(accountsRestricted);
+ menu.findItem(R.id.menu_applications).setEnabled(appsRestricted);
+ menu.findItem(R.id.menu_contacts).setEnabled(contactsRestricted);
+
+ boolean mounted = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
+ menu.findItem(R.id.menu_export).setEnabled(mounted);
+ menu.findItem(R.id.menu_import).setEnabled(mounted);
+
+ menu.findItem(R.id.menu_submit).setEnabled(Util.hasValidFingerPrint(this));
+
+ menu.findItem(R.id.menu_dump).setVisible(Util.isDebuggable(this));
+
+ return super.onPrepareOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ Intent upIntent = NavUtils.getParentActivityIntent(this);
+ if (upIntent != null)
+ if (NavUtils.shouldUpRecreateTask(this, upIntent))
+ TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
+ else
+ NavUtils.navigateUpTo(this, upIntent);
+ return true;
+ case R.id.menu_usage:
+ optionUsage();
+ return true;
+ case R.id.menu_accounts:
+ optionAccounts();
+ return true;
+ case R.id.menu_applications:
+ optionApplications();
+ return true;
+ case R.id.menu_contacts:
+ if (item.getGroupId() != 0) {
+ optionContacts(item.getGroupId());
+ return true;
+ } else
+ return false;
+ case R.id.menu_whitelists:
+ optionWhitelists(null);
+ return true;
+ case R.id.menu_apply:
+ optionTemplate();
+ return true;
+ case R.id.menu_clear:
+ optionClear();
+ return true;
+ case R.id.menu_export:
+ optionExport();
+ return true;
+ case R.id.menu_import:
+ optionImport();
+ return true;
+ case R.id.menu_submit:
+ optionSubmit();
+ return true;
+ case R.id.menu_fetch:
+ optionFetch();
+ return true;
+ case R.id.menu_settings:
+ optionSettings();
+ return true;
+ case R.id.menu_dump:
+ optionDump();
+ return true;
+ case R.id.menu_legend:
+ optionLegend();
+ return true;
+ case R.id.menu_tutorial:
+ optionTutorial();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ private void optionUsage() {
+ Intent intent = new Intent(this, ActivityUsage.class);
+ intent.putExtra(ActivityUsage.cUid, mAppInfo.getUid());
+ startActivity(intent);
+ }
+
+ private void optionAccounts() {
+ AccountsTask accountsTask = new AccountsTask();
+ accountsTask.executeOnExecutor(mExecutor, (Object) null);
+ }
+
+ private void optionApplications() {
+ if (Util.hasProLicense(this) == null) {
+ // Redirect to pro page
+ Util.viewUri(this, ActivityMain.cProUri);
+ } else {
+ ApplicationsTask appsTask = new ApplicationsTask();
+ appsTask.executeOnExecutor(mExecutor, (Object) null);
+ }
+ }
+
+ private void optionContacts(int groupId) {
+ if (Util.hasProLicense(this) == null) {
+ // Redirect to pro page
+ Util.viewUri(this, ActivityMain.cProUri);
+ } else {
+ ContactsTask contactsTask = new ContactsTask();
+ contactsTask.executeOnExecutor(mExecutor, groupId);
+ }
+ }
+
+ private void optionWhitelists(String type) {
+ if (Util.hasProLicense(this) == null) {
+ // Redirect to pro page
+ Util.viewUri(this, ActivityMain.cProUri);
+ } else {
+ WhitelistTask whitelistsTask = new WhitelistTask(mAppInfo.getUid(), type, this);
+ whitelistsTask.executeOnExecutor(mExecutor, (Object) null);
+ }
+ }
+
+ private void optionTemplate() {
+ Intent intent = new Intent(ActivityShare.ACTION_TOGGLE);
+ intent.putExtra(ActivityShare.cInteractive, true);
+ intent.putExtra(ActivityShare.cUidList, new int[] { mAppInfo.getUid() });
+ intent.putExtra(ActivityShare.cChoice, ActivityShare.CHOICE_TEMPLATE);
+ startActivity(intent);
+ }
+
+ private void optionClear() {
+ Intent intent = new Intent(ActivityShare.ACTION_TOGGLE);
+ intent.putExtra(ActivityShare.cInteractive, true);
+ intent.putExtra(ActivityShare.cUidList, new int[] { mAppInfo.getUid() });
+ intent.putExtra(ActivityShare.cChoice, ActivityShare.CHOICE_CLEAR);
+ startActivity(intent);
+ }
+
+ private void optionExport() {
+ Intent intent = new Intent(ActivityShare.ACTION_EXPORT);
+ intent.putExtra(ActivityShare.cUidList, new int[] { mAppInfo.getUid() });
+ intent.putExtra(ActivityShare.cInteractive, true);
+ startActivity(intent);
+ }
+
+ private void optionImport() {
+ Intent intent = new Intent(ActivityShare.ACTION_IMPORT);
+ intent.putExtra(ActivityShare.cUidList, new int[] { mAppInfo.getUid() });
+ intent.putExtra(ActivityShare.cInteractive, true);
+ startActivity(intent);
+ }
+
+ private void optionSubmit() {
+ if (ActivityShare.registerDevice(this)) {
+ Intent intent = new Intent("biz.bokhorst.xprivacy.action.SUBMIT");
+ intent.putExtra(ActivityShare.cUidList, new int[] { mAppInfo.getUid() });
+ intent.putExtra(ActivityShare.cInteractive, true);
+ startActivity(intent);
+ }
+ }
+
+ private void optionFetch() {
+ Intent intent = new Intent("biz.bokhorst.xprivacy.action.FETCH");
+ intent.putExtra(ActivityShare.cUidList, new int[] { mAppInfo.getUid() });
+ intent.putExtra(ActivityShare.cInteractive, true);
+ startActivity(intent);
+ }
+
+ private void optionSettings() {
+ Intent intent = new Intent(ActivityApp.this, ActivitySettings.class);
+ intent.putExtra(ActivitySettings.cUid, mAppInfo.getUid());
+ startActivity(intent);
+ }
+
+ private void optionDump() {
+ try {
+ PrivacyService.getClient().dump(mAppInfo.getUid());
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ }
+
+ private void optionLegend() {
+ // Show help
+ Dialog dialog = new Dialog(ActivityApp.this);
+ dialog.requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ dialog.setTitle(R.string.menu_legend);
+ dialog.setContentView(R.layout.legend);
+ dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, getThemed(R.attr.icon_launcher));
+
+ ((ImageView) dialog.findViewById(R.id.imgHelpHalf)).setImageBitmap(getHalfCheckBox());
+ ((ImageView) dialog.findViewById(R.id.imgHelpOnDemand)).setImageBitmap(getOnDemandCheckBox());
+
+ for (View child : Util.getViewsByTag((ViewGroup) dialog.findViewById(android.R.id.content), "main"))
+ child.setVisibility(View.GONE);
+
+ ((LinearLayout) dialog.findViewById(R.id.llUnsafe)).setVisibility(PrivacyManager.cVersion3 ? View.VISIBLE
+ : View.GONE);
+
+ dialog.setCancelable(true);
+ dialog.show();
+ }
+
+ private void optionTutorial() {
+ ((ScrollView) findViewById(R.id.svTutorialHeader)).setVisibility(View.VISIBLE);
+ ((ScrollView) findViewById(R.id.svTutorialDetails)).setVisibility(View.VISIBLE);
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingTutorialDetails, Boolean.FALSE.toString());
+ }
+
+ // Tasks
+
+ private class AccountsTask extends AsyncTask {
+ private List mListAccount;
+ private Account[] mAccounts;
+ private boolean[] mSelection;
+
+ @Override
+ protected Object doInBackground(Object... params) {
+ // Get accounts
+ mListAccount = new ArrayList();
+ AccountManager accountManager = AccountManager.get(ActivityApp.this);
+ mAccounts = accountManager.getAccounts();
+ mSelection = new boolean[mAccounts.length];
+ for (int i = 0; i < mAccounts.length; i++)
+ try {
+ mListAccount.add(String.format("%s (%s)", mAccounts[i].name, mAccounts[i].type));
+ String sha1 = Util.sha1(mAccounts[i].name + mAccounts[i].type);
+ mSelection[i] = PrivacyManager.getSettingBool(-mAppInfo.getUid(), Meta.cTypeAccount, sha1, false);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (!ActivityApp.this.isFinishing()) {
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityApp.this);
+ alertDialogBuilder.setTitle(R.string.menu_accounts);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setMultiChoiceItems(mListAccount.toArray(new CharSequence[0]), mSelection,
+ new DialogInterface.OnMultiChoiceClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) {
+ try {
+ Account account = mAccounts[whichButton];
+ String sha1 = Util.sha1(account.name + account.type);
+ PrivacyManager.setSetting(mAppInfo.getUid(), Meta.cTypeAccount, sha1,
+ Boolean.toString(isChecked));
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ Toast toast = Toast.makeText(ActivityApp.this, ex.toString(), Toast.LENGTH_LONG);
+ toast.show();
+ }
+ }
+ });
+ alertDialogBuilder.setPositiveButton(getString(R.string.msg_done),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ super.onPostExecute(result);
+ }
+ }
+
+ private class ApplicationsTask extends AsyncTask {
+ private CharSequence[] mApp;
+ private String[] mPackage;
+ private boolean[] mSelection;
+
+ @Override
+ protected Object doInBackground(Object... params) {
+ // Get applications
+ int count = 0;
+ Map> mapApp = new HashMap>();
+ for (ApplicationInfoEx appInfo : ApplicationInfoEx.getXApplicationList(ActivityApp.this, null))
+ for (int p = 0; p < appInfo.getPackageName().size(); p++) {
+ String appName = appInfo.getApplicationName().get(p);
+ List listPkg;
+ if (mapApp.containsKey(appName))
+ listPkg = mapApp.get(appName);
+ else {
+ listPkg = new ArrayList();
+ mapApp.put(appName, listPkg);
+ }
+ listPkg.add(appInfo.getPackageName().get(p));
+ count++;
+ }
+
+ // Sort applications
+ List listApp = new ArrayList(mapApp.keySet());
+ Collator collator = Collator.getInstance(Locale.getDefault());
+ Collections.sort(listApp, collator);
+
+ // Build selection arrays
+ int i = 0;
+ mApp = new CharSequence[count];
+ mPackage = new String[count];
+ mSelection = new boolean[count];
+ for (String appName : listApp) {
+ List listPkg = mapApp.get(appName);
+ Collections.sort(listPkg, collator);
+ for (String pkgName : listPkg) {
+ mApp[i] = (pkgName.equals(appName) ? appName : String.format("%s (%s)", appName, pkgName));
+ mPackage[i] = pkgName;
+ mSelection[i] = PrivacyManager.getSettingBool(-mAppInfo.getUid(), Meta.cTypeApplication, pkgName,
+ false);
+ i++;
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (!ActivityApp.this.isFinishing()) {
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityApp.this);
+ alertDialogBuilder.setTitle(R.string.menu_applications);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setMultiChoiceItems(mApp, mSelection,
+ new DialogInterface.OnMultiChoiceClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton, boolean isChecked) {
+ try {
+ PrivacyManager.setSetting(mAppInfo.getUid(), Meta.cTypeApplication,
+ mPackage[whichButton], Boolean.toString(isChecked));
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ Toast toast = Toast.makeText(ActivityApp.this, ex.toString(), Toast.LENGTH_LONG);
+ toast.show();
+ }
+ }
+ });
+ alertDialogBuilder.setPositiveButton(getString(R.string.msg_done),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ super.onPostExecute(result);
+ }
+ }
+
+ private class ContactsTask extends AsyncTask {
+ private List mListContact;
+ private long[] mIds;
+ private boolean[] mSelection;
+
+ @Override
+ protected Object doInBackground(Integer... params) {
+ // Map contacts
+ Map mapContact = new LinkedHashMap();
+ Cursor cursor;
+ if (params[0] < 0)
+ cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
+ new String[] { ContactsContract.Contacts._ID, Phone.DISPLAY_NAME }, null, null,
+ Phone.DISPLAY_NAME);
+ else
+ cursor = getContentResolver()
+ .query(ContactsContract.Data.CONTENT_URI,
+ new String[] { ContactsContract.Contacts._ID, Phone.DISPLAY_NAME,
+ GroupMembership.GROUP_ROW_ID }, GroupMembership.GROUP_ROW_ID + "= ?",
+ new String[] { Integer.toString(params[0]) }, Phone.DISPLAY_NAME);
+ if (cursor != null)
+ try {
+ while (cursor.moveToNext()) {
+ long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
+ String contact = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));
+ if (contact != null)
+ mapContact.put(id, contact);
+ }
+ } finally {
+ cursor.close();
+ }
+
+ // Build dialog data
+ mListContact = new ArrayList();
+ mIds = new long[mapContact.size() + 1];
+ mSelection = new boolean[mapContact.size() + 1];
+
+ mListContact.add("[" + getString(R.string.menu_all) + "]");
+ mIds[0] = -1;
+ mSelection[0] = false;
+
+ int i = 0;
+ for (Long id : mapContact.keySet()) {
+ mListContact.add(mapContact.get(id));
+ mIds[i + 1] = id;
+ mSelection[i++ + 1] = PrivacyManager.getSettingBool(-mAppInfo.getUid(), Meta.cTypeContact,
+ Long.toString(id), false);
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (!ActivityApp.this.isFinishing()) {
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityApp.this);
+ alertDialogBuilder.setTitle(R.string.menu_contacts);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setMultiChoiceItems(mListContact.toArray(new CharSequence[0]), mSelection,
+ new DialogInterface.OnMultiChoiceClickListener() {
+ public void onClick(final DialogInterface dialog, int whichButton, final boolean isChecked) {
+ // Contact
+ if (whichButton == 0) {
+ ((AlertDialog) dialog).getListView().setEnabled(false);
+ ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false);
+ ((AlertDialog) dialog).setCancelable(false);
+
+ new AsyncTask() {
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ for (int i = 1; i < mSelection.length; i++) {
+ mSelection[i] = isChecked;
+ PrivacyManager.setSetting(mAppInfo.getUid(), Meta.cTypeContact,
+ Long.toString(mIds[i]), Boolean.toString(mSelection[i]));
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ for (int i = 1; i < mSelection.length; i++)
+ ((AlertDialog) dialog).getListView().setItemChecked(i, mSelection[i]);
+
+ ((AlertDialog) dialog).getListView().setEnabled(true);
+ ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(
+ true);
+ ((AlertDialog) dialog).setCancelable(true);
+ }
+ }.executeOnExecutor(mExecutor);
+
+ } else
+ PrivacyManager.setSetting(mAppInfo.getUid(), Meta.cTypeContact,
+ Long.toString(mIds[whichButton]), Boolean.toString(isChecked));
+ }
+ });
+ alertDialogBuilder.setPositiveButton(getString(R.string.msg_done),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (mPrivacyListAdapter != null)
+ mPrivacyListAdapter.notifyDataSetChanged();
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ super.onPostExecute(result);
+ }
+ }
+
+ // Adapters
+
+ private class RestrictionAdapter extends BaseExpandableListAdapter {
+ private Context mContext;
+ private ApplicationInfoEx mAppInfo;
+ private String mSelectedRestrictionName;
+ private String mSelectedMethodName;
+ private List mListRestriction;
+ private HashMap> mHook;
+ private Version mVersion;
+ private LayoutInflater mInflater;
+
+ public RestrictionAdapter(Context context, int resource, ApplicationInfoEx appInfo,
+ String selectedRestrictionName, String selectedMethodName) {
+ mContext = context;
+ mAppInfo = appInfo;
+ mSelectedRestrictionName = selectedRestrictionName;
+ mSelectedMethodName = selectedMethodName;
+ mListRestriction = new ArrayList();
+ mHook = new LinkedHashMap>();
+ mVersion = new Version(Util.getSelfVersionName(context));
+ mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ int userId = Util.getUserId(Process.myUid());
+ boolean fUsed = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUsed, false);
+ boolean fPermission = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFPermission, false);
+
+ for (String rRestrictionName : PrivacyManager.getRestrictions(mContext).values()) {
+ boolean isUsed = (PrivacyManager.getUsage(mAppInfo.getUid(), rRestrictionName, null) > 0);
+ boolean hasPermission = PrivacyManager.hasPermission(mContext, mAppInfo, rRestrictionName, mVersion);
+ if (mSelectedRestrictionName != null
+ || ((fUsed ? isUsed : true) && (fPermission ? isUsed || hasPermission : true)))
+ mListRestriction.add(rRestrictionName);
+ }
+ }
+
+ @Override
+ public Object getGroup(int groupPosition) {
+ return mListRestriction.get(groupPosition);
+ }
+
+ @Override
+ public int getGroupCount() {
+ return mListRestriction.size();
+ }
+
+ @Override
+ public long getGroupId(int groupPosition) {
+ return groupPosition * 1000;
+ }
+
+ private class GroupViewHolder {
+ private View row;
+ private int position;
+ public ImageView imgIndicator;
+ public ImageView imgUsed;
+ public ImageView imgGranted;
+ public ImageView imgInfo;
+ public TextView tvName;
+ public ImageView imgWhitelist;
+ public ImageView imgCbRestricted;
+ public ProgressBar pbRunning;
+ public ImageView imgCbAsk;
+ public LinearLayout llName;
+
+ public GroupViewHolder(View theRow, int thePosition) {
+ row = theRow;
+ position = thePosition;
+ imgIndicator = (ImageView) row.findViewById(R.id.imgIndicator);
+ imgUsed = (ImageView) row.findViewById(R.id.imgUsed);
+ imgGranted = (ImageView) row.findViewById(R.id.imgGranted);
+ imgInfo = (ImageView) row.findViewById(R.id.imgInfo);
+ tvName = (TextView) row.findViewById(R.id.tvName);
+ imgWhitelist = (ImageView) row.findViewById(R.id.imgWhitelist);
+ imgCbRestricted = (ImageView) row.findViewById(R.id.imgCbRestricted);
+ pbRunning = (ProgressBar) row.findViewById(R.id.pbRunning);
+ imgCbAsk = (ImageView) row.findViewById(R.id.imgCbAsk);
+ llName = (LinearLayout) row.findViewById(R.id.llName);
+ }
+ }
+
+ private class GroupHolderTask extends AsyncTask {
+ private int position;
+ private GroupViewHolder holder;
+ private String restrictionName;
+ private boolean used;
+ private boolean permission;
+ private RState rstate;
+ private boolean ondemand;
+ private boolean whitelist;
+ private boolean enabled;
+ private boolean can;
+ private boolean methodExpert;
+
+ public GroupHolderTask(int thePosition, GroupViewHolder theHolder, String theRestrictionName) {
+ position = thePosition;
+ holder = theHolder;
+ restrictionName = theRestrictionName;
+ }
+
+ @Override
+ protected Object doInBackground(Object... params) {
+ if (restrictionName != null) {
+ // Get info
+ int userId = Util.getUserId(Process.myUid());
+ used = (PrivacyManager.getUsage(mAppInfo.getUid(), restrictionName, null) != 0);
+ permission = PrivacyManager.hasPermission(mContext, mAppInfo, restrictionName, mVersion);
+ rstate = new RState(mAppInfo.getUid(), restrictionName, null, mVersion);
+
+ boolean isApp = PrivacyManager.isApplication(mAppInfo.getUid());
+ boolean odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem,
+ false);
+ boolean gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ ondemand = ((isApp || odSystem) && gondemand);
+ if (ondemand)
+ ondemand = PrivacyManager.getSettingBool(-mAppInfo.getUid(), PrivacyManager.cSettingOnDemand,
+ false);
+
+ whitelist = false;
+ String wName = null;
+ if (PrivacyManager.cAccounts.equals(restrictionName))
+ wName = Meta.cTypeAccount;
+ else if (PrivacyManager.cSystem.equals(restrictionName))
+ wName = Meta.cTypeApplication;
+ else if (PrivacyManager.cContacts.equals(restrictionName))
+ wName = Meta.cTypeContact;
+ if (wName != null) {
+ boolean blacklist = PrivacyManager.getSettingBool(-mAppInfo.getUid(),
+ PrivacyManager.cSettingBlacklist, false);
+ if (blacklist)
+ whitelist = true;
+ else
+ for (PSetting setting : PrivacyManager.getSettingList(mAppInfo.getUid(), wName))
+ if (Boolean.parseBoolean(setting.value)) {
+ whitelist = true;
+ break;
+ }
+ }
+ if (!whitelist)
+ for (Hook hook : PrivacyManager.getHooks(restrictionName, mVersion))
+ if (hook.whitelist() != null)
+ if (PrivacyManager.getSettingList(mAppInfo.getUid(), hook.whitelist()).size() > 0) {
+ whitelist = true;
+ break;
+ }
+
+ enabled = PrivacyManager.getSettingBool(mAppInfo.getUid(), PrivacyManager.cSettingRestricted, true);
+ can = PrivacyManager.canRestrict(rstate.mUid, Process.myUid(), rstate.mRestrictionName, null, true);
+ methodExpert = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingMethodExpert, false);
+
+ return holder;
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (holder.position == position && result != null) {
+ // Set data
+ holder.tvName.setTypeface(null, used ? Typeface.BOLD_ITALIC : Typeface.NORMAL);
+ holder.imgUsed.setVisibility(used ? View.VISIBLE : View.INVISIBLE);
+ holder.imgGranted.setVisibility(permission ? View.VISIBLE : View.INVISIBLE);
+
+ // Show whitelist icon
+ holder.imgWhitelist.setVisibility(whitelist ? View.VISIBLE : View.GONE);
+ if (whitelist)
+ holder.imgWhitelist.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (PrivacyManager.cAccounts.equals(restrictionName))
+ optionAccounts();
+ else if (PrivacyManager.cSystem.equals(restrictionName))
+ optionApplications();
+ else if (PrivacyManager.cContacts.equals(restrictionName))
+ optionContacts(-1);
+ }
+ });
+ else
+ holder.imgWhitelist.setClickable(false);
+
+ // Display restriction
+ holder.imgCbRestricted.setImageBitmap(getCheckBoxImage(rstate, methodExpert));
+ holder.imgCbRestricted.setVisibility(View.VISIBLE);
+ if (ondemand) {
+ holder.imgCbAsk.setImageBitmap(getAskBoxImage(rstate, methodExpert));
+ holder.imgCbAsk.setVisibility(View.VISIBLE);
+ } else
+ holder.imgCbAsk.setVisibility(View.GONE);
+
+ // Check if can be restricted
+ holder.llName.setEnabled(enabled && can);
+ holder.tvName.setEnabled(enabled && can);
+ holder.imgCbAsk.setEnabled(enabled && can);
+
+ // Listen for restriction changes
+ holder.llName.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ holder.llName.setEnabled(false);
+ holder.imgCbRestricted.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+
+ new AsyncTask() {
+ private List oldState;
+ private List newState;
+
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ // Change restriction
+ oldState = PrivacyManager.getRestartStates(mAppInfo.getUid(), restrictionName);
+ rstate.toggleRestriction();
+ newState = PrivacyManager.getRestartStates(mAppInfo.getUid(), restrictionName);
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ // Refresh display
+ // Needed to update children
+ notifyDataSetChanged();
+
+ // Notify restart
+ if (!newState.equals(oldState))
+ Toast.makeText(mContext, getString(R.string.msg_restart), Toast.LENGTH_LONG)
+ .show();
+
+ holder.pbRunning.setVisibility(View.GONE);
+ holder.imgCbRestricted.setVisibility(View.VISIBLE);
+ holder.llName.setEnabled(true);
+ }
+ }.executeOnExecutor(mExecutor);
+ }
+ });
+
+ // Listen for ask changes
+ if (ondemand)
+ holder.imgCbAsk.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ holder.imgCbAsk.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+
+ new AsyncTask() {
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ rstate.toggleAsked();
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ // Needed to update children
+ notifyDataSetChanged();
+
+ holder.pbRunning.setVisibility(View.GONE);
+ holder.imgCbAsk.setVisibility(View.VISIBLE);
+ }
+ }.executeOnExecutor(mExecutor);
+ }
+ });
+ else
+ holder.imgCbAsk.setClickable(false);
+ }
+ }
+ }
+
+ @Override
+ @SuppressLint("InflateParams")
+ public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
+ GroupViewHolder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.restrictionentry, null);
+ holder = new GroupViewHolder(convertView, groupPosition);
+ convertView.setTag(holder);
+ } else {
+ holder = (GroupViewHolder) convertView.getTag();
+ holder.position = groupPosition;
+ }
+
+ // Get entry
+ final String restrictionName = (String) getGroup(groupPosition);
+
+ // Indicator state
+ holder.imgIndicator.setImageResource(getThemed(isExpanded ? R.attr.icon_expander_maximized
+ : R.attr.icon_expander_minimized));
+
+ // Disable indicator for empty groups
+ if (getChildrenCount(groupPosition) == 0)
+ holder.imgIndicator.setVisibility(View.INVISIBLE);
+ else
+ holder.imgIndicator.setVisibility(View.VISIBLE);
+
+ // Display if used
+ holder.tvName.setTypeface(null, Typeface.NORMAL);
+ holder.imgUsed.setVisibility(View.INVISIBLE);
+
+ // Check if permission
+ holder.imgGranted.setVisibility(View.INVISIBLE);
+
+ // Display localized name
+ TreeMap tmRestriction = PrivacyManager.getRestrictions(mContext);
+ int index = new ArrayList(tmRestriction.values()).indexOf(restrictionName);
+ final String title = (String) tmRestriction.navigableKeySet().toArray()[index];
+ holder.tvName.setText(title);
+ holder.imgWhitelist.setVisibility(View.GONE);
+
+ // Display restriction
+ holder.imgCbRestricted.setVisibility(View.INVISIBLE);
+ holder.imgCbAsk.setVisibility(View.INVISIBLE);
+
+ // Async update
+ new GroupHolderTask(groupPosition, holder, restrictionName).executeOnExecutor(mExecutor, (Object) null);
+
+ // Handle info
+ holder.imgInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ int stringId = getResources().getIdentifier("restrict_help_" + restrictionName, "string",
+ getPackageName());
+
+ // Build dialog
+ Dialog dlgHelp = new Dialog(mContext);
+ dlgHelp.requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ dlgHelp.setTitle(title);
+ dlgHelp.setContentView(R.layout.helpcat);
+ dlgHelp.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
+ ActivityApp.this.getThemed(R.attr.icon_launcher));
+ dlgHelp.setCancelable(true);
+
+ // Set info
+ TextView tvInfo = (TextView) dlgHelp.findViewById(R.id.tvInfo);
+ tvInfo.setText(stringId);
+
+ dlgHelp.show();
+ }
+ });
+
+ return convertView;
+ }
+
+ private List getHooks(int groupPosition) {
+ if (!mHook.containsKey(groupPosition)) {
+ int userId = Util.getUserId(Process.myUid());
+ boolean fUsed = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUsed, false);
+ boolean fPermission = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFPermission, false);
+ List listMethod = new ArrayList();
+ String restrictionName = mListRestriction.get(groupPosition);
+ for (Hook hook : PrivacyManager.getHooks((String) getGroup(groupPosition), mVersion)) {
+ // Filter
+ boolean isUsed = (PrivacyManager.getUsage(mAppInfo.getUid(), restrictionName, hook.getName()) > 0);
+ boolean hasPermission = PrivacyManager.hasPermission(mContext, mAppInfo, hook);
+ if (mSelectedMethodName != null
+ || ((fUsed ? isUsed : true) && (fPermission ? isUsed || hasPermission : true)))
+ listMethod.add(hook);
+ }
+ mHook.put(groupPosition, listMethod);
+ }
+ return mHook.get(groupPosition);
+ }
+
+ @Override
+ public Object getChild(int groupPosition, int childPosition) {
+ return getHooks(groupPosition).get(childPosition);
+ }
+
+ @Override
+ public long getChildId(int groupPosition, int childPosition) {
+ return groupPosition * 1000 + childPosition;
+ }
+
+ @Override
+ public int getChildrenCount(int groupPosition) {
+ return getHooks(groupPosition).size();
+ }
+
+ @Override
+ public boolean isChildSelectable(int groupPosition, int childPosition) {
+ return false;
+ }
+
+ private class ChildViewHolder {
+ private View row;
+ private int groupPosition;
+ private int childPosition;
+ public ImageView imgUsed;
+ public ImageView imgGranted;
+ public ImageView imgInfo;
+ public TextView tvMethodName;
+ public ImageView imgUnsafe;
+ public ImageView imgMethodWhitelist;
+ public ImageView imgCbMethodRestricted;
+ public ProgressBar pbRunning;
+ public ImageView imgCbMethodAsk;
+ public LinearLayout llMethodName;
+
+ private ChildViewHolder(View theRow, int gPosition, int cPosition) {
+ row = theRow;
+ groupPosition = gPosition;
+ childPosition = cPosition;
+ imgUsed = (ImageView) row.findViewById(R.id.imgUsed);
+ imgGranted = (ImageView) row.findViewById(R.id.imgGranted);
+ imgInfo = (ImageView) row.findViewById(R.id.imgInfo);
+ tvMethodName = (TextView) row.findViewById(R.id.tvMethodName);
+ imgUnsafe = (ImageView) row.findViewById(R.id.imgUnsafe);
+ imgMethodWhitelist = (ImageView) row.findViewById(R.id.imgMethodWhitelist);
+ imgCbMethodRestricted = (ImageView) row.findViewById(R.id.imgCbMethodRestricted);
+ pbRunning = (ProgressBar) row.findViewById(R.id.pbRunning);
+ imgCbMethodAsk = (ImageView) row.findViewById(R.id.imgCbMethodAsk);
+ llMethodName = (LinearLayout) row.findViewById(R.id.llMethodName);
+ }
+ }
+
+ private class ChildHolderTask extends AsyncTask {
+ private int groupPosition;
+ private int childPosition;
+ private ChildViewHolder holder;
+ private String restrictionName;
+ private Hook md;
+ private long lastUsage;
+ private PRestriction parent;
+ private boolean permission;
+ private RState rstate;
+ private boolean ondemand;
+ private boolean whitelist;
+ private boolean enabled;
+ private boolean can;
+
+ public ChildHolderTask(int gPosition, int cPosition, ChildViewHolder theHolder, String theRestrictionName) {
+ groupPosition = gPosition;
+ childPosition = cPosition;
+ holder = theHolder;
+ restrictionName = theRestrictionName;
+ }
+
+ @Override
+ protected Object doInBackground(Object... params) {
+ if (restrictionName != null) {
+ // Get info
+ int userId = Util.getUserId(Process.myUid());
+ md = (Hook) getChild(groupPosition, childPosition);
+ lastUsage = PrivacyManager.getUsage(mAppInfo.getUid(), restrictionName, md.getName());
+ parent = PrivacyManager.getRestrictionEx(mAppInfo.getUid(), restrictionName, null);
+ permission = PrivacyManager.hasPermission(mContext, mAppInfo, md);
+ rstate = new RState(mAppInfo.getUid(), restrictionName, md.getName(), mVersion);
+
+ boolean isApp = PrivacyManager.isApplication(mAppInfo.getUid());
+ boolean odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem,
+ false);
+ boolean gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+
+ ondemand = ((isApp || odSystem) && gondemand);
+ if (ondemand)
+ ondemand = PrivacyManager.getSettingBool(-mAppInfo.getUid(), PrivacyManager.cSettingOnDemand,
+ false);
+
+ if (md.whitelist() == null)
+ whitelist = false;
+ else
+ whitelist = PrivacyManager.listWhitelisted(mAppInfo.getUid(), md.whitelist()).size() > 0;
+
+ enabled = PrivacyManager.getSettingBool(mAppInfo.getUid(), PrivacyManager.cSettingRestricted, true);
+ can = PrivacyManager.canRestrict(rstate.mUid, Process.myUid(), rstate.mRestrictionName,
+ rstate.mMethodName, true);
+ return holder;
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (holder.groupPosition == groupPosition && holder.childPosition == childPosition && result != null) {
+ // Set data
+ if (lastUsage > 0) {
+ CharSequence sLastUsage = DateUtils.getRelativeTimeSpanString(lastUsage, new Date().getTime(),
+ DateUtils.SECOND_IN_MILLIS, 0);
+ holder.tvMethodName.setText(String.format("%s (%s)", md.getName(), sLastUsage));
+ }
+ holder.llMethodName.setEnabled(parent.restricted);
+ holder.tvMethodName.setEnabled(parent.restricted);
+ holder.imgCbMethodAsk.setEnabled(!parent.asked);
+
+ holder.imgUsed.setImageResource(getThemed(md.hasUsageData() && enabled && can ? R.attr.icon_used
+ : R.attr.icon_used_grayed));
+ holder.imgUsed.setVisibility(lastUsage == 0 && md.hasUsageData() && enabled && can ? View.INVISIBLE
+ : View.VISIBLE);
+ holder.tvMethodName.setTypeface(null, lastUsage == 0 ? Typeface.NORMAL : Typeface.BOLD_ITALIC);
+ holder.imgGranted.setVisibility(permission ? View.VISIBLE : View.INVISIBLE);
+
+ // Show whitelist icon
+ holder.imgMethodWhitelist.setVisibility(whitelist ? View.VISIBLE : View.INVISIBLE);
+ if (whitelist)
+ holder.imgMethodWhitelist.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ ActivityApp.this.optionWhitelists(md.whitelist());
+ }
+ });
+ else
+ holder.imgMethodWhitelist.setClickable(false);
+
+ // Display restriction
+ holder.imgCbMethodRestricted.setImageBitmap(getCheckBoxImage(rstate, true));
+ holder.imgCbMethodRestricted.setVisibility(View.VISIBLE);
+
+ // Show asked state
+ if (ondemand) {
+ holder.imgCbMethodAsk.setImageBitmap(getAskBoxImage(rstate, true));
+ holder.imgCbMethodAsk.setVisibility(md.canOnDemand() ? View.VISIBLE : View.INVISIBLE);
+ } else
+ holder.imgCbMethodAsk.setVisibility(View.GONE);
+
+ holder.llMethodName.setEnabled(enabled && can);
+ holder.tvMethodName.setEnabled(enabled && can);
+ holder.imgCbMethodAsk.setEnabled(enabled && can);
+
+ // Listen for restriction changes
+ if (parent.restricted)
+ holder.llMethodName.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ holder.llMethodName.setEnabled(false);
+ holder.imgCbMethodRestricted.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+
+ new AsyncTask() {
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ // Change restriction
+ rstate.toggleRestriction();
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ // Refresh display
+ // Needed to update parent
+ notifyDataSetChanged();
+
+ // Notify restart
+ if (md.isRestartRequired())
+ Toast.makeText(mContext, getString(R.string.msg_restart), Toast.LENGTH_LONG)
+ .show();
+
+ holder.pbRunning.setVisibility(View.GONE);
+ holder.imgCbMethodRestricted.setVisibility(View.VISIBLE);
+ holder.llMethodName.setEnabled(true);
+ }
+ }.executeOnExecutor(mExecutor);
+ }
+ });
+ else
+ holder.llMethodName.setClickable(false);
+
+ // Listen for ask changes
+ if (ondemand && !parent.asked)
+ holder.imgCbMethodAsk.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ holder.imgCbMethodAsk.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+
+ new AsyncTask() {
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ rstate.toggleAsked();
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ // Needed to update parent
+ notifyDataSetChanged();
+
+ holder.pbRunning.setVisibility(View.GONE);
+ holder.imgCbMethodAsk.setVisibility(View.VISIBLE);
+ }
+ }.executeOnExecutor(mExecutor);
+ }
+ });
+ else
+ holder.imgCbMethodAsk.setClickable(false);
+ }
+ }
+ }
+
+ @Override
+ @SuppressLint("InflateParams")
+ public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
+ ViewGroup parent) {
+ ChildViewHolder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.restrictionchild, null);
+ holder = new ChildViewHolder(convertView, groupPosition, childPosition);
+ convertView.setTag(holder);
+ } else {
+ holder = (ChildViewHolder) convertView.getTag();
+ holder.groupPosition = groupPosition;
+ holder.childPosition = childPosition;
+ }
+
+ // Get entry
+ final String restrictionName = (String) getGroup(groupPosition);
+ final Hook hook = (Hook) getChild(groupPosition, childPosition);
+
+ // Set background color
+ if (hook.isDangerous())
+ holder.row.setBackgroundColor(getResources().getColor(getThemed(R.attr.color_dangerous)));
+ else
+ holder.row.setBackgroundColor(Color.TRANSPARENT);
+
+ holder.llMethodName.setEnabled(false);
+ holder.tvMethodName.setEnabled(false);
+ holder.imgCbMethodAsk.setEnabled(false);
+
+ // Display method name
+ holder.tvMethodName.setText(hook.getName());
+ holder.tvMethodName.setTypeface(null, Typeface.NORMAL);
+
+ // Display if used
+ holder.imgUsed.setVisibility(View.INVISIBLE);
+
+ // Hide if permissions
+ holder.imgGranted.setVisibility(View.INVISIBLE);
+
+ // Function help
+ if (hook.getAnnotation() == null)
+ holder.imgInfo.setVisibility(View.GONE);
+ else {
+ holder.imgInfo.setVisibility(View.VISIBLE);
+ holder.imgInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ View parent = ActivityApp.this.findViewById(android.R.id.content);
+ showHelp(ActivityApp.this, parent, hook);
+ }
+ });
+ }
+
+ // Show if unsafe
+ holder.imgUnsafe.setVisibility(hook != null && hook.isUnsafe() ? View.VISIBLE : View.INVISIBLE);
+
+ // Hide whitelist icon
+ holder.imgMethodWhitelist.setVisibility(View.INVISIBLE);
+
+ // Display restriction
+ holder.llMethodName.setClickable(false);
+ holder.imgCbMethodRestricted.setVisibility(View.INVISIBLE);
+ holder.imgCbMethodAsk.setVisibility(View.INVISIBLE);
+
+ // Async update
+ new ChildHolderTask(groupPosition, childPosition, holder, restrictionName).executeOnExecutor(mExecutor,
+ (Object) null);
+
+ return convertView;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return true;
+ }
+ }
+
+ @SuppressLint("InflateParams")
+ public static void showHelp(ActivityBase context, View parent, Hook hook) {
+ // Build dialog
+ Dialog dlgHelp = new Dialog(context);
+ dlgHelp.requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ dlgHelp.setTitle(R.string.app_name);
+ dlgHelp.setContentView(R.layout.helpfunc);
+ dlgHelp.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, context.getThemed(R.attr.icon_launcher));
+ dlgHelp.setCancelable(true);
+
+ // Set title
+ TextView tvTitle = (TextView) dlgHelp.findViewById(R.id.tvTitle);
+ tvTitle.setText(hook.getName());
+
+ // Set info
+ TextView tvInfo = (TextView) dlgHelp.findViewById(R.id.tvInfo);
+ tvInfo.setText(Html.fromHtml(hook.getAnnotation()));
+ tvInfo.setMovementMethod(LinkMovementMethod.getInstance());
+
+ // Set permissions
+ String[] permissions = hook.getPermissions();
+ if (permissions != null && permissions.length > 0)
+ if (!permissions[0].equals("")) {
+ TextView tvPermissions = (TextView) dlgHelp.findViewById(R.id.tvPermissions);
+ tvPermissions.setText(Html.fromHtml(TextUtils.join(" ", permissions)));
+ }
+
+ dlgHelp.show();
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityBase.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityBase.java
new file mode 100644
index 0000000..d8847cf
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityBase.java
@@ -0,0 +1,191 @@
+package biz.bokhorst.xprivacy;
+
+import android.annotation.SuppressLint;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningServiceInfo;
+import android.content.pm.PackageInfo;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.Bitmap.Config;
+import android.graphics.PorterDuff.Mode;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Process;
+import android.support.v7.app.AppCompatActivity;
+import android.util.TypedValue;
+import android.view.View;
+import android.widget.TextView;
+
+@SuppressLint("Registered")
+public class ActivityBase extends AppCompatActivity {
+ private int mThemeId;
+ private Bitmap[] mCheck = null;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ if (PrivacyService.checkClient()) {
+ // Set theme
+ int userId = Util.getUserId(Process.myUid());
+ String themeName = PrivacyManager.getSetting(userId, PrivacyManager.cSettingTheme, "");
+ mThemeId = (themeName.equals("Dark") ? R.style.CustomTheme : R.style.CustomTheme_Light);
+ setTheme(mThemeId);
+ }
+
+ super.onCreate(savedInstanceState);
+
+ // Check if Privacy client available
+ if (!PrivacyService.checkClient()) {
+ setContentView(R.layout.reboot);
+
+ try {
+ PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
+ TextView tvVersion = (TextView) findViewById(R.id.tvVersion);
+ tvVersion.setText(pInfo.versionName);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+
+ // Show reason
+ if (PrivacyService.getClient() == null) {
+ ((TextView) findViewById(R.id.tvRebootClient)).setVisibility(View.VISIBLE);
+ Requirements.checkCompatibility(this);
+ } else {
+ ((TextView) findViewById(R.id.tvRebootVersion)).setVisibility(View.VISIBLE);
+ Requirements.check(this);
+ }
+
+ // Show if updating
+ if (isUpdating())
+ ((TextView) findViewById(R.id.tvServiceUpdating)).setVisibility(View.VISIBLE);
+ }
+ }
+
+ private boolean isUpdating() {
+ ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
+ for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE))
+ if (UpdateService.class.getName().equals(service.service.getClassName()))
+ return true;
+ return false;
+ }
+
+ protected Bitmap getOffCheckBox() {
+ if (mCheck == null)
+ buildCheckBoxes();
+ return mCheck[0];
+ }
+
+ protected Bitmap getHalfCheckBox() {
+ if (mCheck == null)
+ buildCheckBoxes();
+ return mCheck[1];
+ }
+
+ protected Bitmap getFullCheckBox() {
+ if (mCheck == null)
+ buildCheckBoxes();
+ return mCheck[2];
+ }
+
+ protected Bitmap getOnDemandCheckBox() {
+ if (mCheck == null)
+ buildCheckBoxes();
+ return mCheck[3];
+ }
+
+ protected Bitmap getCheckBoxImage(RState state, boolean expert) {
+ if (state.partialRestricted)
+ if (expert)
+ return getHalfCheckBox();
+ else
+ return getFullCheckBox();
+ else if (state.restricted)
+ return getFullCheckBox();
+ else
+ return getOffCheckBox();
+ }
+
+ protected Bitmap getAskBoxImage(RState state, boolean expert) {
+ if (state.partialAsk)
+ if (expert)
+ return getHalfCheckBox();
+ else
+ return getOnDemandCheckBox();
+ else if (state.asked)
+ return getOffCheckBox();
+ else
+ return getOnDemandCheckBox();
+ }
+
+ @SuppressWarnings("deprecation")
+ private void buildCheckBoxes() {
+ mCheck = new Bitmap[4];
+
+ int userId = Util.getUserId(Process.myUid());
+ String themeName = PrivacyManager.getSetting(userId, PrivacyManager.cSettingTheme, "");
+ int colorAccent = getResources().getColor(
+ themeName.equals("Dark") ? R.color.color_accent_dark : R.color.color_accent_light);
+
+ // Get off check box
+ TypedArray ta2 = getTheme().obtainStyledAttributes(new int[] { android.R.attr.listChoiceIndicatorMultiple });
+ Drawable off = ta2.getDrawable(0);
+ ta2.recycle();
+ off.setBounds(0, 0, off.getIntrinsicWidth(), off.getIntrinsicHeight());
+
+ // Get check mark
+ Drawable checkmark = getResources().getDrawable(R.drawable.checkmark);
+ checkmark.setBounds(0, 0, off.getIntrinsicWidth(), off.getIntrinsicHeight());
+ checkmark.setColorFilter(colorAccent, Mode.SRC_ATOP);
+
+ // Get check mark outline
+ Drawable checkmarkOutline = getResources().getDrawable(R.drawable.checkmark_outline);
+ checkmarkOutline.setBounds(0, 0, off.getIntrinsicWidth(), off.getIntrinsicHeight());
+
+ // Create off check box
+ mCheck[0] = Bitmap.createBitmap(off.getIntrinsicWidth(), off.getIntrinsicHeight(), Config.ARGB_8888);
+ Canvas canvas0 = new Canvas(mCheck[0]);
+ off.draw(canvas0);
+
+ // Create half check box
+ mCheck[1] = Bitmap.createBitmap(off.getIntrinsicWidth(), off.getIntrinsicHeight(), Config.ARGB_8888);
+ Canvas canvas1 = new Canvas(mCheck[1]);
+ off.draw(canvas1);
+ Paint paint1 = new Paint();
+ paint1.setStyle(Paint.Style.FILL);
+ paint1.setColor(colorAccent);
+ float wborder = off.getIntrinsicWidth() / 3f;
+ float hborder = off.getIntrinsicHeight() / 3f;
+ canvas1.drawRect(wborder, hborder, off.getIntrinsicWidth() - wborder, off.getIntrinsicHeight() - hborder,
+ paint1);
+
+ // Create full check box
+ mCheck[2] = Bitmap.createBitmap(off.getIntrinsicWidth(), off.getIntrinsicHeight(), Config.ARGB_8888);
+ Canvas canvas2 = new Canvas(mCheck[2]);
+ off.draw(canvas2);
+ checkmark.draw(canvas2);
+ checkmarkOutline.draw(canvas2);
+
+ // Get question mark
+ Drawable questionmark = getResources().getDrawable(R.drawable.ondemand);
+ questionmark.setBounds(0, 0, off.getIntrinsicWidth(), off.getIntrinsicHeight());
+ questionmark.setColorFilter(colorAccent, Mode.SRC_ATOP);
+
+ // Get question mark outline
+ Drawable questionmarkOutline = getResources().getDrawable(R.drawable.questionmark_outline);
+ questionmarkOutline.setBounds(0, 0, off.getIntrinsicWidth(), off.getIntrinsicHeight());
+
+ // Create question check box
+ mCheck[3] = Bitmap.createBitmap(off.getIntrinsicWidth(), off.getIntrinsicHeight(), Config.ARGB_8888);
+ Canvas canvas3 = new Canvas(mCheck[3]);
+ off.draw(canvas3);
+ questionmark.draw(canvas3);
+ questionmarkOutline.draw(canvas3);
+ }
+
+ public int getThemed(int attr) {
+ TypedValue tv = new TypedValue();
+ getTheme().resolveAttribute(attr, tv, true);
+ return tv.resourceId;
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityMain.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityMain.java
new file mode 100644
index 0000000..b01cb55
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityMain.java
@@ -0,0 +1,2346 @@
+package biz.bokhorst.xprivacy;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.TreeMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import android.annotation.SuppressLint;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.ProgressDialog;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.res.TypedArray;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.Paint.Style;
+import android.graphics.Typeface;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Process;
+import android.support.v4.view.MenuItemCompat;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.view.ViewParent;
+import android.view.Window;
+import android.view.WindowManager;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemSelectedListener;
+import android.widget.ArrayAdapter;
+import android.widget.BaseExpandableListAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.EditText;
+import android.widget.ExpandableListView;
+import android.widget.Filter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.ProgressBar;
+import android.widget.RadioGroup;
+import android.widget.RelativeLayout;
+import android.widget.ScrollView;
+import android.widget.SearchView;
+import android.widget.Spinner;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class ActivityMain extends ActivityBase implements OnItemSelectedListener {
+ private Spinner spRestriction = null;
+ private AppListAdapter mAppAdapter = null;
+
+ private String searchQuery = "";
+ private int mSortMode;
+ private boolean mSortInvert;
+ private int mProgressWidth = 0;
+ private int mProgress = 0;
+
+ private Handler mProHandler = new Handler();
+
+ private static final int SORT_BY_NAME = 0;
+ private static final int SORT_BY_UID = 1;
+ private static final int SORT_BY_INSTALL_TIME = 2;
+ private static final int SORT_BY_UPDATE_TIME = 3;
+ private static final int SORT_BY_MODIFY_TIME = 4;
+ private static final int SORT_BY_STATE = 5;
+
+ private static final int ACTIVITY_LICENSE = 0;
+ private static final int LICENSED = 0x0100;
+ private static final int NOT_LICENSED = 0x0231;
+ private static final int RETRY = 0x0123;
+
+ private static final int ERROR_CONTACTING_SERVER = 0x101;
+ private static final int ERROR_INVALID_PACKAGE_NAME = 0x102;
+ private static final int ERROR_NON_MATCHING_UID = 0x103;
+
+ public static final String cAction = "Action";
+ public static final int cActionRefresh = 1;
+
+ public static final Uri cProUri = Uri.parse("http://www.xprivacy.eu/");
+
+ private static ExecutorService mExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),
+ new PriorityThreadFactory());
+
+ private static class PriorityThreadFactory implements ThreadFactory {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.NORM_PRIORITY);
+ return t;
+ }
+ }
+
+ private Comparator mSorter = new Comparator() {
+ @Override
+ public int compare(ApplicationInfoEx appInfo0, ApplicationInfoEx appInfo1) {
+ int sortOrder = mSortInvert ? -1 : 1;
+ switch (mSortMode) {
+ case SORT_BY_NAME:
+ return sortOrder * appInfo0.compareTo(appInfo1);
+ case SORT_BY_UID:
+ // Default lowest first
+ return sortOrder * (appInfo0.getUid() - appInfo1.getUid());
+ case SORT_BY_INSTALL_TIME:
+ // Default newest first
+ Long iTime0 = appInfo0.getInstallTime(ActivityMain.this);
+ Long iTime1 = appInfo1.getInstallTime(ActivityMain.this);
+ return sortOrder * iTime1.compareTo(iTime0);
+ case SORT_BY_UPDATE_TIME:
+ // Default newest first
+ Long uTime0 = appInfo0.getUpdateTime(ActivityMain.this);
+ Long uTime1 = appInfo1.getUpdateTime(ActivityMain.this);
+ return sortOrder * uTime1.compareTo(uTime0);
+ case SORT_BY_MODIFY_TIME:
+ // Default newest first
+ Long mTime0 = appInfo0.getModificationTime(ActivityMain.this);
+ Long mTime1 = appInfo1.getModificationTime(ActivityMain.this);
+ return sortOrder * mTime1.compareTo(mTime0);
+ case SORT_BY_STATE:
+ Integer state0 = appInfo0.getState(ActivityMain.this);
+ Integer state1 = appInfo1.getState(ActivityMain.this);
+ if (state0.compareTo(state1) == 0)
+ return sortOrder * appInfo0.compareTo(appInfo1);
+ else
+ return sortOrder * state0.compareTo(state1);
+ }
+ return 0;
+ }
+ };
+
+ private boolean mPackageChangeReceiverRegistered = false;
+
+ private BroadcastReceiver mPackageChangeReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ ActivityMain.this.recreate();
+ }
+ };
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ final int userId = Util.getUserId(Process.myUid());
+
+ // Check privacy service client
+ if (!PrivacyService.checkClient())
+ return;
+
+ // Import license file
+ if (Intent.ACTION_VIEW.equals(getIntent().getAction()))
+ if (Util.importProLicense(new File(getIntent().getData().getPath())) != null)
+ Toast.makeText(this, getString(R.string.menu_pro), Toast.LENGTH_LONG).show();
+
+ // Set layout
+ setContentView(R.layout.mainlist);
+ setSupportActionBar((Toolbar) findViewById(R.id.widgetToolbar));
+ getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
+
+ // Set sub title
+ if (Util.hasProLicense(this) != null)
+ getSupportActionBar().setSubtitle(R.string.menu_pro);
+
+ // Annotate
+ Meta.annotate(this.getResources());
+
+ // Get localized restriction name
+ List listRestrictionName = new ArrayList(PrivacyManager.getRestrictions(this).navigableKeySet());
+ listRestrictionName.add(0, getString(R.string.menu_all));
+
+ // Build spinner adapter
+ SpinnerAdapter spAdapter = new SpinnerAdapter(this, android.R.layout.simple_spinner_item);
+ spAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ spAdapter.addAll(listRestrictionName);
+
+ // Handle info
+ ImageView imgInfo = (ImageView) findViewById(R.id.imgInfo);
+ imgInfo.setOnClickListener(new View.OnClickListener() {
+ @SuppressLint("SetJavaScriptEnabled")
+ @Override
+ public void onClick(View view) {
+ int position = spRestriction.getSelectedItemPosition();
+ if (position != AdapterView.INVALID_POSITION) {
+ String query = (position == 0 ? "restrictions" : (String) PrivacyManager
+ .getRestrictions(ActivityMain.this).values().toArray()[position - 1]);
+
+ WebView webview = new WebView(ActivityMain.this);
+ webview.getSettings().setUserAgentString("Mozilla/5.0");
+ // needed for hashtag
+ webview.getSettings().setJavaScriptEnabled(true);
+ webview.loadUrl("https://github.com/M66B/XPrivacy#" + query);
+
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityMain.this);
+ alertDialogBuilder.setTitle((String) spRestriction.getSelectedItem());
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setView(webview);
+ alertDialogBuilder.setCancelable(true);
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+ }
+ });
+
+ // Setup category spinner
+ spRestriction = (Spinner) findViewById(R.id.spRestriction);
+ spRestriction.setAdapter(spAdapter);
+ spRestriction.setOnItemSelectedListener(this);
+ int pos = getSelectedCategory(userId);
+ spRestriction.setSelection(pos);
+
+ // Setup sort
+ mSortMode = Integer.parseInt(PrivacyManager.getSetting(userId, PrivacyManager.cSettingSortMode, "0"));
+ mSortInvert = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingSortInverted, false);
+
+ // Start task to get app list
+ AppListTask appListTask = new AppListTask();
+ appListTask.executeOnExecutor(mExecutor, (Object) null);
+
+ // Check environment
+ Requirements.check(this);
+
+ // Licensing
+ checkLicense();
+
+ // Listen for package add/remove
+ IntentFilter iff = new IntentFilter();
+ iff.addAction(Intent.ACTION_PACKAGE_ADDED);
+ iff.addAction(Intent.ACTION_PACKAGE_REMOVED);
+ iff.addDataScheme("package");
+ registerReceiver(mPackageChangeReceiver, iff);
+ mPackageChangeReceiverRegistered = true;
+
+ boolean showChangelog = true;
+
+ // First run
+ if (PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFirstRun, true)) {
+ showChangelog = false;
+ optionAbout();
+ }
+
+ // Tutorial
+ if (!PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingTutorialMain, false)) {
+ showChangelog = false;
+ ((ScrollView) findViewById(R.id.svTutorialHeader)).setVisibility(View.VISIBLE);
+ ((ScrollView) findViewById(R.id.svTutorialDetails)).setVisibility(View.VISIBLE);
+ }
+ View.OnClickListener listener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ ViewParent parent = view.getParent();
+ while (!parent.getClass().equals(ScrollView.class))
+ parent = parent.getParent();
+ ((View) parent).setVisibility(View.GONE);
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingTutorialMain, Boolean.TRUE.toString());
+ }
+ };
+ ((Button) findViewById(R.id.btnTutorialHeader)).setOnClickListener(listener);
+ ((Button) findViewById(R.id.btnTutorialDetails)).setOnClickListener(listener);
+
+ // Legacy
+ if (!PrivacyManager.cVersion3) {
+ long now = new Date().getTime();
+ String legacy = PrivacyManager.getSetting(userId, PrivacyManager.cSettingLegacy, null);
+ if (legacy == null || now > Long.parseLong(legacy) + 7 * 24 * 60 * 60 * 1000L) {
+ showChangelog = false;
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingLegacy, Long.toString(now));
+
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
+ alertDialogBuilder.setTitle(R.string.app_name);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setMessage(R.string.title_update_legacy);
+ alertDialogBuilder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ Util.viewUri(ActivityMain.this,
+ Uri.parse("https://github.com/M66B/XPrivacy/blob/master/CHANGELOG.md#xprivacy3"));
+ }
+ });
+ alertDialogBuilder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Do nothing
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+ }
+
+ // Show changelog
+ if (showChangelog) {
+ String sVersion = PrivacyManager.getSetting(userId, PrivacyManager.cSettingChangelog, null);
+ Version changelogVersion = new Version(sVersion == null ? "0.0" : sVersion);
+ Version currentVersion = new Version(Util.getSelfVersionName(this));
+ if (sVersion == null || changelogVersion.compareTo(currentVersion) < 0)
+ optionChangelog();
+ }
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+
+ // Update category selection
+ if (spRestriction != null) {
+ int userId = Util.getUserId(Process.myUid());
+ int pos = getSelectedCategory(userId);
+ spRestriction.setSelection(pos);
+ }
+
+ // Update list
+ if (mAppAdapter != null)
+ mAppAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ protected void onNewIntent(Intent intent) {
+ // Handle clear XPrivacy data (needs UI refresh)
+ Bundle extras = intent.getExtras();
+ if (extras != null && extras.containsKey(cAction) && extras.getInt(cAction) == cActionRefresh)
+ recreate();
+ else {
+ // Refresh application list
+ if (mAppAdapter != null)
+ mAppAdapter.notifyDataSetChanged();
+
+ // Import pro license
+ if (Intent.ACTION_VIEW.equals(intent.getAction()))
+ Util.importProLicense(new File(intent.getData().getPath()));
+ }
+ }
+
+ @Override
+ protected void onDestroy() {
+ super.onDestroy();
+
+ if (mPackageChangeReceiverRegistered) {
+ unregisterReceiver(mPackageChangeReceiver);
+ mPackageChangeReceiverRegistered = false;
+ }
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent dataIntent) {
+ super.onActivityResult(requestCode, resultCode, dataIntent);
+
+ if (requestCode == ACTIVITY_LICENSE) {
+ // License check
+ if (dataIntent != null) {
+ int code = dataIntent.getIntExtra("Code", -1);
+ int reason = dataIntent.getIntExtra("Reason", -1);
+
+ String sReason;
+ if (reason == LICENSED)
+ sReason = "LICENSED";
+ else if (reason == NOT_LICENSED)
+ sReason = "NOT_LICENSED";
+ else if (reason == RETRY)
+ sReason = "RETRY";
+ else if (reason == ERROR_CONTACTING_SERVER)
+ sReason = "ERROR_CONTACTING_SERVER";
+ else if (reason == ERROR_INVALID_PACKAGE_NAME)
+ sReason = "ERROR_INVALID_PACKAGE_NAME";
+ else if (reason == ERROR_NON_MATCHING_UID)
+ sReason = "ERROR_NON_MATCHING_UID";
+ else
+ sReason = Integer.toString(reason);
+
+ Util.log(null, Log.WARN, "Licensing: code=" + code + " reason=" + sReason);
+
+ if (code > 0) {
+ Util.setPro(true);
+ invalidateOptionsMenu();
+ Toast.makeText(this, getString(R.string.menu_pro), Toast.LENGTH_LONG).show();
+ } else if (reason == RETRY) {
+ Util.setPro(false);
+ mProHandler.postDelayed(new Runnable() {
+ @Override
+ public void run() {
+ checkLicense();
+ }
+ }, 30 * 1000);
+ }
+ }
+ }
+ }
+
+ // Filtering
+
+ @Override
+ public void onItemSelected(AdapterView> parent, View view, int pos, long id) {
+ selectRestriction(pos);
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView> parent) {
+ selectRestriction(0);
+ }
+
+ private void selectRestriction(int pos) {
+ if (mAppAdapter != null) {
+ int userId = Util.getUserId(Process.myUid());
+ String restrictionName = (pos == 0 ? null : (String) PrivacyManager.getRestrictions(this).values()
+ .toArray()[pos - 1]);
+ mAppAdapter.setRestrictionName(restrictionName);
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingSelectedCategory, restrictionName);
+ applyFilter();
+ }
+ }
+
+ private void applyFilter() {
+ if (mAppAdapter != null) {
+ ProgressBar pbFilter = (ProgressBar) findViewById(R.id.pbFilter);
+ TextView tvStats = (TextView) findViewById(R.id.tvStats);
+ TextView tvState = (TextView) findViewById(R.id.tvState);
+
+ // Get settings
+ int userId = Util.getUserId(Process.myUid());
+ boolean fUsed = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUsed, false);
+ boolean fInternet = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFInternet, false);
+ boolean fRestriction = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFRestriction, false);
+ boolean fRestrictionNot = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFRestrictionNot,
+ false);
+ boolean fPermission = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFPermission, true);
+ boolean fOnDemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFOnDemand, false);
+ boolean fOnDemandNot = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFOnDemandNot, false);
+ boolean fUser = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUser, true);
+ boolean fSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFSystem, false);
+
+ String filter = String.format("%s\n%b\n%b\n%b\n%b\n%b\n%b\n%b\n%b\n%b", searchQuery, fUsed, fInternet,
+ fRestriction, fRestrictionNot, fPermission, fOnDemand, fOnDemandNot, fUser, fSystem);
+ pbFilter.setVisibility(ProgressBar.VISIBLE);
+ tvStats.setVisibility(TextView.GONE);
+
+ // Adjust progress state width
+ RelativeLayout.LayoutParams tvStateLayout = (RelativeLayout.LayoutParams) tvState.getLayoutParams();
+ tvStateLayout.addRule(RelativeLayout.LEFT_OF, R.id.pbFilter);
+
+ mAppAdapter.getFilter().filter(filter);
+ }
+ }
+
+ private void applySort() {
+ if (mAppAdapter != null)
+ mAppAdapter.sort();
+ }
+
+ // Options
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ if (inflater != null && PrivacyService.checkClient()) {
+ // Inflate menu
+ inflater.inflate(R.menu.main, menu);
+
+ // Searchable
+ SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
+ if (searchView != null) {
+ searchView.setIconifiedByDefault(false);
+
+ searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
+ @Override
+ public boolean onQueryTextChange(String newText) {
+ searchQuery = newText;
+ applyFilter();
+ return true;
+ }
+
+ @Override
+ public boolean onQueryTextSubmit(String query) {
+ searchQuery = query;
+ applyFilter();
+ return true;
+ }
+ });
+ searchView.setOnCloseListener(new SearchView.OnCloseListener() {
+ @Override
+ public boolean onClose() {
+ searchQuery = "";
+ applyFilter();
+ return true;
+ }
+ });
+ }
+
+ return true;
+ } else
+ return false;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ int userId = Util.getUserId(Process.myUid());
+ boolean mounted = Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
+ boolean updates = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingUpdates, false);
+
+ menu.findItem(R.id.menu_export).setEnabled(mounted);
+ menu.findItem(R.id.menu_import).setEnabled(mounted);
+
+ menu.findItem(R.id.menu_submit).setEnabled(Util.hasValidFingerPrint(this));
+
+ menu.findItem(R.id.menu_pro).setVisible(!Util.isProEnabled() && Util.hasProLicense(this) == null);
+
+ menu.findItem(R.id.menu_dump).setVisible(Util.isDebuggable(this));
+
+ menu.findItem(R.id.menu_update).setVisible(updates);
+ menu.findItem(R.id.menu_update).setEnabled(mounted);
+
+ // Update filter count
+
+ // Get settings
+ boolean fUsed = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUsed, false);
+ boolean fInternet = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFInternet, false);
+ boolean fRestriction = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFRestriction, false);
+ boolean fPermission = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFPermission, true);
+ boolean fOnDemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFOnDemand, false);
+ boolean fUser = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUser, true);
+ boolean fSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFSystem, false);
+
+ // Count number of active filters
+ int numberOfFilters = 0;
+ if (fUsed)
+ numberOfFilters++;
+ if (fInternet)
+ numberOfFilters++;
+ if (fRestriction)
+ numberOfFilters++;
+ if (fPermission)
+ numberOfFilters++;
+ if (fOnDemand)
+ numberOfFilters++;
+ if (fUser)
+ numberOfFilters++;
+ if (fSystem)
+ numberOfFilters++;
+
+ if (numberOfFilters > 0) {
+ Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_filter).copy(
+ Bitmap.Config.ARGB_8888, true);
+
+ Paint paint = new Paint();
+ paint.setStyle(Style.FILL);
+ paint.setColor(Color.GRAY);
+ paint.setTextSize(bitmap.getWidth() / 3);
+ paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
+
+ String text = Integer.toString(numberOfFilters);
+
+ Canvas canvas = new Canvas(bitmap);
+ canvas.drawText(text, bitmap.getWidth() - paint.measureText(text), bitmap.getHeight(), paint);
+
+ MenuItem fMenu = menu.findItem(R.id.menu_filter);
+ fMenu.setIcon(new BitmapDrawable(getResources(), bitmap));
+ }
+
+ return super.onPrepareOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ try {
+ switch (item.getItemId()) {
+ case R.id.menu_sort:
+ optionSort();
+ return true;
+ case R.id.menu_filter:
+ optionFilter();
+ return true;
+ case R.id.menu_usage:
+ optionUsage();
+ return true;
+ case R.id.menu_template:
+ optionTemplate();
+ return true;
+ case R.id.menu_select_all:
+ optionSelectAll();
+ return true;
+ case R.id.menu_toggle:
+ optionToggle();
+ return true;
+ case R.id.menu_export:
+ optionExport();
+ return true;
+ case R.id.menu_import:
+ optionImport();
+ return true;
+ case R.id.menu_submit:
+ optionSubmit();
+ return true;
+ case R.id.menu_fetch:
+ optionFetch();
+ return true;
+ case R.id.menu_pro:
+ optionPro();
+ return true;
+ case R.id.menu_theme:
+ optionSwitchTheme();
+ return true;
+ case R.id.menu_settings:
+ optionSettings();
+ return true;
+ case R.id.menu_dump:
+ optionDump();
+ return true;
+ case R.id.menu_legend:
+ optionLegend();
+ return true;
+ case R.id.menu_tutorial:
+ optionTutorial();
+ return true;
+ case R.id.menu_changelog:
+ optionChangelog();
+ return true;
+ case R.id.menu_update:
+ optionUpdate();
+ return true;
+ case R.id.menu_report:
+ optionReportIssue();
+ return true;
+ case R.id.menu_about:
+ optionAbout();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ return true;
+ }
+ }
+
+ @SuppressLint("InflateParams")
+ private void optionSort() {
+ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.sort, null);
+ final RadioGroup rgSMode = (RadioGroup) view.findViewById(R.id.rgSMode);
+ final CheckBox cbSInvert = (CheckBox) view.findViewById(R.id.cbSInvert);
+
+ // Initialise controls
+ switch (mSortMode) {
+ case SORT_BY_NAME:
+ rgSMode.check(R.id.rbSName);
+ break;
+ case SORT_BY_UID:
+ rgSMode.check(R.id.rbSUid);
+ break;
+ case SORT_BY_INSTALL_TIME:
+ rgSMode.check(R.id.rbSInstalled);
+ break;
+ case SORT_BY_UPDATE_TIME:
+ rgSMode.check(R.id.rbSUpdated);
+ break;
+ case SORT_BY_MODIFY_TIME:
+ rgSMode.check(R.id.rbSModified);
+ break;
+ case SORT_BY_STATE:
+ rgSMode.check(R.id.rbSState);
+ break;
+ }
+ cbSInvert.setChecked(mSortInvert);
+
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityMain.this);
+ alertDialogBuilder.setTitle(R.string.menu_sort);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setView(view);
+ alertDialogBuilder.setPositiveButton(ActivityMain.this.getString(android.R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ switch (rgSMode.getCheckedRadioButtonId()) {
+ case R.id.rbSName:
+ mSortMode = SORT_BY_NAME;
+ break;
+ case R.id.rbSUid:
+ mSortMode = SORT_BY_UID;
+ break;
+ case R.id.rbSInstalled:
+ mSortMode = SORT_BY_INSTALL_TIME;
+ break;
+ case R.id.rbSUpdated:
+ mSortMode = SORT_BY_UPDATE_TIME;
+ break;
+ case R.id.rbSModified:
+ mSortMode = SORT_BY_MODIFY_TIME;
+ break;
+ case R.id.rbSState:
+ mSortMode = SORT_BY_STATE;
+ break;
+ }
+ mSortInvert = cbSInvert.isChecked();
+
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingSortMode, Integer.toString(mSortMode));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingSortInverted,
+ Boolean.toString(mSortInvert));
+
+ applySort();
+ }
+ });
+ alertDialogBuilder.setNegativeButton(ActivityMain.this.getString(android.R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Do nothing
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ @SuppressLint("InflateParams")
+ private void optionFilter() {
+ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.filters, null);
+ final CheckBox cbFUsed = (CheckBox) view.findViewById(R.id.cbFUsed);
+ final CheckBox cbFInternet = (CheckBox) view.findViewById(R.id.cbFInternet);
+ final CheckBox cbFPermission = (CheckBox) view.findViewById(R.id.cbFPermission);
+ final CheckBox cbFRestriction = (CheckBox) view.findViewById(R.id.cbFRestriction);
+ final CheckBox cbFRestrictionNot = (CheckBox) view.findViewById(R.id.cbFRestrictionNot);
+ final CheckBox cbFOnDemand = (CheckBox) view.findViewById(R.id.cbFOnDemand);
+ final CheckBox cbFOnDemandNot = (CheckBox) view.findViewById(R.id.cbFOnDemandNot);
+ final CheckBox cbFUser = (CheckBox) view.findViewById(R.id.cbFUser);
+ final CheckBox cbFSystem = (CheckBox) view.findViewById(R.id.cbFSystem);
+ final Button btnDefault = (Button) view.findViewById(R.id.btnDefault);
+
+ // Get settings
+ final int userId = Util.getUserId(Process.myUid());
+ boolean fUsed = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUsed, false);
+ boolean fInternet = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFInternet, false);
+ boolean fPermission = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFPermission, true);
+ boolean fRestriction = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFRestriction, false);
+ boolean fRestrictionNot = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFRestrictionNot, false);
+ boolean fOnDemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFOnDemand, false);
+ boolean fOnDemandNot = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFOnDemandNot, false);
+ boolean fUser = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFUser, true);
+ boolean fSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFSystem, false);
+
+ boolean ondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+
+ // Setup checkboxes
+ cbFUsed.setChecked(fUsed);
+ cbFInternet.setChecked(fInternet);
+ cbFPermission.setChecked(fPermission);
+ cbFRestriction.setChecked(fRestriction);
+ cbFRestrictionNot.setChecked(fRestrictionNot);
+ cbFOnDemand.setChecked(fOnDemand && ondemand);
+ cbFOnDemandNot.setChecked(fOnDemandNot && ondemand);
+ cbFUser.setChecked(fUser);
+ cbFSystem.setChecked(fSystem);
+
+ cbFRestrictionNot.setEnabled(fRestriction);
+
+ cbFOnDemand.setEnabled(ondemand);
+ cbFOnDemandNot.setEnabled(fOnDemand && ondemand);
+
+ // Manage user/system filter exclusivity
+ OnCheckedChangeListener checkListener = new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (buttonView == cbFUser) {
+ if (isChecked)
+ cbFSystem.setChecked(false);
+ } else if (buttonView == cbFSystem) {
+ if (isChecked)
+ cbFUser.setChecked(false);
+ } else if (buttonView == cbFRestriction)
+ cbFRestrictionNot.setEnabled(cbFRestriction.isChecked());
+ else if (buttonView == cbFOnDemand)
+ cbFOnDemandNot.setEnabled(cbFOnDemand.isChecked());
+ }
+ };
+ cbFUser.setOnCheckedChangeListener(checkListener);
+ cbFSystem.setOnCheckedChangeListener(checkListener);
+ cbFRestriction.setOnCheckedChangeListener(checkListener);
+ cbFOnDemand.setOnCheckedChangeListener(checkListener);
+
+ // Clear button
+ btnDefault.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ cbFUsed.setChecked(false);
+ cbFInternet.setChecked(false);
+ cbFPermission.setChecked(true);
+ cbFRestriction.setChecked(false);
+ cbFRestrictionNot.setChecked(false);
+ cbFOnDemand.setChecked(false);
+ cbFOnDemandNot.setChecked(false);
+ cbFUser.setChecked(true);
+ cbFSystem.setChecked(false);
+ }
+ });
+
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityMain.this);
+ alertDialogBuilder.setTitle(R.string.menu_filter);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setView(view);
+ alertDialogBuilder.setPositiveButton(ActivityMain.this.getString(android.R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFUsed,
+ Boolean.toString(cbFUsed.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFInternet,
+ Boolean.toString(cbFInternet.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFRestriction,
+ Boolean.toString(cbFRestriction.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFRestrictionNot,
+ Boolean.toString(cbFRestrictionNot.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFPermission,
+ Boolean.toString(cbFPermission.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFOnDemand,
+ Boolean.toString(cbFOnDemand.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFOnDemandNot,
+ Boolean.toString(cbFOnDemandNot.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFUser,
+ Boolean.toString(cbFUser.isChecked()));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFSystem,
+ Boolean.toString(cbFSystem.isChecked()));
+
+ invalidateOptionsMenu();
+ applyFilter();
+ }
+ });
+ alertDialogBuilder.setNegativeButton(ActivityMain.this.getString(android.R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ private void optionUsage() {
+ Intent intent = new Intent(this, ActivityUsage.class);
+ if (mAppAdapter != null && mAppAdapter.getRestrictionName() != null)
+ intent.putExtra(ActivityUsage.cRestriction, mAppAdapter.getRestrictionName());
+ startActivity(intent);
+ }
+
+ @SuppressLint("InflateParams")
+ private void optionTemplate() {
+ final int userId = Util.getUserId(Process.myUid());
+
+ // Build view
+ LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View view = inflater.inflate(R.layout.template, null);
+ final Spinner spTemplate = (Spinner) view.findViewById(R.id.spTemplate);
+ Button btnRename = (Button) view.findViewById(R.id.btnRename);
+ ExpandableListView elvTemplate = (ExpandableListView) view.findViewById(R.id.elvTemplate);
+
+ // Template selector
+ final SpinnerAdapter spAdapter = new SpinnerAdapter(this, android.R.layout.simple_spinner_item);
+ spAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ String defaultName = PrivacyManager.getSetting(userId, Meta.cTypeTemplateName, "0",
+ getString(R.string.title_default));
+ spAdapter.add(defaultName);
+ for (int i = 1; i <= 4; i++) {
+ String alternateName = PrivacyManager.getSetting(userId, Meta.cTypeTemplateName, Integer.toString(i),
+ getString(R.string.title_alternate) + " " + i);
+ spAdapter.add(alternateName);
+ }
+ spTemplate.setAdapter(spAdapter);
+
+ // Template definition
+ final TemplateListAdapter templateAdapter = new TemplateListAdapter(this, view, R.layout.templateentry);
+ elvTemplate.setAdapter(templateAdapter);
+ elvTemplate.setGroupIndicator(null);
+
+ spTemplate.setOnItemSelectedListener(new OnItemSelectedListener() {
+ @Override
+ public void onItemSelected(AdapterView> arg0, View arg1, int arg2, long arg3) {
+ templateAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public void onNothingSelected(AdapterView> arg0) {
+ templateAdapter.notifyDataSetChanged();
+ }
+ });
+
+ btnRename.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (Util.hasProLicense(ActivityMain.this) == null) {
+ // Redirect to pro page
+ Util.viewUri(ActivityMain.this, cProUri);
+ return;
+ }
+
+ final int templateId = spTemplate.getSelectedItemPosition();
+ if (templateId == AdapterView.INVALID_POSITION)
+ return;
+
+ AlertDialog.Builder dlgRename = new AlertDialog.Builder(spTemplate.getContext());
+ dlgRename.setTitle(R.string.title_rename);
+
+ final String original = (templateId == 0 ? getString(R.string.title_default)
+ : getString(R.string.title_alternate) + " " + templateId);
+ dlgRename.setMessage(original);
+
+ final EditText input = new EditText(spTemplate.getContext());
+ dlgRename.setView(input);
+
+ dlgRename.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ String name = input.getText().toString();
+ if (TextUtils.isEmpty(name)) {
+ PrivacyManager.setSetting(userId, Meta.cTypeTemplateName, Integer.toString(templateId),
+ null);
+ name = original;
+ } else {
+ PrivacyManager.setSetting(userId, Meta.cTypeTemplateName, Integer.toString(templateId),
+ name);
+ }
+ spAdapter.remove(spAdapter.getItem(templateId));
+ spAdapter.insert(name, templateId);
+ spAdapter.notifyDataSetChanged();
+ }
+ });
+
+ dlgRename.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ // Do nothing
+ }
+ });
+
+ dlgRename.create().show();
+ }
+ });
+
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
+ alertDialogBuilder.setTitle(R.string.menu_template);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setView(view);
+ alertDialogBuilder.setPositiveButton(getString(R.string.msg_done), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Do nothing
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ private void optionSelectAll() {
+ // Select all visible apps
+ if (mAppAdapter != null)
+ mAppAdapter.selectAllVisible();
+ }
+
+ private void optionToggle() {
+ if (mAppAdapter != null) {
+ Intent intent = new Intent(ActivityShare.ACTION_TOGGLE);
+ intent.putExtra(ActivityShare.cInteractive, true);
+ intent.putExtra(ActivityShare.cUidList,
+ mAppAdapter == null ? new int[0] : mAppAdapter.getSelectedOrVisibleUid(0));
+ intent.putExtra(ActivityShare.cRestriction, mAppAdapter.getRestrictionName());
+ startActivity(intent);
+ }
+ }
+
+ private void optionExport() {
+ Intent intent = new Intent(ActivityShare.ACTION_EXPORT);
+ intent.putExtra(ActivityShare.cInteractive, true);
+ intent.putExtra(ActivityShare.cUidList,
+ mAppAdapter == null ? new int[0] : mAppAdapter.getSelectedOrVisibleUid(AppListAdapter.cSelectAppAll));
+ startActivity(intent);
+ }
+
+ private void optionImport() {
+ Intent intent = new Intent(ActivityShare.ACTION_IMPORT);
+ intent.putExtra(ActivityShare.cInteractive, true);
+ intent.putExtra(ActivityShare.cUidList,
+ mAppAdapter == null ? new int[0] : mAppAdapter.getSelectedOrVisibleUid(0));
+ startActivity(intent);
+ }
+
+ private void optionSubmit() {
+ if (ActivityShare.registerDevice(this)) {
+ int[] uid = (mAppAdapter == null ? new int[0] : mAppAdapter
+ .getSelectedOrVisibleUid(AppListAdapter.cSelectAppNone));
+ if (uid.length == 0) {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
+ alertDialogBuilder.setTitle(R.string.app_name);
+ alertDialogBuilder.setMessage(R.string.msg_select);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(getString(android.R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ } else if (uid.length <= ActivityShare.cSubmitLimit) {
+ if (mAppAdapter != null) {
+ Intent intent = new Intent(ActivityShare.ACTION_SUBMIT);
+ intent.putExtra(ActivityShare.cInteractive, true);
+ intent.putExtra(ActivityShare.cUidList, uid);
+ startActivity(intent);
+ }
+ } else {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
+ alertDialogBuilder.setTitle(R.string.app_name);
+ alertDialogBuilder.setMessage(getString(R.string.msg_limit, ActivityShare.cSubmitLimit + 1));
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(getString(android.R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+ }
+ }
+
+ private void optionFetch() {
+ if (Util.hasProLicense(this) == null) {
+ // Redirect to pro page
+ Util.viewUri(this, cProUri);
+ } else {
+ if (mAppAdapter != null) {
+
+ Intent intent = new Intent(ActivityShare.ACTION_FETCH);
+ intent.putExtra(ActivityShare.cInteractive, true);
+ intent.putExtra(ActivityShare.cUidList,
+ mAppAdapter == null ? new int[0] : mAppAdapter.getSelectedOrVisibleUid(0));
+ startActivity(intent);
+ }
+ }
+ }
+
+ private void optionPro() {
+ // Redirect to pro page
+ Util.viewUri(this, cProUri);
+ }
+
+ private void optionSwitchTheme() {
+ int userId = Util.getUserId(Process.myUid());
+ String themeName = PrivacyManager.getSetting(userId, PrivacyManager.cSettingTheme, "");
+ themeName = (themeName.equals("Dark") ? "Light" : "Dark");
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingTheme, themeName);
+ this.recreate();
+ }
+
+ private void optionSettings() {
+ Intent intent = new Intent(this, ActivitySettings.class);
+ startActivity(intent);
+ }
+
+ private void optionDump() {
+ try {
+ PrivacyService.getClient().dump(0);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ }
+
+ private void optionLegend() {
+ // Show help
+ Dialog dialog = new Dialog(ActivityMain.this);
+ dialog.requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ dialog.setTitle(R.string.menu_legend);
+ dialog.setContentView(R.layout.legend);
+ dialog.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, getThemed(R.attr.icon_launcher));
+
+ ((ImageView) dialog.findViewById(R.id.imgHelpHalf)).setImageBitmap(getHalfCheckBox());
+ ((ImageView) dialog.findViewById(R.id.imgHelpOnDemand)).setImageBitmap(getOnDemandCheckBox());
+
+ for (View child : Util.getViewsByTag((ViewGroup) dialog.findViewById(android.R.id.content), "details"))
+ child.setVisibility(View.GONE);
+
+ ((LinearLayout) dialog.findViewById(R.id.llUnsafe)).setVisibility(PrivacyManager.cVersion3 ? View.VISIBLE
+ : View.GONE);
+
+ dialog.setCancelable(true);
+ dialog.show();
+ }
+
+ private void optionTutorial() {
+ ((ScrollView) findViewById(R.id.svTutorialHeader)).setVisibility(View.VISIBLE);
+ ((ScrollView) findViewById(R.id.svTutorialDetails)).setVisibility(View.VISIBLE);
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingTutorialMain, Boolean.FALSE.toString());
+
+ Dialog dlgUsage = new Dialog(this);
+ dlgUsage.requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ dlgUsage.setTitle(R.string.title_usage_header);
+ dlgUsage.setContentView(R.layout.usage);
+ dlgUsage.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, getThemed(R.attr.icon_launcher));
+ dlgUsage.setCancelable(true);
+ dlgUsage.show();
+ }
+
+ private void optionChangelog() {
+ WebView webview = new WebView(this);
+ webview.setWebViewClient(new WebViewClient() {
+ public void onPageFinished(WebView view, String url) {
+ int userId = Util.getUserId(Process.myUid());
+ Version currentVersion = new Version(Util.getSelfVersionName(ActivityMain.this));
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingChangelog, currentVersion.toString());
+ }
+ });
+ webview.loadUrl("https://github.com/M66B/XPrivacy/blob/master/CHANGELOG.md");
+
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
+ alertDialogBuilder.setTitle(R.string.menu_changelog);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setView(webview);
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ private void optionUpdate() {
+ if (Util.hasProLicense(this) == null)
+ Util.viewUri(this, ActivityMain.cProUri);
+ else
+ new ActivityShare.UpdateTask(this).executeOnExecutor(mExecutor);
+ }
+
+ private void optionReportIssue() {
+ // Report issue
+ Util.viewUri(this, Uri.parse("https://github.com/M66B/XPrivacy#support"));
+ }
+
+ @SuppressLint("DefaultLocale")
+ private void optionAbout() {
+ // About
+ Dialog dlgAbout = new Dialog(this);
+ dlgAbout.requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ dlgAbout.setTitle(R.string.menu_about);
+ dlgAbout.setContentView(R.layout.about);
+ dlgAbout.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, getThemed(R.attr.icon_launcher));
+
+ // Show version
+ try {
+ int userId = Util.getUserId(Process.myUid());
+ Version currentVersion = new Version(Util.getSelfVersionName(this));
+ Version storedVersion = new Version(
+ PrivacyManager.getSetting(userId, PrivacyManager.cSettingVersion, "0.0"));
+ boolean migrated = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingMigrated, false);
+ String versionName = currentVersion.toString();
+ if (currentVersion.compareTo(storedVersion) != 0)
+ versionName += "/" + storedVersion.toString();
+ if (!migrated)
+ versionName += "!";
+ int versionCode = Util.getSelfVersionCode(this);
+ TextView tvVersion = (TextView) dlgAbout.findViewById(R.id.tvVersion);
+ tvVersion.setText(String.format(getString(R.string.app_version), versionName, versionCode));
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+
+ if (!PrivacyManager.cVersion3 || Hook.isAOSP(19))
+ ((TextView) dlgAbout.findViewById(R.id.tvCompatibility)).setVisibility(View.GONE);
+
+ // Show license
+ String licensed = Util.hasProLicense(this);
+ TextView tvLicensed1 = (TextView) dlgAbout.findViewById(R.id.tvLicensed);
+ TextView tvLicensed2 = (TextView) dlgAbout.findViewById(R.id.tvLicensedAlt);
+ if (licensed == null) {
+ tvLicensed1.setText(Environment.getExternalStorageDirectory().getAbsolutePath());
+ tvLicensed2.setText(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
+ .getAbsolutePath());
+ } else {
+ tvLicensed1.setText(String.format(getString(R.string.app_licensed), licensed));
+ tvLicensed2.setVisibility(View.GONE);
+ }
+
+ // Show some build properties
+ String android = String.format("%s (%d)", Build.VERSION.RELEASE, Build.VERSION.SDK_INT);
+ ((TextView) dlgAbout.findViewById(R.id.tvAndroid)).setText(android);
+ ((TextView) dlgAbout.findViewById(R.id.build_brand)).setText(Build.BRAND);
+ ((TextView) dlgAbout.findViewById(R.id.build_manufacturer)).setText(Build.MANUFACTURER);
+ ((TextView) dlgAbout.findViewById(R.id.build_model)).setText(Build.MODEL);
+ ((TextView) dlgAbout.findViewById(R.id.build_product)).setText(Build.PRODUCT);
+ ((TextView) dlgAbout.findViewById(R.id.build_device)).setText(Build.DEVICE);
+ ((TextView) dlgAbout.findViewById(R.id.build_host)).setText(Build.HOST);
+ ((TextView) dlgAbout.findViewById(R.id.build_display)).setText(Build.DISPLAY);
+ ((TextView) dlgAbout.findViewById(R.id.build_id)).setText(Build.ID);
+
+ dlgAbout.setCancelable(true);
+
+ final int userId = Util.getUserId(Process.myUid());
+ if (PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingFirstRun, true))
+ dlgAbout.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ Dialog dlgUsage = new Dialog(ActivityMain.this);
+ dlgUsage.requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ dlgUsage.setTitle(R.string.app_name);
+ dlgUsage.setContentView(R.layout.usage);
+ dlgUsage.setFeatureDrawableResource(Window.FEATURE_LEFT_ICON, getThemed(R.attr.icon_launcher));
+ dlgUsage.setCancelable(true);
+ dlgUsage.setOnDismissListener(new DialogInterface.OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingFirstRun, Boolean.FALSE.toString());
+ optionLegend();
+ }
+ });
+ dlgUsage.show();
+ }
+ });
+
+ dlgAbout.show();
+ }
+
+ // Tasks
+
+ private class AppListTask extends AsyncTask> {
+ private String mRestrictionName;
+ private ProgressDialog mProgressDialog;
+
+ @Override
+ protected List doInBackground(Object... params) {
+ mRestrictionName = null;
+
+ // Delegate
+ return ApplicationInfoEx.getXApplicationList(ActivityMain.this, mProgressDialog);
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+
+ TypedArray ta = getTheme().obtainStyledAttributes(new int[] { R.attr.progress_horizontal });
+ int progress_horizontal = ta.getResourceId(0, 0);
+ ta.recycle();
+
+ // Show progress dialog
+ mProgressDialog = new ProgressDialog(ActivityMain.this);
+ mProgressDialog.setMessage(getString(R.string.msg_loading));
+ mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ mProgressDialog.setProgressDrawable(getResources().getDrawable(progress_horizontal));
+ mProgressDialog.setProgressNumberFormat(null);
+ mProgressDialog.setCancelable(false);
+ mProgressDialog.setCanceledOnTouchOutside(false);
+ mProgressDialog.show();
+ }
+
+ @Override
+ protected void onPostExecute(List listApp) {
+ if (!ActivityMain.this.isFinishing()) {
+ // Display app list
+ mAppAdapter = new AppListAdapter(ActivityMain.this, R.layout.mainentry, listApp, mRestrictionName);
+ ListView lvApp = (ListView) findViewById(R.id.lvApp);
+ lvApp.setAdapter(mAppAdapter);
+
+ // Dismiss progress dialog
+ if (mProgressDialog.isShowing())
+ try {
+ mProgressDialog.dismiss();
+ } catch (IllegalArgumentException ignored) {
+ }
+
+ // Restore state
+ ActivityMain.this.selectRestriction(spRestriction.getSelectedItemPosition());
+ }
+
+ super.onPostExecute(listApp);
+ }
+ }
+
+ // Adapters
+
+ private class SpinnerAdapter extends ArrayAdapter {
+ public SpinnerAdapter(Context context, int textViewResourceId) {
+ super(context, textViewResourceId);
+ }
+ }
+
+ @SuppressLint("DefaultLocale")
+ private class TemplateListAdapter extends BaseExpandableListAdapter {
+ private View mView;
+ private Spinner mSpinner;
+ private List listRestrictionName;
+ private List listLocalizedTitle;
+ private boolean ondemand;
+ private Version version;
+ private LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ public TemplateListAdapter(Context context, View view, int resource) {
+ mView = view;
+ mSpinner = (Spinner) view.findViewById(R.id.spTemplate);
+
+ // Get restriction categories
+ TreeMap tmRestriction = PrivacyManager.getRestrictions(context);
+ listRestrictionName = new ArrayList(tmRestriction.values());
+ listLocalizedTitle = new ArrayList(tmRestriction.navigableKeySet());
+
+ int userId = Util.getUserId(Process.myUid());
+ ondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ version = new Version(Util.getSelfVersionName(context));
+ }
+
+ private String getTemplate() {
+ if (mSpinner.getSelectedItemPosition() == 0)
+ return Meta.cTypeTemplate;
+ else
+ return Meta.cTypeTemplate + mSpinner.getSelectedItemPosition();
+ }
+
+ private class ViewHolder {
+ private View row;
+ public ImageView imgIndicator;
+ public ImageView imgInfo;
+ public TextView tvRestriction;
+ public ImageView imgUnsafe;
+ public ImageView imgCbRestrict;
+ public ImageView imgCbAsk;
+ public boolean restricted;
+ public boolean asked;
+
+ public ViewHolder(View theRow) {
+ row = theRow;
+ imgIndicator = (ImageView) row.findViewById(R.id.imgIndicator);
+ imgInfo = (ImageView) row.findViewById(R.id.imgInfo);
+ tvRestriction = (TextView) row.findViewById(R.id.tvRestriction);
+ imgUnsafe = (ImageView) row.findViewById(R.id.imgUnsafe);
+ imgCbRestrict = (ImageView) row.findViewById(R.id.imgCbRestrict);
+ imgCbAsk = (ImageView) row.findViewById(R.id.imgCbAsk);
+ }
+ }
+
+ @Override
+ public Object getGroup(int groupPosition) {
+ return listRestrictionName.get(groupPosition);
+ }
+
+ @Override
+ public int getGroupCount() {
+ return listRestrictionName.size();
+ }
+
+ @Override
+ public long getGroupId(int groupPosition) {
+ return groupPosition;
+ }
+
+ @Override
+ @SuppressLint("InflateParams")
+ public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
+ final ViewHolder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.templateentry, null);
+ holder = new ViewHolder(convertView);
+ convertView.setTag(holder);
+ } else
+ holder = (ViewHolder) convertView.getTag();
+
+ // Get entry
+ final String restrictionName = (String) getGroup(groupPosition);
+
+ // Get info
+ final int userId = Util.getUserId(Process.myUid());
+ String value = PrivacyManager.getSetting(userId, getTemplate(), restrictionName,
+ Boolean.toString(!ondemand) + "+ask");
+ holder.restricted = value.contains("true");
+ holder.asked = (!ondemand || value.contains("asked"));
+
+ boolean partialRestricted = false;
+ boolean partialAsked = false;
+ if (holder.restricted || !holder.asked)
+ for (Hook hook : PrivacyManager.getHooks(restrictionName, version)) {
+ String settingName = restrictionName + "." + hook.getName();
+ String childValue = PrivacyManager.getSetting(userId, getTemplate(), settingName, null);
+ if (childValue == null)
+ childValue = Boolean.toString(holder.restricted && !hook.isDangerous())
+ + (holder.asked || (hook.isDangerous() && hook.whitelist() == null) ? "+asked" : "+ask");
+ if (!childValue.contains("true"))
+ partialRestricted = true;
+ if (childValue.contains("asked"))
+ partialAsked = true;
+ }
+
+ Bitmap bmRestricted = (holder.restricted ? partialRestricted ? getHalfCheckBox() : getFullCheckBox()
+ : getOffCheckBox());
+ Bitmap bmAsked = (holder.asked ? getOffCheckBox() : partialAsked ? getHalfCheckBox()
+ : getOnDemandCheckBox());
+
+ // Indicator state
+ holder.imgIndicator.setImageResource(getThemed(isExpanded ? R.attr.icon_expander_maximized
+ : R.attr.icon_expander_minimized));
+ holder.imgIndicator.setVisibility(View.VISIBLE);
+ holder.imgInfo.setVisibility(View.GONE);
+ holder.imgUnsafe.setVisibility(View.GONE);
+
+ // Set data
+ holder.tvRestriction.setTypeface(null, Typeface.BOLD);
+ holder.tvRestriction.setText(listLocalizedTitle.get(groupPosition));
+ holder.imgCbRestrict.setImageBitmap(bmRestricted);
+ holder.imgCbAsk.setImageBitmap(bmAsked);
+ holder.imgCbAsk.setVisibility(ondemand ? View.VISIBLE : View.GONE);
+
+ holder.imgCbRestrict.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ // Update setting
+ holder.restricted = !holder.restricted;
+ PrivacyManager.setSetting(userId, getTemplate(), restrictionName, (holder.restricted ? "true"
+ : "false") + "+" + (holder.asked ? "asked" : "ask"));
+ notifyDataSetChanged(); // update childs
+ }
+ });
+
+ holder.imgCbAsk.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View arg0) {
+ // Update setting
+ holder.asked = (!ondemand || !holder.asked);
+ PrivacyManager.setSetting(userId, getTemplate(), restrictionName, (holder.restricted ? "true"
+ : "false") + "+" + (holder.asked ? "asked" : "ask"));
+ notifyDataSetChanged(); // update childs
+ }
+ });
+
+ return convertView;
+ }
+
+ @Override
+ public Object getChild(int groupPosition, int childPosition) {
+ return PrivacyManager.getHooks((String) getGroup(groupPosition), version).get(childPosition);
+ }
+
+ @Override
+ public long getChildId(int groupPosition, int childPosition) {
+ return childPosition;
+ }
+
+ @Override
+ public int getChildrenCount(int groupPosition) {
+ return PrivacyManager.getHooks((String) getGroup(groupPosition), version).size();
+ }
+
+ @Override
+ public boolean isChildSelectable(int groupPosition, int childPosition) {
+ return false;
+ }
+
+ @Override
+ @SuppressLint("InflateParams")
+ public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,
+ ViewGroup parent) {
+ final ViewHolder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.templateentry, null);
+ holder = new ViewHolder(convertView);
+ convertView.setTag(holder);
+ } else
+ holder = (ViewHolder) convertView.getTag();
+
+ // Get entry
+ final int userId = Util.getUserId(Process.myUid());
+ final String restrictionName = (String) getGroup(groupPosition);
+ final Hook hook = (Hook) getChild(groupPosition, childPosition);
+ final String settingName = restrictionName + "." + hook.getName();
+
+ // Get parent info
+ String parentValue = PrivacyManager.getSetting(userId, getTemplate(), restrictionName,
+ Boolean.toString(!ondemand) + "+ask");
+ boolean parentRestricted = parentValue.contains("true");
+ boolean parentAsked = (!ondemand || parentValue.contains("asked"));
+
+ // Get child info
+ String value = PrivacyManager.getSetting(userId, getTemplate(), settingName, null);
+ // This is to circumvent caching problems
+ // The child value depends on the parent value
+ if (value == null)
+ value = Boolean.toString(parentRestricted && !hook.isDangerous())
+ + (parentAsked || (hook.isDangerous() && hook.whitelist() == null) ? "+asked" : "+ask");
+ holder.restricted = value.contains("true");
+ holder.asked = (!ondemand || value.contains("asked"));
+ Bitmap bmRestricted = (parentRestricted && holder.restricted ? getFullCheckBox() : getOffCheckBox());
+ Bitmap bmAsked = (parentAsked || holder.asked ? getOffCheckBox() : getOnDemandCheckBox());
+
+ // Set indicator
+ holder.imgIndicator.setVisibility(View.INVISIBLE);
+
+ // Function help
+ if (hook.getAnnotation() == null)
+ holder.imgInfo.setVisibility(View.GONE);
+ else {
+ holder.imgInfo.setVisibility(View.VISIBLE);
+ holder.imgInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ ActivityApp.showHelp(ActivityMain.this, mView, hook);
+ }
+ });
+ }
+ holder.imgUnsafe.setVisibility(hook.isUnsafe() ? View.VISIBLE : View.GONE);
+
+ // Set data
+ if (hook.isDangerous())
+ holder.row.setBackgroundColor(getResources().getColor(
+ getThemed(hook.isDangerousDefined() ? R.attr.color_dangerous : R.attr.color_dangerous_user)));
+ else
+ holder.row.setBackgroundColor(hook.isDangerousDefined() ? getResources().getColor(
+ getThemed(R.attr.color_dangerous_off)) : Color.TRANSPARENT);
+ holder.tvRestriction.setText(hook.getName());
+ holder.imgCbRestrict.setEnabled(parentRestricted);
+ holder.imgCbRestrict.setImageBitmap(bmRestricted);
+ holder.imgCbAsk.setEnabled(!parentAsked);
+ holder.imgCbAsk.setImageBitmap(bmAsked);
+ holder.imgCbAsk.setVisibility(ondemand ? View.VISIBLE : View.GONE);
+
+ // Listen for long press
+ if (Util.getUserId(Process.myUid()) == 0)
+ holder.tvRestriction.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ hook.toggleDangerous();
+
+ // Change background color
+ if (hook.isDangerous())
+ holder.row.setBackgroundColor(getResources().getColor(
+ getThemed(hook.isDangerousDefined() ? R.attr.color_dangerous
+ : R.attr.color_dangerous_user)));
+ else
+ holder.row.setBackgroundColor(hook.isDangerousDefined() ? getResources().getColor(
+ getThemed(R.attr.color_dangerous_off)) : Color.TRANSPARENT);
+
+ notifyDataSetChanged();
+
+ return true;
+ }
+ });
+
+ holder.imgCbRestrict.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ // Update setting
+ holder.restricted = !holder.restricted;
+ PrivacyManager.setSetting(userId, getTemplate(), settingName,
+ (holder.restricted ? "true" : "false") + "+" + (holder.asked ? "asked" : "ask"));
+ notifyDataSetChanged(); // update parent
+ }
+ });
+
+ holder.imgCbAsk.setOnClickListener(new OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ // Update setting
+ holder.asked = !holder.asked;
+ PrivacyManager.setSetting(userId, getTemplate(), settingName,
+ (holder.restricted ? "true" : "false") + "+" + (holder.asked ? "asked" : "ask"));
+ notifyDataSetChanged(); // update parent
+ }
+ });
+
+ return convertView;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return true;
+ }
+ }
+
+ @SuppressLint("DefaultLocale")
+ private class AppListAdapter extends ArrayAdapter {
+ private Context mContext;
+ private boolean mSelecting = false;
+ private List mListAppAll;
+ private List mListAppSelected = new ArrayList();
+ private String mRestrictionName;
+ private Version mVersion;
+ private LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ private AtomicInteger mFiltersRunning = new AtomicInteger(0);
+ private int mHighlightColor;
+
+ public final static int cSelectAppAll = 1;
+ public final static int cSelectAppNone = 2;
+
+ public AppListAdapter(Context context, int resource, List objects,
+ String initialRestrictionName) {
+ super(context, resource, objects);
+ mContext = context;
+ mListAppAll = new ArrayList();
+ mListAppAll.addAll(objects);
+ mRestrictionName = initialRestrictionName;
+ mVersion = new Version(Util.getSelfVersionName(context));
+
+ TypedArray ta1 = context.getTheme().obtainStyledAttributes(
+ new int[] { android.R.attr.colorPressedHighlight });
+ mHighlightColor = ta1.getColor(0, 0xFF00FF);
+ ta1.recycle();
+ }
+
+ public void setRestrictionName(String restrictionName) {
+ mRestrictionName = restrictionName;
+ }
+
+ public String getRestrictionName() {
+ return mRestrictionName;
+ }
+
+ public List getSelectedOrVisible(int flags) {
+ if (mListAppSelected.size() > 0)
+ return mListAppSelected;
+ else {
+ if (flags == cSelectAppAll)
+ return mListAppAll;
+ else {
+ List listApp = new ArrayList();
+ if (flags != cSelectAppNone)
+ for (int i = 0; i < this.getCount(); i++)
+ listApp.add(this.getItem(i));
+ return listApp;
+ }
+ }
+ }
+
+ public int[] getSelectedOrVisibleUid(int flags) {
+ List listAppInfo = getSelectedOrVisible(flags);
+ int[] uid = new int[listAppInfo.size()];
+ for (int pos = 0; pos < listAppInfo.size(); pos++)
+ uid[pos] = listAppInfo.get(pos).getUid();
+ return uid;
+ }
+
+ public void selectAllVisible() {
+ // Look through the visible apps to figure out what to do
+ mSelecting = false;
+ for (int i = 0; i < this.getCount(); i++) {
+ if (!mListAppSelected.contains(this.getItem(i))) {
+ mSelecting = true;
+ break;
+ }
+ }
+
+ if (mSelecting) {
+ // Add the visible apps not already selected
+ for (int i = 0; i < this.getCount(); i++)
+ if (!mListAppSelected.contains(this.getItem(i)))
+ mListAppSelected.add(this.getItem(i));
+ } else
+ mListAppSelected.clear();
+
+ this.showStats();
+ this.notifyDataSetChanged();
+ }
+
+ public void showStats() {
+ TextView tvStats = (TextView) findViewById(R.id.tvStats);
+ String stats = String.format("%d/%d", this.getCount(), mListAppAll.size());
+ if (mListAppSelected.size() > 0)
+ stats += String.format(" (%d)", mListAppSelected.size());
+ tvStats.setText(stats);
+ }
+
+ @Override
+ public Filter getFilter() {
+ return new AppFilter();
+ }
+
+ private class AppFilter extends Filter {
+ public AppFilter() {
+ }
+
+ @Override
+ protected FilterResults performFiltering(CharSequence constraint) {
+ int userId = Util.getUserId(Process.myUid());
+
+ int filtersRunning = mFiltersRunning.addAndGet(1);
+ FilterResults results = new FilterResults();
+
+ // Get arguments
+ String[] components = ((String) constraint).split("\\n");
+ String fName = components[0];
+ boolean fUsed = Boolean.parseBoolean(components[1]);
+ boolean fInternet = Boolean.parseBoolean(components[2]);
+ boolean fRestricted = Boolean.parseBoolean(components[3]);
+ boolean fRestrictedNot = Boolean.parseBoolean(components[4]);
+ boolean fPermission = Boolean.parseBoolean(components[5]);
+ boolean fOnDemand = Boolean.parseBoolean(components[6]);
+ boolean fOnDemandNot = Boolean.parseBoolean(components[7]);
+ boolean fUser = Boolean.parseBoolean(components[8]);
+ boolean fSystem = Boolean.parseBoolean(components[9]);
+
+ // Match applications
+ int current = 0;
+ int max = AppListAdapter.this.mListAppAll.size();
+ List lstApp = new ArrayList();
+ for (ApplicationInfoEx xAppInfo : AppListAdapter.this.mListAppAll) {
+ // Check if another filter has been started
+ if (filtersRunning != mFiltersRunning.get())
+ return null;
+
+ // Send progress info to main activity
+ current++;
+ if (current % 5 == 0) {
+ final int position = current;
+ final int maximum = max;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ setProgress(getString(R.string.msg_applying), position, maximum);
+ }
+ });
+ }
+
+ // Get if name contains
+ boolean contains = false;
+ if (!fName.equals(""))
+ contains = (xAppInfo.toString().toLowerCase().contains(((String) fName).toLowerCase()));
+
+ // Get if used
+ boolean used = false;
+ if (fUsed)
+ used = (PrivacyManager.getUsage(xAppInfo.getUid(), mRestrictionName, null) != 0);
+
+ // Get if internet
+ boolean internet = false;
+ if (fInternet)
+ internet = xAppInfo.hasInternet(mContext);
+
+ // Get some restricted
+ boolean someRestricted = false;
+ if (fRestricted)
+ for (PRestriction restriction : PrivacyManager.getRestrictionList(xAppInfo.getUid(),
+ mRestrictionName))
+ if (restriction.restricted) {
+ someRestricted = true;
+ break;
+ }
+
+ // Get Android permission
+ boolean permission = false;
+ if (fPermission)
+ if (mRestrictionName == null)
+ permission = true;
+ else if (PrivacyManager.hasPermission(mContext, xAppInfo, mRestrictionName, mVersion)
+ || PrivacyManager.getUsage(xAppInfo.getUid(), mRestrictionName, null) > 0)
+ permission = true;
+
+ // Get if onDemand
+ boolean onDemand = false;
+ boolean isApp = PrivacyManager.isApplication(xAppInfo.getUid());
+ boolean odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem,
+ false);
+ boolean gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ if (fOnDemand && (isApp || odSystem) && gondemand) {
+ onDemand = PrivacyManager.getSettingBool(-xAppInfo.getUid(), PrivacyManager.cSettingOnDemand,
+ false);
+ if (onDemand && mRestrictionName != null)
+ onDemand = !PrivacyManager.getRestrictionEx(xAppInfo.getUid(), mRestrictionName, null).asked;
+ }
+
+ // Get if user
+ boolean user = false;
+ if (fUser)
+ user = !xAppInfo.isSystem();
+
+ // Get if system
+ boolean system = false;
+ if (fSystem)
+ system = xAppInfo.isSystem();
+
+ // Apply filters
+ if ((fName.equals("") ? true : contains) && (fUsed ? used : true) && (fInternet ? internet : true)
+ && (fRestricted ? (fRestrictedNot ? !someRestricted : someRestricted) : true)
+ && (fPermission ? permission : true)
+ && (fOnDemand ? (fOnDemandNot ? !onDemand : onDemand) : true) && (fUser ? user : true)
+ && (fSystem ? system : true))
+ lstApp.add(xAppInfo);
+ }
+
+ // Check again whether another filter has been started
+ if (filtersRunning != mFiltersRunning.get())
+ return null;
+
+ // Apply current sorting
+ Collections.sort(lstApp, mSorter);
+
+ // Last check whether another filter has been started
+ if (filtersRunning != mFiltersRunning.get())
+ return null;
+
+ synchronized (this) {
+ results.values = lstApp;
+ results.count = lstApp.size();
+ }
+
+ return results;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ protected void publishResults(CharSequence constraint, FilterResults results) {
+ if (results != null) {
+ clear();
+ TextView tvStats = (TextView) findViewById(R.id.tvStats);
+ TextView tvState = (TextView) findViewById(R.id.tvState);
+ ProgressBar pbFilter = (ProgressBar) findViewById(R.id.pbFilter);
+ pbFilter.setVisibility(ProgressBar.GONE);
+ tvStats.setVisibility(TextView.VISIBLE);
+
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ setProgress(getString(R.string.title_restrict), 0, 1);
+ }
+ });
+
+ // Adjust progress state width
+ RelativeLayout.LayoutParams tvStateLayout = (RelativeLayout.LayoutParams) tvState.getLayoutParams();
+ tvStateLayout.addRule(RelativeLayout.LEFT_OF, R.id.tvStats);
+
+ if (results.values == null)
+ notifyDataSetInvalidated();
+ else {
+ addAll((ArrayList) results.values);
+ notifyDataSetChanged();
+ }
+ AppListAdapter.this.showStats();
+ }
+ }
+ }
+
+ public void sort() {
+ sort(mSorter);
+ }
+
+ private class ViewHolder {
+ private View row;
+ private int position;
+ public View vwState;
+ public LinearLayout llAppType;
+ public ImageView imgIcon;
+ public ImageView imgUsed;
+ public ImageView imgGranted;
+ public ImageView imgInternet;
+ public ImageView imgFrozen;
+ public ImageView imgSettings;
+ public LinearLayout llName;
+ public TextView tvName;
+ public ImageView imgCbRestricted;
+ public ProgressBar pbRunning;
+ public ImageView imgCbAsk;
+
+ public ViewHolder(View theRow, int thePosition) {
+ row = theRow;
+ position = thePosition;
+ vwState = (View) row.findViewById(R.id.vwState);
+ llAppType = (LinearLayout) row.findViewById(R.id.llAppType);
+ imgIcon = (ImageView) row.findViewById(R.id.imgIcon);
+ imgUsed = (ImageView) row.findViewById(R.id.imgUsed);
+ imgGranted = (ImageView) row.findViewById(R.id.imgGranted);
+ imgInternet = (ImageView) row.findViewById(R.id.imgInternet);
+ imgFrozen = (ImageView) row.findViewById(R.id.imgFrozen);
+ imgSettings = (ImageView) row.findViewById(R.id.imgSettings);
+ llName = (LinearLayout) row.findViewById(R.id.llName);
+ tvName = (TextView) row.findViewById(R.id.tvName);
+ imgCbRestricted = (ImageView) row.findViewById(R.id.imgCbRestricted);
+ pbRunning = (ProgressBar) row.findViewById(R.id.pbRunning);
+ imgCbAsk = (ImageView) row.findViewById(R.id.imgCbAsk);
+ }
+ }
+
+ private class HolderTask extends AsyncTask {
+ private int position;
+ private ViewHolder holder;
+ private ApplicationInfoEx xAppInfo = null;
+ private int state;
+ private Bitmap bicon;
+ private Drawable dicon;
+ private boolean used;
+ private boolean enabled;
+ private boolean granted;
+ private boolean settings;
+ private RState rstate;
+ private boolean gondemand;
+ private boolean ondemand;
+ private boolean can;
+ private boolean methodExpert;
+
+ public HolderTask(int thePosition, ViewHolder theHolder, ApplicationInfoEx theAppInfo) {
+ position = thePosition;
+ holder = theHolder;
+ xAppInfo = theAppInfo;
+ }
+
+ @Override
+ protected Object doInBackground(Object... params) {
+ if (xAppInfo != null) {
+ int userId = Util.getUserId(Process.myUid());
+
+ // Get state
+ state = xAppInfo.getState(ActivityMain.this);
+
+ // Get icon
+ bicon = xAppInfo.getIconBitmap(ActivityMain.this);
+ if (bicon == null)
+ dicon = xAppInfo.getIcon(ActivityMain.this);
+
+ // Get if used
+ used = (PrivacyManager.getUsage(xAppInfo.getUid(), mRestrictionName, null) != 0);
+
+ // Get if enabled
+ enabled = PrivacyManager.getSettingBool(xAppInfo.getUid(), PrivacyManager.cSettingRestricted, true);
+
+ // Get if on demand
+ gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ boolean isApp = PrivacyManager.isApplication(xAppInfo.getUid());
+ boolean odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem,
+ false);
+ ondemand = (isApp || odSystem);
+ if (ondemand && mRestrictionName != null)
+ ondemand = PrivacyManager.getSettingBool(-xAppInfo.getUid(), PrivacyManager.cSettingOnDemand,
+ false);
+
+ // Get if granted
+ granted = true;
+ if (mRestrictionName != null)
+ if (!PrivacyManager.hasPermission(ActivityMain.this, xAppInfo, mRestrictionName, mVersion))
+ granted = false;
+
+ // Get if application settings
+ settings = PrivacyManager.hasSpecificSettings(xAppInfo.getUid());
+
+ // Get restriction/ask state
+ rstate = new RState(xAppInfo.getUid(), mRestrictionName, null, mVersion);
+
+ // Get can restrict
+ can = PrivacyManager.canRestrict(rstate.mUid, Process.myUid(), rstate.mRestrictionName,
+ rstate.mMethodName, true);
+ methodExpert = (mRestrictionName == null || PrivacyManager.getSettingBool(userId,
+ PrivacyManager.cSettingMethodExpert, false));
+
+ return holder;
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (holder.position == position && result != null) {
+ // Set background color
+ if (xAppInfo.isSystem())
+ holder.llAppType.setBackgroundColor(getResources().getColor(getThemed(R.attr.color_dangerous)));
+ else
+ holder.llAppType.setBackgroundColor(Color.TRANSPARENT);
+
+ // Display state
+ if (state == ApplicationInfoEx.STATE_ATTENTION)
+ holder.vwState.setBackgroundColor(getResources().getColor(
+ getThemed(R.attr.color_state_attention)));
+ else if (state == ApplicationInfoEx.STATE_SHARED)
+ holder.vwState
+ .setBackgroundColor(getResources().getColor(getThemed(R.attr.color_state_shared)));
+ else
+ holder.vwState.setBackgroundColor(getResources().getColor(
+ getThemed(R.attr.color_state_restricted)));
+
+ // Display icon
+ if (bicon == null)
+ holder.imgIcon.setImageDrawable(dicon);
+ else
+ holder.imgIcon.setImageBitmap(bicon);
+ holder.imgIcon.setVisibility(View.VISIBLE);
+
+ // Display on demand
+ if (gondemand) {
+ if (ondemand) {
+ holder.imgCbAsk.setImageBitmap(getAskBoxImage(rstate, methodExpert));
+ holder.imgCbAsk.setVisibility(View.VISIBLE);
+ } else
+ holder.imgCbAsk.setVisibility(View.INVISIBLE);
+ } else
+ holder.imgCbAsk.setVisibility(View.GONE);
+
+ // Display usage
+ holder.tvName.setTypeface(null, used ? Typeface.BOLD_ITALIC : Typeface.NORMAL);
+ holder.imgUsed.setVisibility(used ? View.VISIBLE : View.INVISIBLE);
+
+ // Display if permissions
+ holder.imgGranted.setVisibility(granted ? View.VISIBLE : View.INVISIBLE);
+
+ // Display if internet access
+ holder.imgInternet.setVisibility(xAppInfo.hasInternet(ActivityMain.this) ? View.VISIBLE
+ : View.INVISIBLE);
+
+ // Display if frozen
+ holder.imgFrozen
+ .setVisibility(xAppInfo.isFrozen(ActivityMain.this) ? View.VISIBLE : View.INVISIBLE);
+
+ // Display if settings
+ holder.imgSettings.setVisibility(settings ? View.VISIBLE : View.GONE);
+
+ // Display restriction
+ holder.imgCbRestricted.setImageBitmap(getCheckBoxImage(rstate, methodExpert));
+ holder.imgCbRestricted.setVisibility(View.VISIBLE);
+
+ // Display enabled state
+ holder.tvName.setEnabled(enabled && can);
+ holder.imgCbRestricted.setEnabled(enabled && can);
+ holder.imgCbAsk.setEnabled(enabled && can);
+
+ // Display selection
+ if (mListAppSelected.contains(xAppInfo))
+ holder.row.setBackgroundColor(mHighlightColor);
+ else
+ holder.row.setBackgroundColor(Color.TRANSPARENT);
+
+ // Handle details click
+ holder.imgIcon.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Intent intentSettings = new Intent(ActivityMain.this, ActivityApp.class);
+ intentSettings.putExtra(ActivityApp.cUid, xAppInfo.getUid());
+ intentSettings.putExtra(ActivityApp.cRestrictionName, mRestrictionName);
+ ActivityMain.this.startActivity(intentSettings);
+ }
+ });
+
+ // Listen for restriction changes
+ holder.imgCbRestricted.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ if (mRestrictionName == null && rstate.restricted != false) {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityMain.this);
+ alertDialogBuilder.setTitle(R.string.menu_clear_all);
+ alertDialogBuilder.setMessage(R.string.msg_sure);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(getString(android.R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ deleteRestrictions();
+ }
+ });
+ alertDialogBuilder.setNegativeButton(getString(android.R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ } else
+ toggleRestrictions();
+ }
+ });
+
+ // Listen for ask changes
+ if (gondemand && ondemand)
+ holder.imgCbAsk.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ holder.imgCbAsk.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+
+ new AsyncTask() {
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ rstate.toggleAsked();
+ rstate = new RState(xAppInfo.getUid(), mRestrictionName, null, mVersion);
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ holder.imgCbAsk.setImageBitmap(getAskBoxImage(rstate, methodExpert));
+ holder.pbRunning.setVisibility(View.GONE);
+ holder.imgCbAsk.setVisibility(View.VISIBLE);
+ }
+ }.executeOnExecutor(mExecutor);
+ }
+ });
+ else
+ holder.imgCbAsk.setClickable(false);
+ }
+ }
+
+ private void deleteRestrictions() {
+ holder.imgCbRestricted.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+
+ new AsyncTask() {
+ private List oldState;
+
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ // Update restriction
+ oldState = PrivacyManager.getRestartStates(xAppInfo.getUid(), mRestrictionName);
+ PrivacyManager.deleteRestrictions(xAppInfo.getUid(), null, true);
+ PrivacyManager.setSetting(xAppInfo.getUid(), PrivacyManager.cSettingOnDemand,
+ Boolean.toString(true));
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ // Update visible state
+ holder.vwState.setBackgroundColor(getResources().getColor(
+ getThemed(R.attr.color_state_attention)));
+
+ // Update stored state
+ rstate = new RState(xAppInfo.getUid(), mRestrictionName, null, mVersion);
+ holder.imgCbRestricted.setImageBitmap(getCheckBoxImage(rstate, methodExpert));
+ holder.imgCbAsk.setImageBitmap(getAskBoxImage(rstate, methodExpert));
+
+ // Notify restart
+ if (oldState.contains(true))
+ Toast.makeText(ActivityMain.this, getString(R.string.msg_restart), Toast.LENGTH_LONG)
+ .show();
+
+ // Display new state
+ showState();
+
+ holder.pbRunning.setVisibility(View.GONE);
+ holder.imgCbRestricted.setVisibility(View.VISIBLE);
+ }
+ }.executeOnExecutor(mExecutor);
+ }
+
+ private void toggleRestrictions() {
+ holder.imgCbRestricted.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+
+ new AsyncTask() {
+ private List oldState;
+ private List newState;
+
+ @Override
+ protected Object doInBackground(Object... arg0) {
+ // Change restriction
+ oldState = PrivacyManager.getRestartStates(xAppInfo.getUid(), mRestrictionName);
+ rstate.toggleRestriction();
+ newState = PrivacyManager.getRestartStates(xAppInfo.getUid(), mRestrictionName);
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ // Update restriction display
+ rstate = new RState(xAppInfo.getUid(), mRestrictionName, null, mVersion);
+ holder.imgCbRestricted.setImageBitmap(getCheckBoxImage(rstate, methodExpert));
+ holder.imgCbAsk.setImageBitmap(getAskBoxImage(rstate, methodExpert));
+
+ // Notify restart
+ if (!newState.equals(oldState))
+ Toast.makeText(ActivityMain.this, getString(R.string.msg_restart), Toast.LENGTH_LONG)
+ .show();
+
+ // Display new state
+ showState();
+
+ holder.pbRunning.setVisibility(View.GONE);
+ holder.imgCbRestricted.setVisibility(View.VISIBLE);
+ }
+ }.executeOnExecutor(mExecutor);
+ }
+
+ private void showState() {
+ state = xAppInfo.getState(ActivityMain.this);
+ if (state == ApplicationInfoEx.STATE_ATTENTION)
+ holder.vwState.setBackgroundColor(getResources().getColor(getThemed(R.attr.color_state_attention)));
+ else if (state == ApplicationInfoEx.STATE_SHARED)
+ holder.vwState.setBackgroundColor(getResources().getColor(getThemed(R.attr.color_state_shared)));
+ else
+ holder.vwState
+ .setBackgroundColor(getResources().getColor(getThemed(R.attr.color_state_restricted)));
+ }
+ }
+
+ @Override
+ @SuppressLint("InflateParams")
+ public View getView(int position, View convertView, ViewGroup parent) {
+ final ViewHolder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.mainentry, null);
+ holder = new ViewHolder(convertView, position);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ holder.position = position;
+ }
+
+ // Get info
+ final ApplicationInfoEx xAppInfo = getItem(holder.position);
+
+ // Set data
+ holder.row.setBackgroundColor(Color.TRANSPARENT);
+ holder.vwState.setBackgroundColor(Color.TRANSPARENT);
+ holder.llAppType.setBackgroundColor(Color.TRANSPARENT);
+ holder.imgIcon.setVisibility(View.INVISIBLE);
+ holder.tvName.setText(xAppInfo.toString());
+ holder.tvName.setTypeface(null, Typeface.NORMAL);
+ holder.imgUsed.setVisibility(View.INVISIBLE);
+ holder.imgGranted.setVisibility(View.INVISIBLE);
+ holder.imgInternet.setVisibility(View.INVISIBLE);
+ holder.imgFrozen.setVisibility(View.INVISIBLE);
+ holder.imgSettings.setVisibility(View.GONE);
+ holder.imgCbRestricted.setVisibility(View.INVISIBLE);
+ holder.imgCbAsk.setVisibility(View.INVISIBLE);
+ holder.tvName.setEnabled(false);
+ holder.imgCbRestricted.setEnabled(false);
+
+ holder.imgIcon.setClickable(false);
+ holder.imgCbRestricted.setClickable(false);
+ holder.imgCbAsk.setClickable(false);
+
+ // Listen for multiple select
+ holder.llName.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ if (mListAppSelected.contains(xAppInfo)) {
+ mSelecting = false;
+ mListAppSelected.clear();
+ mAppAdapter.notifyDataSetChanged();
+ } else {
+ mSelecting = true;
+ mListAppSelected.add(xAppInfo);
+ holder.row.setBackgroundColor(mHighlightColor);
+ }
+ showStats();
+ return true;
+ }
+ });
+
+ // Listen for application selection
+ holder.llName.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(final View view) {
+ if (mSelecting) {
+ if (mListAppSelected.contains(xAppInfo)) {
+ mListAppSelected.remove(xAppInfo);
+ holder.row.setBackgroundColor(Color.TRANSPARENT);
+ if (mListAppSelected.size() == 0)
+ mSelecting = false;
+ } else {
+ mListAppSelected.add(xAppInfo);
+ holder.row.setBackgroundColor(mHighlightColor);
+ }
+ showStats();
+ } else {
+ Intent intentSettings = new Intent(ActivityMain.this, ActivityApp.class);
+ intentSettings.putExtra(ActivityApp.cUid, xAppInfo.getUid());
+ intentSettings.putExtra(ActivityApp.cRestrictionName, mRestrictionName);
+ ActivityMain.this.startActivity(intentSettings);
+ }
+ }
+ });
+
+ // Async update
+ new HolderTask(position, holder, xAppInfo).executeOnExecutor(mExecutor, (Object) null);
+
+ return convertView;
+ }
+ }
+
+ // Helper methods
+
+ private void setProgress(String text, int progress, int max) {
+ // Set up the progress bar
+ if (mProgressWidth == 0) {
+ final View vProgressEmpty = (View) findViewById(R.id.vProgressEmpty);
+ mProgressWidth = vProgressEmpty.getMeasuredWidth();
+ }
+ // Display stuff
+ TextView tvState = (TextView) findViewById(R.id.tvState);
+ if (text != null)
+ tvState.setText(text);
+ if (max == 0)
+ max = 1;
+ mProgress = (int) ((float) mProgressWidth) * progress / max;
+
+ View vProgressFull = (View) findViewById(R.id.vProgressFull);
+ vProgressFull.getLayoutParams().width = mProgress;
+ }
+
+ private int getSelectedCategory(final int userId) {
+ int pos = 0;
+ String restrictionName = PrivacyManager.getSetting(userId, PrivacyManager.cSettingSelectedCategory, null);
+ if (restrictionName != null)
+ for (String restriction : PrivacyManager.getRestrictions(this).values()) {
+ pos++;
+ if (restrictionName.equals(restriction))
+ break;
+ }
+ return pos;
+ }
+
+ private void checkLicense() {
+ if (!Util.isProEnabled() && Util.hasProLicense(this) == null)
+ if (Util.isProEnablerInstalled(this))
+ try {
+ int uid = getPackageManager().getPackageInfo("biz.bokhorst.xprivacy.pro", 0).applicationInfo.uid;
+ PrivacyManager.deleteRestrictions(uid, null, true);
+ Util.log(null, Log.INFO, "Licensing: check");
+ startActivityForResult(new Intent("biz.bokhorst.xprivacy.pro.CHECK"), ACTIVITY_LICENSE);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivitySettings.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivitySettings.java
new file mode 100644
index 0000000..ef6feaa
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivitySettings.java
@@ -0,0 +1,782 @@
+package biz.bokhorst.xprivacy;
+
+import java.io.File;
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import android.annotation.SuppressLint;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.location.Address;
+import android.location.Geocoder;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.Process;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+public class ActivitySettings extends ActivityBase implements OnCheckedChangeListener, OnClickListener {
+ private int userId;
+ private int uid;
+ private boolean isApp;
+ private boolean odSystem;
+ private boolean expert;
+
+ private CheckBox cbNotify;
+ private CheckBox cbOnDemand;
+ private CheckBox cbBlacklist;
+ private CheckBox cbUsage;
+ private CheckBox cbParameters;
+ private CheckBox cbValues;
+ private CheckBox cbLog;
+ private CheckBox cbSystem;
+ private CheckBox cbExperimental;
+ private CheckBox cbHttps;
+ private CheckBox cbAOSP;
+ private EditText etConfidence;
+ private EditText etQuirks;
+ private Button btnFlush;
+ private Button btnClearDb;
+ private CheckBox cbRandom;
+ private EditText etSerial;
+ private EditText etLat;
+ private EditText etLon;
+ private EditText etAlt;
+ private EditText etSearch;
+ private EditText etMac;
+ private EditText etIP;
+ private EditText etImei;
+ private EditText etPhone;
+ private EditText etId;
+ private EditText etGsfId;
+ private EditText etAdId;
+ private EditText etMcc;
+ private EditText etMnc;
+ private EditText etCountry;
+ private EditText etOperator;
+ private EditText etIccId;
+ private EditText etCid;
+ private EditText etLac;
+ private EditText etSubscriber;
+ private EditText etSSID;
+ private EditText etUa;
+ private CheckBox cbSerial;
+ private CheckBox cbLat;
+ private CheckBox cbLon;
+ private CheckBox cbAlt;
+ private CheckBox cbMac;
+ private CheckBox cbImei;
+ private CheckBox cbPhone;
+ private CheckBox cbId;
+ private CheckBox cbGsfId;
+ private CheckBox cbAdId;
+ private CheckBox cbCountry;
+ private CheckBox cbSubscriber;
+ private CheckBox cbSSID;
+
+ public static final String ACTION_SETTINGS = "biz.bokhorst.xprivacy.action.SETTINGS";
+ public static final String cUid = "Uid";
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ setContentView(R.layout.settings);
+ setSupportActionBar((Toolbar) findViewById(R.id.widgetToolbar));
+ setTitle(R.string.menu_settings);
+
+ userId = Util.getUserId(Process.myUid());
+
+ final Bundle extras = getIntent().getExtras();
+ if (extras != null && extras.containsKey(cUid))
+ uid = extras.getInt(cUid);
+ else
+ uid = userId;
+
+ // Reference controls
+ TextView tvInfo = (TextView) findViewById(R.id.tvInfo);
+
+ cbNotify = (CheckBox) findViewById(R.id.cbNotify);
+ cbOnDemand = (CheckBox) findViewById(R.id.cbOnDemand);
+ cbBlacklist = (CheckBox) findViewById(R.id.cbBlacklist);
+ cbUsage = (CheckBox) findViewById(R.id.cbUsage);
+ cbParameters = (CheckBox) findViewById(R.id.cbParameters);
+ cbValues = (CheckBox) findViewById(R.id.cbValues);
+ cbLog = (CheckBox) findViewById(R.id.cbLog);
+
+ CheckBox cbExpert = (CheckBox) findViewById(R.id.cbExpert);
+ cbSystem = (CheckBox) findViewById(R.id.cbSystem);
+ cbExperimental = (CheckBox) findViewById(R.id.cbExperimental);
+ cbHttps = (CheckBox) findViewById(R.id.cbHttps);
+ cbAOSP = (CheckBox) findViewById(R.id.cbAOSP);
+ LinearLayout llConfidence = (LinearLayout) findViewById(R.id.llConfidence);
+ etConfidence = (EditText) findViewById(R.id.etConfidence);
+ etQuirks = (EditText) findViewById(R.id.etQuirks);
+ btnFlush = (Button) findViewById(R.id.btnFlush);
+ btnClearDb = (Button) findViewById(R.id.btnClearDb);
+
+ cbRandom = (CheckBox) findViewById(R.id.cbRandom);
+ Button btnRandom = (Button) findViewById(R.id.btnRandom);
+ Button btnClear = (Button) findViewById(R.id.btnClear);
+
+ etSerial = (EditText) findViewById(R.id.etSerial);
+ etLat = (EditText) findViewById(R.id.etLat);
+ etLon = (EditText) findViewById(R.id.etLon);
+ etAlt = (EditText) findViewById(R.id.etAlt);
+ etSearch = (EditText) findViewById(R.id.etSearch);
+ Button btnSearch = (Button) findViewById(R.id.btnSearch);
+ etMac = (EditText) findViewById(R.id.etMac);
+ etIP = (EditText) findViewById(R.id.etIP);
+ etImei = (EditText) findViewById(R.id.etImei);
+ etPhone = (EditText) findViewById(R.id.etPhone);
+ etId = (EditText) findViewById(R.id.etId);
+ etGsfId = (EditText) findViewById(R.id.etGsfId);
+ etAdId = (EditText) findViewById(R.id.etAdId);
+ etMcc = (EditText) findViewById(R.id.etMcc);
+ etMnc = (EditText) findViewById(R.id.etMnc);
+ etCountry = (EditText) findViewById(R.id.etCountry);
+ etOperator = (EditText) findViewById(R.id.etOperator);
+ etIccId = (EditText) findViewById(R.id.etIccId);
+ etCid = (EditText) findViewById(R.id.etCid);
+ etLac = (EditText) findViewById(R.id.etLac);
+ etSubscriber = (EditText) findViewById(R.id.etSubscriber);
+ etSSID = (EditText) findViewById(R.id.etSSID);
+ etUa = (EditText) findViewById(R.id.etUa);
+
+ cbSerial = (CheckBox) findViewById(R.id.cbSerial);
+ cbLat = (CheckBox) findViewById(R.id.cbLat);
+ cbLon = (CheckBox) findViewById(R.id.cbLon);
+ cbAlt = (CheckBox) findViewById(R.id.cbAlt);
+ cbMac = (CheckBox) findViewById(R.id.cbMac);
+ cbImei = (CheckBox) findViewById(R.id.cbImei);
+ cbPhone = (CheckBox) findViewById(R.id.cbPhone);
+ cbId = (CheckBox) findViewById(R.id.cbId);
+ cbGsfId = (CheckBox) findViewById(R.id.cbGsfId);
+ cbAdId = (CheckBox) findViewById(R.id.cbAdId);
+ cbCountry = (CheckBox) findViewById(R.id.cbCountry);
+ cbSubscriber = (CheckBox) findViewById(R.id.cbSubscriber);
+ cbSSID = (CheckBox) findViewById(R.id.cbSSID);
+
+ // Listen for changes
+ cbParameters.setOnCheckedChangeListener(this);
+ cbValues.setOnCheckedChangeListener(this);
+ cbExpert.setOnCheckedChangeListener(this);
+ cbSerial.setOnCheckedChangeListener(this);
+ cbLat.setOnCheckedChangeListener(this);
+ cbLon.setOnCheckedChangeListener(this);
+ cbAlt.setOnCheckedChangeListener(this);
+ cbMac.setOnCheckedChangeListener(this);
+ cbImei.setOnCheckedChangeListener(this);
+ cbPhone.setOnCheckedChangeListener(this);
+ cbId.setOnCheckedChangeListener(this);
+ cbGsfId.setOnCheckedChangeListener(this);
+ cbAdId.setOnCheckedChangeListener(this);
+ cbCountry.setOnCheckedChangeListener(this);
+ cbSubscriber.setOnCheckedChangeListener(this);
+ cbSSID.setOnCheckedChangeListener(this);
+
+ // Get current values
+ boolean usage = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingUsage, true);
+ boolean parameters = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingParameters, false);
+ boolean values = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingValues, false);
+ boolean log = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingLog, false);
+
+ boolean components = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingSystem, false);
+ boolean experimental = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingExperimental, false);
+ boolean https = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingHttps, true);
+ boolean aosp = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingAOSPMode, false);
+ String confidence = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingConfidence, "");
+
+ // Get quirks
+ boolean freeze = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingFreeze, false);
+ boolean resolve = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingResolve, false);
+ boolean noresolve = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingNoResolve, false);
+ boolean permman = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingPermMan, false);
+ boolean iwall = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingIntentWall, false);
+ boolean safemode = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingSafeMode, false);
+ boolean test = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingTestVersions, false);
+ boolean updates = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingUpdates, false);
+ boolean odsystem = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingOnDemandSystem, false);
+ boolean wnomod = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingWhitelistNoModify, false);
+ boolean nousage = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingNoUsageData, false);
+ List listQuirks = new ArrayList();
+ if (freeze)
+ listQuirks.add("freeze");
+ if (resolve)
+ listQuirks.add("resolve");
+ if (noresolve)
+ listQuirks.add("noresolve");
+ if (permman)
+ listQuirks.add("permman");
+ if (iwall)
+ listQuirks.add("iwall");
+ if (safemode)
+ listQuirks.add("safemode");
+ if (test)
+ listQuirks.add("test");
+ if (updates)
+ listQuirks.add("updates");
+ if (odsystem)
+ listQuirks.add("odsystem");
+ if (wnomod)
+ listQuirks.add("wnomod");
+ if (nousage)
+ listQuirks.add("nousage");
+ Collections.sort(listQuirks);
+ String quirks = TextUtils.join(",", listQuirks.toArray());
+
+ expert = (components || experimental || !https || aosp || !"".equals(confidence) || listQuirks.size() > 0);
+
+ // Application specific
+ boolean notify = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingNotify, true);
+ boolean ondemand = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingOnDemand, uid == userId);
+ boolean blacklist = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingBlacklist, false);
+ boolean enabled = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingRestricted, true);
+
+ // Common
+ boolean random = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingRandom, false);
+ String serial = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingSerial, "");
+ String lat = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingLatitude, "");
+ String lon = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingLongitude, "");
+ String alt = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingAltitude, "");
+ String mac = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingMac, "");
+ String imei = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingImei, "");
+ String phone = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingPhone, "");
+ String id = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingId, "");
+ String gsfid = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingGsfId, "");
+ String adid = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingAdId, "");
+ String country = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingCountry, "");
+ String subscriber = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingSubscriber, "");
+ String ssid = PrivacyManager.getSetting(-uid, PrivacyManager.cSettingSSID, "");
+
+ // Set current values
+ if (uid == userId) {
+ // Global settings
+ tvInfo.setVisibility(View.GONE);
+ cbUsage.setChecked(usage);
+ cbParameters.setChecked(parameters);
+ cbValues.setChecked(values);
+ if (userId == 0)
+ cbLog.setChecked(log);
+ else {
+ cbLog.setVisibility(View.GONE);
+ btnFlush.setVisibility(View.GONE);
+ btnClearDb.setVisibility(View.GONE);
+ }
+ cbExpert.setChecked(expert);
+
+ if (PrivacyManager.cVersion3
+ && (!Util.isSELinuxEnforced() || "true".equals(Util.getXOption("ignoreselinux"))))
+ cbAOSP.setVisibility(View.VISIBLE);
+
+ if (expert) {
+ cbSystem.setChecked(components);
+ cbExperimental.setChecked(experimental);
+ cbHttps.setChecked(https);
+ cbAOSP.setChecked(aosp);
+ etConfidence.setText(confidence);
+ etQuirks.setText(quirks);
+ } else {
+ cbSystem.setEnabled(false);
+ cbExperimental.setEnabled(false);
+ cbHttps.setEnabled(false);
+ cbHttps.setChecked(true);
+ cbAOSP.setEnabled(false);
+ cbAOSP.setChecked(false);
+ etConfidence.setEnabled(false);
+ etQuirks.setEnabled(false);
+ btnFlush.setEnabled(false);
+ btnClearDb.setEnabled(false);
+ }
+ } else {
+ // Display application names
+ ApplicationInfoEx appInfo = new ApplicationInfoEx(this, uid);
+ getSupportActionBar().setSubtitle(TextUtils.join(", ", appInfo.getApplicationName()));
+
+ // Disable global settings
+ cbUsage.setVisibility(View.GONE);
+ cbParameters.setVisibility(View.GONE);
+ cbValues.setVisibility(View.GONE);
+ cbLog.setVisibility(View.GONE);
+ cbSystem.setVisibility(View.GONE);
+ cbExperimental.setVisibility(View.GONE);
+ cbHttps.setVisibility(View.GONE);
+ cbAOSP.setVisibility(View.GONE);
+ llConfidence.setVisibility(View.GONE);
+ btnFlush.setVisibility(View.GONE);
+ btnClearDb.setVisibility(View.GONE);
+
+ cbExpert.setChecked(expert);
+ if (expert)
+ etQuirks.setText(quirks);
+ else
+ etQuirks.setEnabled(false);
+ }
+
+ boolean gnotify = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingNotify, true);
+ if (uid == userId || gnotify)
+ cbNotify.setChecked(notify);
+ else
+ cbNotify.setVisibility(View.GONE);
+
+ isApp = PrivacyManager.isApplication(uid);
+ odSystem = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemandSystem, false);
+ boolean gondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ if (uid == userId || ((isApp || odSystem) && gondemand)) {
+ cbOnDemand.setChecked(ondemand);
+ cbOnDemand.setEnabled(enabled);
+ } else
+ cbOnDemand.setVisibility(View.GONE);
+
+ String blFileName = Environment.getExternalStorageDirectory().getPath() + "/.xprivacy/blacklist";
+ if (uid == userId || !new File(blFileName).exists())
+ cbBlacklist.setVisibility(View.GONE);
+ else
+ cbBlacklist.setChecked(blacklist);
+
+ // Common
+ cbRandom.setChecked(random);
+
+ // Set randomize on access check boxes
+ cbSerial.setChecked(serial.equals(PrivacyManager.cValueRandom));
+ cbLat.setChecked(lat.equals(PrivacyManager.cValueRandom));
+ cbLon.setChecked(lon.equals(PrivacyManager.cValueRandom));
+ cbAlt.setChecked(alt.equals(PrivacyManager.cValueRandom));
+ cbMac.setChecked(mac.equals(PrivacyManager.cValueRandom));
+ cbImei.setChecked(imei.equals(PrivacyManager.cValueRandom));
+ cbPhone.setChecked(phone.equals(PrivacyManager.cValueRandom));
+ cbId.setChecked(id.equals(PrivacyManager.cValueRandom));
+ cbGsfId.setChecked(gsfid.equals(PrivacyManager.cValueRandom));
+ cbAdId.setChecked(adid.equals(PrivacyManager.cValueRandom));
+ cbCountry.setChecked(country.equals(PrivacyManager.cValueRandom));
+ cbSubscriber.setChecked(subscriber.equals(PrivacyManager.cValueRandom));
+ cbSSID.setChecked(ssid.equals(PrivacyManager.cValueRandom));
+
+ // Set fake values
+ etSerial.setText(cbSerial.isChecked() ? "" : serial);
+ etLat.setText(cbLat.isChecked() ? "" : lat);
+ etLon.setText(cbLon.isChecked() ? "" : lon);
+ etAlt.setText(cbAlt.isChecked() ? "" : alt);
+ etMac.setText(cbMac.isChecked() ? "" : mac);
+ etImei.setText(cbImei.isChecked() ? "" : imei);
+ etPhone.setText(cbPhone.isChecked() ? "" : phone);
+ etId.setText(cbId.isChecked() ? "" : id);
+ etGsfId.setText(cbGsfId.isChecked() ? "" : gsfid);
+ etAdId.setText(cbAdId.isChecked() ? "" : adid);
+ etCountry.setText(cbCountry.isChecked() ? "" : country);
+ etSubscriber.setText(cbSubscriber.isChecked() ? "" : subscriber);
+ etSSID.setText(cbSSID.isChecked() ? "" : ssid);
+
+ etSerial.setEnabled(!cbSerial.isChecked());
+ etLat.setEnabled(!cbLat.isChecked());
+ etLon.setEnabled(!cbLon.isChecked());
+ etAlt.setEnabled(!cbAlt.isChecked());
+
+ etSearch.setEnabled(Geocoder.isPresent());
+ btnSearch.setEnabled(Geocoder.isPresent());
+
+ etMac.setEnabled(!cbMac.isChecked());
+ etImei.setEnabled(!cbImei.isChecked());
+ etPhone.setEnabled(!cbPhone.isChecked());
+ etId.setEnabled(!cbId.isChecked());
+ etGsfId.setEnabled(!cbGsfId.isChecked());
+ etAdId.setEnabled(!cbAdId.isChecked());
+ etCountry.setEnabled(!cbCountry.isChecked());
+ etSubscriber.setEnabled(!cbSubscriber.isChecked());
+ etSSID.setEnabled(!cbSSID.isChecked());
+
+ etIP.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingIP, ""));
+ etMcc.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingMcc, ""));
+ etMnc.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingMnc, ""));
+ etOperator.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingOperator, ""));
+ etIccId.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingIccId, ""));
+ etCid.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingCid, ""));
+ etLac.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingLac, ""));
+ etUa.setText(PrivacyManager.getSetting(-uid, PrivacyManager.cSettingUa, ""));
+
+ btnFlush.setOnClickListener(this);
+ btnClearDb.setOnClickListener(this);
+ btnRandom.setOnClickListener(this);
+ btnClear.setOnClickListener(this);
+ btnSearch.setOnClickListener(this);
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ if (inflater != null && PrivacyService.checkClient()) {
+ inflater.inflate(R.menu.settings, menu);
+ return true;
+ } else
+ return false;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()) {
+ case R.id.menu_cancel:
+ finish();
+ return true;
+ case R.id.menu_save:
+ optionSave();
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ switch (buttonView.getId()) {
+ case R.id.cbParameters:
+ case R.id.cbValues:
+ if (isChecked && Util.hasProLicense(this) == null) {
+ buttonView.setChecked(false);
+ Util.viewUri(this, ActivityMain.cProUri);
+ }
+ break;
+ case R.id.cbExpert:
+ cbSystem.setEnabled(isChecked);
+ cbExperimental.setEnabled(isChecked);
+ cbHttps.setEnabled(isChecked);
+ cbAOSP.setEnabled(isChecked);
+ etConfidence.setEnabled(isChecked);
+ etQuirks.setEnabled(isChecked);
+ btnFlush.setEnabled(isChecked);
+ btnClearDb.setEnabled(isChecked);
+ if (isChecked) {
+ if (!expert)
+ Toast.makeText(this, getString(R.string.msg_expert), Toast.LENGTH_LONG).show();
+ } else {
+ cbSystem.setChecked(false);
+ cbExperimental.setChecked(false);
+ cbHttps.setChecked(true);
+ cbAOSP.setChecked(false);
+ etConfidence.setText("");
+ etQuirks.setText("");
+ }
+ break;
+ case R.id.cbSerial:
+ etSerial.setEnabled(!isChecked);
+ break;
+ case R.id.cbLat:
+ etLat.setEnabled(!isChecked);
+ break;
+ case R.id.cbLon:
+ etLon.setEnabled(!isChecked);
+ break;
+ case R.id.cbAlt:
+ etAlt.setEnabled(!isChecked);
+ break;
+ case R.id.cbMac:
+ etMac.setEnabled(!isChecked);
+ break;
+ case R.id.cbImei:
+ etImei.setEnabled(!isChecked);
+ break;
+ case R.id.cbPhone:
+ etPhone.setEnabled(!isChecked);
+ break;
+ case R.id.cbId:
+ etId.setEnabled(!isChecked);
+ break;
+ case R.id.cbGsfId:
+ etGsfId.setEnabled(!isChecked);
+ break;
+ case R.id.cbAdId:
+ etAdId.setEnabled(!isChecked);
+ break;
+ case R.id.cbCountry:
+ etCountry.setEnabled(!isChecked);
+ break;
+ case R.id.cbSubscriber:
+ etSubscriber.setEnabled(!isChecked);
+ break;
+ case R.id.cbSSID:
+ etSSID.setEnabled(!isChecked);
+ break;
+ }
+ }
+
+ @Override
+ public void onClick(View v) {
+ switch (v.getId()) {
+ case R.id.btnFlush:
+ flush();
+ break;
+ case R.id.btnClearDb:
+ clearDB();
+ break;
+ case R.id.btnRandom:
+ randomize();
+ break;
+ case R.id.btnClear:
+ clear();
+ break;
+ case R.id.btnSearch:
+ search();
+ break;
+ }
+ }
+
+ private void clearDB() {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivitySettings.this);
+ alertDialogBuilder.setTitle(R.string.menu_clear_db);
+ alertDialogBuilder.setMessage(R.string.msg_sure);
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ PrivacyManager.clear();
+ Toast.makeText(ActivitySettings.this, getString(R.string.msg_reboot), Toast.LENGTH_LONG).show();
+ finish();
+
+ // Refresh main UI
+ Intent intent = new Intent(ActivitySettings.this, ActivityMain.class);
+ intent.putExtra(ActivityMain.cAction, ActivityMain.cActionRefresh);
+ startActivity(intent);
+ }
+ });
+ alertDialogBuilder.setNegativeButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+
+ private void randomize() {
+ etSerial.setText(PrivacyManager.getRandomProp("SERIAL"));
+ etLat.setText(PrivacyManager.getRandomProp("LAT"));
+ etLon.setText(PrivacyManager.getRandomProp("LON"));
+ etAlt.setText(PrivacyManager.getRandomProp("ALT"));
+ etMac.setText(PrivacyManager.getRandomProp("MAC"));
+ etImei.setText(PrivacyManager.getRandomProp("IMEI"));
+ etPhone.setText(PrivacyManager.getRandomProp("PHONE"));
+ etId.setText(PrivacyManager.getRandomProp("ANDROID_ID"));
+ etGsfId.setText(PrivacyManager.getRandomProp("GSF_ID"));
+ etAdId.setText(PrivacyManager.getRandomProp("AdvertisingId"));
+ etCountry.setText(PrivacyManager.getRandomProp("ISO3166"));
+ etSubscriber.setText(PrivacyManager.getRandomProp("SubscriberId"));
+ etSSID.setText(PrivacyManager.getRandomProp("SSID"));
+ }
+
+ private void clear() {
+ final EditText[] edits = new EditText[] { etSerial, etLat, etLon, etAlt, etMac, etIP, etImei, etPhone, etId,
+ etGsfId, etAdId, etMcc, etMnc, etCountry, etOperator, etIccId, etCid, etLac, etSubscriber, etSSID, etUa };
+ final CheckBox[] boxes = new CheckBox[] { cbSerial, cbLat, cbLon, cbAlt, cbMac, cbImei, cbPhone, cbId, cbGsfId,
+ cbAdId, cbCountry, cbSubscriber, cbSSID };
+
+ for (EditText edit : edits)
+ edit.setText("");
+ etSearch.setText("");
+
+ for (CheckBox box : boxes)
+ box.setChecked(false);
+ }
+
+ private void search() {
+ try {
+ String search = etSearch.getText().toString();
+ final List listAddress = new Geocoder(ActivitySettings.this).getFromLocationName(search, 1);
+ if (listAddress.size() > 0) {
+ Address address = listAddress.get(0);
+
+ // Get coordinates
+ if (address.hasLatitude()) {
+ cbLat.setChecked(false);
+ etLat.setText(Double.toString(address.getLatitude()));
+ }
+ if (address.hasLongitude()) {
+ cbLon.setChecked(false);
+ etLon.setText(Double.toString(address.getLongitude()));
+ }
+
+ // Get address
+ StringBuilder sb = new StringBuilder();
+ for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
+ if (i != 0)
+ sb.append(", ");
+ sb.append(address.getAddressLine(i));
+ }
+ etSearch.setText(sb.toString());
+ }
+ } catch (Throwable ex) {
+ Toast.makeText(ActivitySettings.this, ex.getMessage(), Toast.LENGTH_LONG).show();
+ }
+ }
+
+ private void flush() {
+ Intent flushIntent = new Intent(UpdateService.cFlush);
+ flushIntent.setPackage(getPackageName());
+ startService(flushIntent);
+ Toast.makeText(ActivitySettings.this, getString(R.string.msg_done), Toast.LENGTH_LONG).show();
+ }
+
+ @SuppressLint("DefaultLocale")
+ private void optionSave() {
+ if (uid == userId) {
+ // Global settings
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingUsage, Boolean.toString(cbUsage.isChecked()));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingParameters,
+ Boolean.toString(cbParameters.isChecked()));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingValues, Boolean.toString(cbValues.isChecked()));
+ if (userId == 0)
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLog, Boolean.toString(cbLog.isChecked()));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingSystem, Boolean.toString(cbSystem.isChecked()));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingExperimental,
+ Boolean.toString(cbExperimental.isChecked()));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingHttps, Boolean.toString(cbHttps.isChecked()));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingAOSPMode, Boolean.toString(cbAOSP.isChecked()));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingConfidence, etConfidence.getText().toString());
+ }
+
+ // Quirks
+ List listQuirks = Arrays
+ .asList(etQuirks.getText().toString().toLowerCase().replace(" ", "").split(","));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingFreeze, Boolean.toString(listQuirks.contains("freeze")));
+ PrivacyManager
+ .setSetting(uid, PrivacyManager.cSettingResolve, Boolean.toString(listQuirks.contains("resolve")));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingNoResolve,
+ Boolean.toString(listQuirks.contains("noresolve")));
+ PrivacyManager
+ .setSetting(uid, PrivacyManager.cSettingPermMan, Boolean.toString(listQuirks.contains("permman")));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingIntentWall,
+ Boolean.toString(listQuirks.contains("iwall")));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingSafeMode,
+ Boolean.toString(listQuirks.contains("safemode")));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingTestVersions,
+ Boolean.toString(listQuirks.contains("test")));
+ PrivacyManager
+ .setSetting(uid, PrivacyManager.cSettingUpdates, Boolean.toString(listQuirks.contains("updates")));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemandSystem,
+ Boolean.toString(listQuirks.contains("odsystem")));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingWhitelistNoModify,
+ Boolean.toString(listQuirks.contains("wnomod")));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingNoUsageData,
+ Boolean.toString(listQuirks.contains("nousage")));
+
+ // Notifications
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingNotify, Boolean.toString(cbNotify.isChecked()));
+
+ // On demand restricting
+ if (uid == userId || (isApp || odSystem))
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemand, Boolean.toString(cbOnDemand.isChecked()));
+
+ if (uid != userId)
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingBlacklist, Boolean.toString(cbBlacklist.isChecked()));
+
+ // Random at boot
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingRandom, cbRandom.isChecked() ? Boolean.toString(true)
+ : null);
+
+ // Serial#
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingSerial, getValue(cbSerial, etSerial));
+
+ // Set latitude
+ if (cbLat.isChecked())
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLatitude, PrivacyManager.cValueRandom);
+ else
+ try {
+ float lat = Float.parseFloat(etLat.getText().toString().replace(',', '.'));
+ if (lat < -90 || lat > 90)
+ throw new InvalidParameterException();
+
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLatitude, Float.toString(lat));
+ } catch (Throwable ignored) {
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLatitude, null);
+ }
+
+ // Set longitude
+ if (cbLon.isChecked())
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLongitude, PrivacyManager.cValueRandom);
+ else
+ try {
+ float lon = Float.parseFloat(etLon.getText().toString().replace(',', '.'));
+ if (lon < -180 || lon > 180)
+ throw new InvalidParameterException();
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLongitude, Float.toString(lon));
+ } catch (Throwable ignored) {
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLongitude, null);
+ }
+
+ // Set altitude
+ if (cbAlt.isChecked())
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingAltitude, PrivacyManager.cValueRandom);
+ else
+ try {
+ float alt = Float.parseFloat(etAlt.getText().toString().replace(',', '.'));
+ if (alt < -10000 || alt > 10000)
+ throw new InvalidParameterException();
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingAltitude, Float.toString(alt));
+ } catch (Throwable ignored) {
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingAltitude, null);
+ }
+
+ // Check Gsf ID
+ try {
+ String value = etGsfId.getText().toString();
+ if (!"".equals(value))
+ Long.parseLong(value.toLowerCase(), 16);
+ } catch (NumberFormatException ignored) {
+ etGsfId.setText("");
+ }
+
+ // Other settings
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingMac, getValue(cbMac, etMac));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingIP, getValue(null, etIP));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingImei, getValue(cbImei, etImei));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingPhone, getValue(cbPhone, etPhone));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingId, getValue(cbId, etId));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingGsfId, getValue(cbGsfId, etGsfId));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingAdId, getValue(cbAdId, etAdId));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingMcc, getValue(null, etMcc));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingMnc, getValue(null, etMnc));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingCountry, getValue(cbCountry, etCountry));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingOperator, getValue(null, etOperator));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingIccId, getValue(null, etIccId));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingCid, getValue(null, etCid));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingLac, getValue(null, etLac));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingSubscriber, getValue(cbSubscriber, etSubscriber));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingSSID, getValue(cbSSID, etSSID));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingUa, getValue(null, etUa));
+
+ finish();
+
+ // Refresh view
+ if (uid == userId) {
+ Intent intent = new Intent(ActivitySettings.this, ActivityMain.class);
+ startActivity(intent);
+ } else {
+ Intent intent = new Intent(ActivitySettings.this, ActivityApp.class);
+ intent.putExtra(ActivityApp.cUid, uid);
+ intent.putExtra(ActivityApp.cAction, ActivityApp.cActionRefresh);
+ startActivity(intent);
+ }
+ }
+
+ private static String getValue(CheckBox check, EditText edit) {
+ if (check != null && check.isChecked())
+ return PrivacyManager.cValueRandom;
+ String value = edit.getText().toString().trim();
+ return ("".equals(value) ? null : value);
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityShare.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityShare.java
new file mode 100644
index 0000000..ba9ef89
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityShare.java
@@ -0,0 +1,2132 @@
+package biz.bokhorst.xprivacy;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.net.UnknownHostException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import javax.net.ssl.SSLException;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.StatusLine;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ConnectTimeoutException;
+import org.apache.http.conn.HttpHostConnectException;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpConnectionParams;
+import org.apache.http.params.HttpParams;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.xml.sax.Attributes;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.DefaultHandler;
+import org.xmlpull.v1.XmlSerializer;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.annotation.SuppressLint;
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.app.ProgressDialog;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.TypedArray;
+import android.database.Cursor;
+import android.graphics.Color;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.PowerManager;
+import android.os.Process;
+import android.provider.ContactsContract;
+import android.provider.Settings.Secure;
+import android.support.v4.app.NotificationCompat;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Patterns;
+import android.util.SparseArray;
+import android.util.Xml;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.ImageView;
+import android.widget.ListView;
+import android.widget.ProgressBar;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
+import android.widget.ScrollView;
+import android.widget.Spinner;
+import android.widget.RadioGroup.OnCheckedChangeListener;
+import android.widget.TextView;
+import android.widget.EditText;
+import android.widget.Toast;
+
+@SuppressLint("Wakelock")
+public class ActivityShare extends ActivityBase {
+ private int mActionId;
+ private AppListAdapter mAppAdapter;
+ private SparseArray mAppsByUid;
+ private boolean mRunning = false;
+ private boolean mAbort = false;
+ private int mProgressCurrent;
+ private int mProgressWidth = 0;
+ private String mFileName = null;
+ private boolean mInteractive = false;
+
+ private static final int STATE_WAITING = 0;
+ private static final int STATE_RUNNING = 1;
+ private static final int STATE_SUCCESS = 2;
+ private static final int STATE_FAILURE = 3;
+
+ private static final int ACTIVITY_IMPORT_SELECT = 0;
+
+ public static final String cUidList = "UidList";
+ public static final String cRestriction = "Restriction";
+ public static final String cInteractive = "Interactive";
+ public static final String cChoice = "Choice";
+ public static final String cFileName = "FileName";
+ public static final String HTTP_BASE_URL = "http://crowd.xprivacy.eu/";
+ public static final String HTTPS_BASE_URL = "https://crowd.xprivacy.eu/";
+
+ public static final int cSubmitLimit = 10;
+ public static final int cProtocolVersion = 4;
+
+ public static final String ACTION_EXPORT = "biz.bokhorst.xprivacy.action.EXPORT";
+ public static final String ACTION_IMPORT = "biz.bokhorst.xprivacy.action.IMPORT";
+ public static final String ACTION_FETCH = "biz.bokhorst.xprivacy.action.FETCH";
+ public static final String ACTION_SUBMIT = "biz.bokhorst.xprivacy.action.SUBMIT";
+ public static final String ACTION_TOGGLE = "biz.bokhorst.xprivacy.action.TOGGLE";
+
+ public static final int CHOICE_CLEAR = 1;
+ public static final int CHOICE_TEMPLATE = 2;
+
+ public static final int TIMEOUT_MILLISEC = 45000;
+
+ private static ExecutorService mExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),
+ new PriorityThreadFactory());
+
+ private static class PriorityThreadFactory implements ThreadFactory {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.NORM_PRIORITY);
+ return t;
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Check privacy service client
+ if (!PrivacyService.checkClient())
+ return;
+
+ // Get data
+ int userId = Util.getUserId(Process.myUid());
+ final Bundle extras = getIntent().getExtras();
+ final String action = getIntent().getAction();
+ final int[] uids = (extras != null && extras.containsKey(cUidList) ? extras.getIntArray(cUidList) : new int[0]);
+ final String restrictionName = (extras != null ? extras.getString(cRestriction) : null);
+ int choice = (extras != null && extras.containsKey(cChoice) ? extras.getInt(cChoice) : -1);
+ if (action.equals(ACTION_EXPORT))
+ mFileName = (extras != null && extras.containsKey(cFileName) ? extras.getString(cFileName) : null);
+
+ // License check
+ if (action.equals(ACTION_IMPORT) || action.equals(ACTION_EXPORT)) {
+ if (!Util.isProEnabled() && Util.hasProLicense(this) == null) {
+ Util.viewUri(this, ActivityMain.cProUri);
+ finish();
+ return;
+ }
+ } else if (action.equals(ACTION_FETCH) || (action.equals(ACTION_TOGGLE) && uids.length > 1)) {
+ if (Util.hasProLicense(this) == null) {
+ Util.viewUri(this, ActivityMain.cProUri);
+ finish();
+ return;
+ }
+ }
+
+ // Registration check
+ if (action.equals(ACTION_SUBMIT) && !registerDevice(this)) {
+ finish();
+ return;
+ }
+
+ // Check whether we need a user interface
+ if (extras != null && extras.containsKey(cInteractive) && extras.getBoolean(cInteractive, false))
+ mInteractive = true;
+
+ // Set layout
+ setContentView(R.layout.sharelist);
+ setSupportActionBar((Toolbar) findViewById(R.id.widgetToolbar));
+
+ // Reference controls
+ final TextView tvDescription = (TextView) findViewById(R.id.tvDescription);
+ final ScrollView svToggle = (ScrollView) findViewById(R.id.svToggle);
+ final RadioGroup rgToggle = (RadioGroup) findViewById(R.id.rgToggle);
+ final Spinner spRestriction = (Spinner) findViewById(R.id.spRestriction);
+ RadioButton rbClear = (RadioButton) findViewById(R.id.rbClear);
+ RadioButton rbTemplateFull = (RadioButton) findViewById(R.id.rbTemplateFull);
+ RadioButton rbODEnable = (RadioButton) findViewById(R.id.rbEnableOndemand);
+ RadioButton rbODDisable = (RadioButton) findViewById(R.id.rbDisableOndemand);
+ final Spinner spTemplate = (Spinner) findViewById(R.id.spTemplate);
+ final CheckBox cbClear = (CheckBox) findViewById(R.id.cbClear);
+ final Button btnOk = (Button) findViewById(R.id.btnOk);
+ final Button btnCancel = (Button) findViewById(R.id.btnCancel);
+
+ // Set title
+ if (action.equals(ACTION_TOGGLE)) {
+ mActionId = R.string.menu_toggle;
+ getSupportActionBar().setSubtitle(R.string.menu_toggle);
+ } else if (action.equals(ACTION_IMPORT)) {
+ mActionId = R.string.menu_import;
+ getSupportActionBar().setSubtitle(R.string.menu_import);
+ } else if (action.equals(ACTION_EXPORT)) {
+ mActionId = R.string.menu_export;
+ getSupportActionBar().setSubtitle(R.string.menu_export);
+ } else if (action.equals(ACTION_FETCH)) {
+ mActionId = R.string.menu_fetch;
+ getSupportActionBar().setSubtitle(R.string.menu_fetch);
+ } else if (action.equals(ACTION_SUBMIT)) {
+ mActionId = R.string.menu_submit;
+ getSupportActionBar().setSubtitle(R.string.menu_submit);
+ } else {
+ finish();
+ return;
+ }
+
+ // Get localized restriction name
+ List listRestrictionName = new ArrayList(PrivacyManager.getRestrictions(this).navigableKeySet());
+ listRestrictionName.add(0, getString(R.string.menu_all));
+
+ // Build restriction adapter
+ SpinnerAdapter saRestriction = new SpinnerAdapter(this, android.R.layout.simple_spinner_item);
+ saRestriction.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ saRestriction.addAll(listRestrictionName);
+
+ // Setup restriction spinner
+ int pos = 0;
+ if (restrictionName != null)
+ for (String restriction : PrivacyManager.getRestrictions(this).values()) {
+ pos++;
+ if (restrictionName.equals(restriction))
+ break;
+ }
+
+ spRestriction.setAdapter(saRestriction);
+ spRestriction.setSelection(pos);
+
+ // Build template adapter
+ SpinnerAdapter spAdapter = new SpinnerAdapter(this, android.R.layout.simple_spinner_item);
+ spAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ String defaultName = PrivacyManager.getSetting(userId, Meta.cTypeTemplateName, "0",
+ getString(R.string.title_default));
+ spAdapter.add(defaultName);
+ for (int i = 1; i <= 4; i++) {
+ String alternateName = PrivacyManager.getSetting(userId, Meta.cTypeTemplateName, Integer.toString(i),
+ getString(R.string.title_alternate) + " " + i);
+ spAdapter.add(alternateName);
+ }
+ spTemplate.setAdapter(spAdapter);
+
+ // Build application list
+ AppListTask appListTask = new AppListTask();
+ appListTask.executeOnExecutor(mExecutor, uids);
+
+ // Import/export filename
+ if (action.equals(ACTION_EXPORT) || action.equals(ACTION_IMPORT)) {
+ // Check for availability of sharing intent
+ Intent file = new Intent(Intent.ACTION_GET_CONTENT);
+ file.setType("file/*");
+ boolean hasIntent = Util.isIntentAvailable(ActivityShare.this, file);
+
+ // Get file name
+ if (mFileName == null)
+ if (action.equals(ACTION_EXPORT)) {
+ String packageName = null;
+ if (uids.length == 1)
+ try {
+ ApplicationInfoEx appInfo = new ApplicationInfoEx(this, uids[0]);
+ packageName = appInfo.getPackageName().get(0);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ mFileName = getFileName(this, hasIntent, packageName);
+ } else
+ mFileName = (hasIntent ? null : getFileName(this, false, null));
+
+ if (mFileName == null)
+ fileChooser();
+ else
+ showFileName();
+
+ if (action.equals(ACTION_IMPORT))
+ cbClear.setVisibility(View.VISIBLE);
+
+ } else if (action.equals(ACTION_FETCH)) {
+ tvDescription.setText(getBaseURL());
+ cbClear.setVisibility(View.VISIBLE);
+
+ } else if (action.equals(ACTION_TOGGLE)) {
+ tvDescription.setVisibility(View.GONE);
+ spRestriction.setVisibility(View.VISIBLE);
+ svToggle.setVisibility(View.VISIBLE);
+
+ // Listen for radio button
+ rgToggle.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(RadioGroup group, int checkedId) {
+ btnOk.setEnabled(checkedId >= 0);
+ spRestriction.setVisibility(checkedId == R.id.rbEnableOndemand
+ || checkedId == R.id.rbDisableOndemand ? View.GONE : View.VISIBLE);
+
+ spTemplate
+ .setVisibility(checkedId == R.id.rbTemplateCategory || checkedId == R.id.rbTemplateFull
+ || checkedId == R.id.rbTemplateMergeSet || checkedId == R.id.rbTemplateMergeReset ? View.VISIBLE
+ : View.GONE);
+ }
+ });
+
+ boolean ondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ rbODEnable.setVisibility(ondemand ? View.VISIBLE : View.GONE);
+ rbODDisable.setVisibility(ondemand ? View.VISIBLE : View.GONE);
+
+ if (choice == CHOICE_CLEAR)
+ rbClear.setChecked(true);
+ else if (choice == CHOICE_TEMPLATE)
+ rbTemplateFull.setChecked(true);
+
+ } else
+ tvDescription.setText(getBaseURL());
+
+ if (mInteractive) {
+ // Enable ok
+ // (showFileName does this for export/import)
+ if (action.equals(ACTION_SUBMIT) || action.equals(ACTION_FETCH))
+ btnOk.setEnabled(true);
+
+ // Listen for ok
+ btnOk.setOnClickListener(new Button.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ btnOk.setEnabled(false);
+
+ // Toggle
+ if (action.equals(ACTION_TOGGLE)) {
+ mRunning = true;
+ for (int i = 0; i < rgToggle.getChildCount(); i++)
+ ((RadioButton) rgToggle.getChildAt(i)).setEnabled(false);
+ int pos = spRestriction.getSelectedItemPosition();
+ String restrictionName = (pos == 0 ? null : (String) PrivacyManager
+ .getRestrictions(ActivityShare.this).values().toArray()[pos - 1]);
+ new ToggleTask().executeOnExecutor(mExecutor, restrictionName);
+
+ // Import
+ } else if (action.equals(ACTION_IMPORT)) {
+ mRunning = true;
+ cbClear.setEnabled(false);
+ new ImportTask().executeOnExecutor(mExecutor, new File(mFileName), cbClear.isChecked());
+ }
+
+ // Export
+ else if (action.equals(ACTION_EXPORT)) {
+ mRunning = true;
+ new ExportTask().executeOnExecutor(mExecutor, new File(mFileName));
+
+ // Fetch
+ } else if (action.equals(ACTION_FETCH)) {
+ if (uids.length > 0) {
+ mRunning = true;
+ cbClear.setEnabled(false);
+ new FetchTask().executeOnExecutor(mExecutor, cbClear.isChecked());
+ }
+ }
+
+ // Submit
+ else if (action.equals(ACTION_SUBMIT)) {
+ if (uids.length > 0) {
+ if (uids.length <= cSubmitLimit) {
+ mRunning = true;
+ new SubmitTask().executeOnExecutor(mExecutor);
+ } else {
+ String message = getString(R.string.msg_limit, cSubmitLimit + 1);
+ Toast.makeText(ActivityShare.this, message, Toast.LENGTH_LONG).show();
+ btnOk.setEnabled(false);
+ }
+ }
+ }
+ }
+ });
+
+ } else
+ btnOk.setEnabled(false);
+
+ // Listen for cancel
+ btnCancel.setOnClickListener(new Button.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mRunning) {
+ mAbort = true;
+ Toast.makeText(ActivityShare.this, getString(R.string.msg_abort), Toast.LENGTH_LONG).show();
+ } else
+ finish();
+ }
+ });
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent dataIntent) {
+ super.onActivityResult(requestCode, resultCode, dataIntent);
+
+ // Import select
+ if (requestCode == ACTIVITY_IMPORT_SELECT)
+ if (resultCode == RESULT_CANCELED || dataIntent == null)
+ finish();
+ else {
+ String fileName = dataIntent.getData().getPath();
+ mFileName = fileName.replace("/document/primary:", Environment.getExternalStorageDirectory()
+ .getAbsolutePath() + File.separatorChar);
+ showFileName();
+ }
+ }
+
+ // State management
+
+ public void setState(int uid, int state, String message) {
+ final AppState app = mAppsByUid.get(uid);
+ app.message = message;
+ app.state = state;
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if (mAppAdapter != null) {
+ mAppAdapter.notifyDataSetChanged();
+
+ int position = mAppAdapter.getPosition(app);
+ if (position >= 0) {
+ ListView lvShare = (ListView) findViewById(R.id.lvShare);
+ lvShare.smoothScrollToPosition(position);
+ }
+ }
+ }
+ });
+ }
+
+ public void setState(int uid, int state) {
+ AppState app = mAppsByUid.get(uid);
+ app.state = state;
+ }
+
+ public void setMessage(int uid, String message) {
+ AppState app = mAppsByUid.get(uid);
+ app.message = message;
+ }
+
+ // App info and share state
+
+ private class AppState implements Comparable {
+ public int state = STATE_WAITING;
+ public String message = null;
+ public ApplicationInfoEx appInfo;
+
+ public AppState(int uid) {
+ appInfo = new ApplicationInfoEx(ActivityShare.this, uid);
+ }
+
+ @Override
+ public int compareTo(AppState other) {
+ return this.appInfo.compareTo(other.appInfo);
+ }
+ }
+
+ // Adapters
+
+ private class SpinnerAdapter extends ArrayAdapter {
+ public SpinnerAdapter(Context context, int textViewResourceId) {
+ super(context, textViewResourceId);
+ }
+ }
+
+ private class AppListAdapter extends ArrayAdapter {
+ private LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ public AppListAdapter(Context context, int resource, List objects) {
+ super(context, resource, objects);
+ }
+
+ public List getListUid() {
+ List uids = new ArrayList();
+ for (int i = 0; i < this.getCount(); i++)
+ uids.add(this.getItem(i).appInfo.getUid());
+ return uids;
+ }
+
+ public List getListAppInfo() {
+ List apps = new ArrayList();
+ for (int i = 0; i < this.getCount(); i++)
+ apps.add(this.getItem(i).appInfo);
+ return apps;
+ }
+
+ private class ViewHolder {
+ private View row;
+ private int position;
+ public ImageView imgIcon;
+ public ImageView imgInfo;
+ public TextView tvName;
+ public ImageView imgResult;
+ public ProgressBar pbRunning;
+ public TextView tvMessage;
+
+ public ViewHolder(View theRow, int thePosition) {
+ row = theRow;
+ position = thePosition;
+ imgIcon = (ImageView) row.findViewById(R.id.imgIcon);
+ imgInfo = (ImageView) row.findViewById(R.id.imgInfo);
+ tvName = (TextView) row.findViewById(R.id.tvApp);
+ imgResult = (ImageView) row.findViewById(R.id.imgResult);
+ pbRunning = (ProgressBar) row.findViewById(R.id.pbRunning);
+ tvMessage = (TextView) row.findViewById(R.id.tvMessage);
+ }
+ }
+
+ @Override
+ @SuppressLint("InflateParams")
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.shareentry, null);
+ holder = new ViewHolder(convertView, position);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ holder.position = position;
+ }
+
+ // Get info
+ final AppState xApp = getItem(holder.position);
+
+ // Set background color
+ if (xApp.appInfo.isSystem())
+ holder.row.setBackgroundColor(getResources().getColor(getThemed(R.attr.color_dangerous)));
+ else
+ holder.row.setBackgroundColor(Color.TRANSPARENT);
+
+ // Display icon
+ holder.imgIcon.setImageDrawable(xApp.appInfo.getIcon(ActivityShare.this));
+ holder.imgIcon.setVisibility(View.VISIBLE);
+
+ holder.imgInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ // Packages can be selected on the web site
+ Util.viewUri(ActivityShare.this, Uri.parse(String.format(getBaseURL() + "?package_name=%s",
+ xApp.appInfo.getPackageName().get(0))));
+ }
+ });
+
+ // Set app name
+ holder.tvName.setText(xApp.appInfo.toString());
+
+ // Show app share state
+ if (TextUtils.isEmpty(xApp.message))
+ holder.tvMessage.setVisibility(View.GONE);
+ else {
+ holder.tvMessage.setVisibility(View.VISIBLE);
+ holder.tvMessage.setText(xApp.message);
+ }
+ switch (xApp.state) {
+ case STATE_WAITING:
+ holder.imgResult.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.GONE);
+ break;
+ case STATE_RUNNING:
+ holder.imgResult.setVisibility(View.GONE);
+ holder.pbRunning.setVisibility(View.VISIBLE);
+ break;
+ case STATE_SUCCESS:
+ holder.imgResult.setBackgroundResource(R.drawable.btn_check_buttonless_on);
+ holder.imgResult.setVisibility(View.VISIBLE);
+ holder.pbRunning.setVisibility(View.GONE);
+ break;
+ case STATE_FAILURE:
+ holder.imgResult.setBackgroundResource(R.drawable.indicator_input_error);
+ holder.imgResult.setVisibility(View.VISIBLE);
+ holder.pbRunning.setVisibility(View.GONE);
+ break;
+ default:
+ Util.log(null, Log.ERROR, "Unknown state=" + xApp.state);
+ break;
+ }
+
+ return convertView;
+ }
+ }
+
+ // Tasks
+
+ private class AppListTask extends AsyncTask> {
+ private ProgressDialog mProgressDialog;
+
+ @Override
+ protected List doInBackground(int[]... params) {
+ int[] uids = params[0];
+ List apps = new ArrayList();
+ mAppsByUid = new SparseArray();
+
+ if (!mInteractive && mActionId == R.string.menu_export) {
+ // Build list of distinct uids for export
+ List listUid = new ArrayList();
+ for (PackageInfo pInfo : getPackageManager().getInstalledPackages(0))
+ if (!listUid.contains(pInfo.applicationInfo.uid))
+ listUid.add(pInfo.applicationInfo.uid);
+
+ // Convert to primitive array
+ uids = new int[listUid.size()];
+ for (int i = 0; i < listUid.size(); i++)
+ uids[i] = listUid.get(i);
+ }
+
+ mProgressDialog.setMax(uids.length);
+ for (int i = 0; i < uids.length; i++) {
+ mProgressDialog.setProgress(i);
+ AppState app = new AppState(uids[i]);
+ apps.add(app);
+ mAppsByUid.put(uids[i], app);
+ }
+
+ Collections.sort(apps);
+ return apps;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Override
+ protected void onPreExecute() {
+ super.onPreExecute();
+
+ TypedArray ta = getTheme().obtainStyledAttributes(new int[] { R.attr.progress_horizontal });
+ int progress_horizontal = ta.getResourceId(0, 0);
+ ta.recycle();
+
+ // Show progress dialog
+ mProgressDialog = new ProgressDialog(ActivityShare.this);
+ mProgressDialog.setMessage(getString(R.string.msg_loading));
+ mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
+ mProgressDialog.setProgressDrawable(getResources().getDrawable(progress_horizontal));
+ mProgressDialog.setProgressNumberFormat(null);
+ mProgressDialog.setCancelable(false);
+ mProgressDialog.setCanceledOnTouchOutside(false);
+ mProgressDialog.show();
+ }
+
+ @Override
+ protected void onPostExecute(List listApp) {
+ if (!ActivityShare.this.isFinishing()) {
+ // Display app list
+ mAppAdapter = new AppListAdapter(ActivityShare.this, R.layout.shareentry, listApp);
+ ListView lvShare = (ListView) findViewById(R.id.lvShare);
+ lvShare.setAdapter(mAppAdapter);
+
+ // Dismiss progress dialog
+ if (mProgressDialog.isShowing())
+ try {
+ mProgressDialog.dismiss();
+ } catch (IllegalArgumentException ignored) {
+ }
+
+ // Launch non-interactive export
+ if (!mInteractive && mActionId == R.string.menu_export) {
+ mRunning = true;
+ new ExportTask().executeOnExecutor(mExecutor, new File(mFileName));
+ }
+ }
+
+ super.onPostExecute(listApp);
+ }
+ }
+
+ private class ToggleTask extends AsyncTask {
+ @Override
+ protected Throwable doInBackground(String... params) {
+ // Get wakelock
+ PowerManager pm = (PowerManager) ActivityShare.this.getSystemService(Context.POWER_SERVICE);
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "XPrivacy.Toggle");
+ wl.acquire();
+ try {
+ // Get data
+ mProgressCurrent = 0;
+ List lstUid = mAppAdapter.getListUid();
+ final String restrictionName = params[0];
+ int actionId = ((RadioGroup) ActivityShare.this.findViewById(R.id.rgToggle)).getCheckedRadioButtonId();
+ Spinner spTemplate = ((Spinner) ActivityShare.this.findViewById(R.id.spTemplate));
+ String templateName = Meta.cTypeTemplate;
+ if (spTemplate.getSelectedItemPosition() > 0)
+ templateName = Meta.cTypeTemplate + spTemplate.getSelectedItemPosition();
+
+ for (Integer uid : lstUid)
+ try {
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+
+ // Update progess
+ publishProgress(++mProgressCurrent, lstUid.size() + 1);
+ setState(uid, STATE_RUNNING, null);
+
+ List oldState = PrivacyManager.getRestartStates(uid, restrictionName);
+
+ if (actionId == R.id.rbClear) {
+ PrivacyManager.deleteRestrictions(uid, restrictionName, (restrictionName == null));
+ if (restrictionName == null) {
+ PrivacyManager.deleteUsage(uid);
+ PrivacyManager.deleteSettings(uid);
+ }
+ }
+
+ else if (actionId == R.id.rbRestrict) {
+ PrivacyManager.setRestriction(uid, restrictionName, null, true, false);
+ PrivacyManager.updateState(uid);
+ }
+
+ else if (actionId == R.id.rbTemplateCategory)
+ PrivacyManager.applyTemplate(uid, templateName, restrictionName, false, true, false);
+
+ else if (actionId == R.id.rbTemplateFull)
+ PrivacyManager.applyTemplate(uid, templateName, restrictionName, true, true, false);
+
+ else if (actionId == R.id.rbTemplateMergeSet)
+ PrivacyManager.applyTemplate(uid, templateName, restrictionName, true, false, false);
+
+ else if (actionId == R.id.rbTemplateMergeReset)
+ PrivacyManager.applyTemplate(uid, templateName, restrictionName, true, false, true);
+
+ else if (actionId == R.id.rbEnableOndemand) {
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemand, Boolean.toString(true));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingNotify, Boolean.toString(false));
+
+ } else if (actionId == R.id.rbDisableOndemand) {
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemand, Boolean.toString(false));
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingNotify, Boolean.toString(true));
+
+ } else
+ Util.log(null, Log.ERROR, "Unknown action=" + actionId);
+
+ List newState = PrivacyManager.getRestartStates(uid, restrictionName);
+
+ setState(uid, STATE_SUCCESS, !newState.equals(oldState) ? getString(R.string.msg_restart)
+ : null);
+ } catch (Throwable ex) {
+ setState(uid, STATE_FAILURE, ex.getMessage());
+ return ex;
+ }
+ } finally {
+ wl.release();
+ }
+
+ return null;
+ }
+
+ @Override
+ protected void onProgressUpdate(Integer... values) {
+ blueStreakOfProgress(values[0], values[1]);
+ super.onProgressUpdate(values);
+ }
+
+ @Override
+ protected void onPostExecute(Throwable result) {
+ if (!ActivityShare.this.isFinishing())
+ done(result);
+ super.onPostExecute(result);
+ }
+ }
+
+ private class ExportTask extends AsyncTask {
+ private File mFile;
+
+ @Override
+ protected Throwable doInBackground(File... params) {
+ // Get wakelock
+ PowerManager pm = (PowerManager) ActivityShare.this.getSystemService(Context.POWER_SERVICE);
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "XPrivacy.Export");
+ wl.acquire();
+
+ mProgressCurrent = 0;
+ try {
+ mFile = params[0];
+
+ List listUid = mAppAdapter.getListUid();
+
+ Util.log(null, Log.INFO, "Exporting " + mFile);
+ String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
+
+ FileOutputStream fos = new FileOutputStream(mFile);
+ try {
+ // Start serialization
+ XmlSerializer serializer = Xml.newSerializer();
+ serializer.setOutput(fos, "UTF-8");
+ serializer.startDocument(null, Boolean.valueOf(true));
+ serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
+ serializer.startTag(null, "XPrivacy");
+
+ // Process package map
+ for (PackageInfo pInfo : getPackageManager().getInstalledPackages(0))
+ if (listUid.size() == 1 ? pInfo.applicationInfo.uid == listUid.get(0) : true) {
+ serializer.startTag(null, "PackageInfo");
+ serializer.attribute(null, "Id", Integer.toString(pInfo.applicationInfo.uid));
+ serializer.attribute(null, "Name", pInfo.packageName);
+ serializer.endTag(null, "PackageInfo");
+ }
+
+ // Process global settings
+ if (listUid.size() > 1) {
+ List listGlobalSetting = PrivacyManager.getSettingList(0, null);
+ for (PSetting setting : listGlobalSetting) {
+ // Serialize setting
+ serializer.startTag(null, "Setting");
+ serializer.attribute(null, "Id", "");
+ serializer.attribute(null, "Type", setting.type);
+ serializer.attribute(null, "Name", setting.name);
+ if (setting.value != null)
+ serializer.attribute(null, "Value", setting.value);
+ serializer.endTag(null, "Setting");
+ }
+ }
+
+ // Process application settings and restrictions
+ for (int uid : listUid)
+ try {
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+
+ publishProgress(++mProgressCurrent, listUid.size() + 1);
+ setState(uid, STATE_RUNNING, null);
+
+ // Process application settings
+ List listAppSetting = PrivacyManager.getSettingList(uid, null);
+ for (PSetting setting : listAppSetting) {
+ // Bind accounts/contacts to same device
+ if (Meta.cTypeAccount.equals(setting.type) || Meta.cTypeContact.equals(setting.type))
+ setting.name += "." + android_id;
+
+ // Serialize setting
+ serializer.startTag(null, "Setting");
+ serializer.attribute(null, "Id", Integer.toString(uid));
+ serializer.attribute(null, "Type", setting.type);
+ serializer.attribute(null, "Name", setting.name);
+ serializer.attribute(null, "Value", setting.value);
+ serializer.endTag(null, "Setting");
+ }
+
+ // Process restrictions
+ for (String restrictionName : PrivacyManager.getRestrictions()) {
+ // Category
+ PRestriction crestricted = PrivacyManager.getRestrictionEx(uid, restrictionName, null);
+ serializer.startTag(null, "Restriction");
+ serializer.attribute(null, "Id", Integer.toString(uid));
+ serializer.attribute(null, "Name", restrictionName);
+ serializer.attribute(null, "Restricted", Boolean.toString(crestricted.restricted));
+ serializer.attribute(null, "Asked", Boolean.toString(crestricted.asked));
+ serializer.endTag(null, "Restriction");
+
+ // Methods
+ for (Hook md : PrivacyManager.getHooks(restrictionName, null)) {
+ PRestriction mrestricted = PrivacyManager.getRestrictionEx(uid, restrictionName,
+ md.getName());
+ if ((crestricted.restricted && !mrestricted.restricted)
+ || (!crestricted.asked && mrestricted.asked) || md.isDangerous()) {
+ serializer.startTag(null, "Restriction");
+ serializer.attribute(null, "Id", Integer.toString(uid));
+ serializer.attribute(null, "Name", restrictionName);
+ serializer.attribute(null, "Method", md.getName());
+ serializer.attribute(null, "Restricted",
+ Boolean.toString(mrestricted.restricted));
+ serializer.attribute(null, "Asked", Boolean.toString(mrestricted.asked));
+ serializer.endTag(null, "Restriction");
+ }
+ }
+ }
+
+ setState(uid, STATE_SUCCESS, null);
+ } catch (Throwable ex) {
+ setState(uid, STATE_FAILURE, ex.getMessage());
+ throw ex;
+ }
+ // End serialization
+ serializer.endTag(null, "XPrivacy");
+ serializer.endDocument();
+ serializer.flush();
+ } finally {
+ fos.close();
+ }
+
+ // Display message
+ Util.log(null, Log.INFO, "Exporting finished");
+ return null;
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ if (mFile.exists())
+ mFile.delete();
+ return ex;
+ } finally {
+ wl.release();
+ }
+ }
+
+ @Override
+ protected void onProgressUpdate(Integer... values) {
+ blueStreakOfProgress(values[0], values[1]);
+ super.onProgressUpdate(values);
+ }
+
+ @Override
+ protected void onPostExecute(Throwable result) {
+ if (!ActivityShare.this.isFinishing())
+ if (mInteractive) {
+ done(result);
+
+ // Share
+ if (result == null) {
+ Intent intent = new Intent(android.content.Intent.ACTION_SEND);
+ intent.setType("text/xml");
+ intent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + mFileName));
+ startActivity(Intent.createChooser(intent,
+ String.format(getString(R.string.msg_saved_to), mFileName)));
+ }
+ } else {
+ done(result);
+ finish();
+ }
+
+ super.onPostExecute(result);
+ }
+ }
+
+ private class ImportTask extends AsyncTask {
+ @Override
+ protected Throwable doInBackground(Object... params) {
+ // Get wakelock
+ PowerManager pm = (PowerManager) ActivityShare.this.getSystemService(Context.POWER_SERVICE);
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "XPrivacy.Import");
+ wl.acquire();
+ try {
+ // Parameters
+ File file = (File) params[0];
+ boolean clear = (Boolean) params[1];
+ List listUidSelected = mAppAdapter.getListUid();
+
+ // Progress
+ mProgressCurrent = 0;
+ final int max = listUidSelected.size() + 1;
+ Runnable progress = new Runnable() {
+ @Override
+ public void run() {
+ publishProgress(++mProgressCurrent, max);
+ }
+ };
+
+ // Parse XML
+ Util.log(null, Log.INFO, "Importing " + file);
+ FileInputStream fis = null;
+ Map>> mapPackage;
+ try {
+ fis = new FileInputStream(file);
+ XMLReader xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();
+ ImportHandler importHandler = new ImportHandler(clear, listUidSelected, progress);
+ xmlReader.setContentHandler(importHandler);
+ xmlReader.parse(new InputSource(fis));
+ mapPackage = importHandler.getPackageMap();
+
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+ } finally {
+ if (fis != null)
+ fis.close();
+ }
+
+ // Progress
+ int progressMax = mapPackage.size();
+
+ // Process result (legacy)
+ for (String packageName : mapPackage.keySet()) {
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+
+ int uid = 0;
+ try {
+ publishProgress(++mProgressCurrent, progressMax + 1);
+
+ // Get uid
+ uid = getPackageManager().getPackageInfo(packageName, 0).applicationInfo.uid;
+
+ if (listUidSelected.contains(uid)) {
+ Util.log(null, Log.INFO, "Importing " + packageName);
+ setState(uid, STATE_RUNNING, null);
+
+ // Reset existing restrictions
+ List oldState = PrivacyManager.getRestartStates(uid, null);
+ PrivacyManager.deleteRestrictions(uid, null, true);
+
+ // Set imported restrictions
+ for (String restrictionName : mapPackage.get(packageName).keySet()) {
+ PrivacyManager.setRestriction(uid, restrictionName, null, true, false);
+ for (ImportHandler.MethodDescription md : mapPackage.get(packageName).get(
+ restrictionName))
+ PrivacyManager.setRestriction(uid, restrictionName, md.getMethodName(),
+ md.isRestricted(), false);
+ }
+ PrivacyManager.updateState(uid);
+ List newState = PrivacyManager.getRestartStates(uid, null);
+
+ setState(uid, STATE_SUCCESS, !newState.equals(oldState) ? getString(R.string.msg_restart)
+ : null);
+ }
+ } catch (NameNotFoundException ignored) {
+ } catch (Throwable ex) {
+ if (listUidSelected.contains(uid))
+ setState(uid, STATE_FAILURE, ex.getMessage());
+ Util.bug(null, ex);
+ }
+ }
+
+ // Display message
+ Util.log(null, Log.INFO, "Importing finished");
+ return null;
+ } catch (Throwable ex) {
+ return ex;
+ } finally {
+ wl.release();
+ }
+ }
+
+ @Override
+ protected void onProgressUpdate(Integer... values) {
+ blueStreakOfProgress(values[0], values[1]);
+ super.onProgressUpdate(values);
+ }
+
+ @Override
+ protected void onPostExecute(Throwable result) {
+ if (!ActivityShare.this.isFinishing())
+ done(result);
+ super.onPostExecute(result);
+ }
+ }
+
+ private class ImportHandler extends DefaultHandler {
+ private boolean mClear;
+ private List mListUidSelected;
+ private List mListUidSettings = new ArrayList();
+ private List mListUidRestrictions = new ArrayList();
+
+ private int lastUid = -1;
+ private List mOldState = null;
+
+ private SparseArray mMapId = new SparseArray();
+ private Map mMapUid = new HashMap();
+ private Map>> mMapPackage = new HashMap>>();
+
+ private Runnable mProgress;
+ private String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
+
+ public ImportHandler(boolean clear, List listUidSelected, Runnable progress) {
+ mClear = clear;
+ mListUidSelected = listUidSelected;
+ mProgress = progress;
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes attributes) {
+ try {
+ if (qName.equals("XPrivacy")) {
+ // Root
+
+ } else if (qName.equals("PackageInfo")) {
+ // Package info
+ int id = Integer.parseInt(attributes.getValue("Id"));
+ String name = attributes.getValue("Name");
+ mMapId.put(id, name);
+
+ } else if (qName.equals("Setting")) {
+ // Setting
+ String id = attributes.getValue("Id");
+ String type = attributes.getValue("Type");
+ String name = attributes.getValue("Name");
+ String value = attributes.getValue("Value");
+
+ // Failsafe
+ if (name == null)
+ return;
+
+ // Do not import version number
+ if (name.equals(PrivacyManager.cSettingVersion))
+ return;
+
+ // Decode legacy type
+ if (name.startsWith("Account.") || name.startsWith("Application.") || name.startsWith("Contact.")
+ || name.startsWith("Template.") || name.startsWith("Whitelist.")) {
+ name = name.replace("Whitelist.", "");
+ int dot = name.indexOf('.');
+ type = name.substring(0, dot);
+ name = name.substring(dot + 1);
+ } else if (type == null)
+ type = "";
+
+ // Import accounts/contacts only for same device
+ if (Meta.cTypeAccount.equals(type) || Meta.cTypeContact.equals(type))
+ if (name.endsWith("." + android_id))
+ name = name.replace("." + android_id, "");
+ else
+ return;
+
+ if (id == null) {
+ // Legacy
+ Util.log(null, Log.WARN, "Legacy " + name + "=" + value);
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.setSetting(userId, name, value);
+
+ } else if ("".equals(id)) {
+ // Global setting
+ if (mListUidSelected.size() > 1) {
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.setSetting(userId, type, name, value);
+ }
+
+ } else {
+ // Application setting
+ int iid = Integer.parseInt(id);
+ int uid = getUid(iid);
+ if (mListUidSelected.contains(uid)) {
+ // Check for abort
+ if (mAbort && !mListUidSettings.contains(uid)) {
+ setState(uid, STATE_FAILURE);
+ setMessage(uid, getString(R.string.msg_aborted));
+ return;
+ }
+
+ // Check for new uid
+ if (!mListUidSettings.contains(uid)) {
+ // Mark previous as success
+ if (lastUid > 0) {
+ boolean restart = !PrivacyManager.getRestartStates(lastUid, null).equals(mOldState);
+ setState(lastUid, STATE_SUCCESS, restart ? getString(R.string.msg_restart) : null);
+ }
+
+ // Update state
+ lastUid = uid;
+ mListUidSettings.add(uid);
+
+ // Update visible state
+ setState(uid, STATE_RUNNING, null);
+
+ // Clear settings
+ if (mClear)
+ PrivacyManager.deleteSettings(uid);
+ }
+
+ PrivacyManager.setSetting(uid, type, name, value);
+ }
+ }
+
+ } else if (qName.equals("Package")) {
+ // Restriction (legacy)
+ String packageName = attributes.getValue("Name");
+ String restrictionName = attributes.getValue("Restriction");
+ String methodName = attributes.getValue("Method");
+ boolean restricted = Boolean.parseBoolean(attributes.getValue("Restricted"));
+ Util.log(null, Log.WARN, "Legacy package=" + packageName + " " + restrictionName + "/" + methodName
+ + "=" + restricted);
+
+ // Map package restriction
+ if (!mMapPackage.containsKey(packageName))
+ mMapPackage.put(packageName, new HashMap>());
+ if (!mMapPackage.get(packageName).containsKey(restrictionName))
+ mMapPackage.get(packageName).put(restrictionName, new ArrayList());
+ if (methodName != null) {
+ MethodDescription md = new MethodDescription(methodName, restricted);
+ mMapPackage.get(packageName).get(restrictionName).add(md);
+ }
+
+ } else if (qName.equals("Restriction")) {
+ // Restriction (new style)
+ int id = Integer.parseInt(attributes.getValue("Id"));
+ String restrictionName = attributes.getValue("Name");
+ String methodName = attributes.getValue("Method");
+ boolean restricted = Boolean.parseBoolean(attributes.getValue("Restricted"));
+ boolean asked = Boolean.parseBoolean(attributes.getValue("Asked"));
+
+ // Get uid
+ int uid = getUid(id);
+ if (mListUidSelected.contains(uid)) {
+ // Check for abort
+ if (mAbort && !mListUidRestrictions.contains(uid)) {
+ setState(uid, STATE_FAILURE);
+ setMessage(uid, getString(R.string.msg_aborted));
+ return;
+ }
+
+ // Check for new uid
+ if (!mListUidRestrictions.contains(uid)) {
+ // Mark previous as success
+ if (lastUid > 0) {
+ PrivacyManager.updateState(lastUid);
+ boolean restart = !PrivacyManager.getRestartStates(lastUid, null).equals(mOldState);
+ setState(lastUid, STATE_SUCCESS, restart ? getString(R.string.msg_restart) : null);
+ }
+
+ // Update state
+ lastUid = uid;
+ mListUidRestrictions.add(uid);
+ mOldState = PrivacyManager.getRestartStates(uid, null);
+
+ // Update visible state
+ setState(uid, STATE_RUNNING, null);
+ runOnUiThread(mProgress);
+
+ // Clear restrictions
+ if (mClear)
+ PrivacyManager.deleteRestrictions(uid, null, false);
+ }
+
+ // Set restriction
+ PrivacyManager.setRestriction(uid, restrictionName, methodName, restricted, asked);
+ }
+ } else
+ Util.log(null, Log.WARN, "Unknown element name=" + qName);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) {
+ if (qName.equals("XPrivacy")) {
+ if (lastUid > 0) {
+ PrivacyManager.updateState(lastUid);
+ boolean restart = !PrivacyManager.getRestartStates(lastUid, null).equals(mOldState);
+ setState(lastUid, STATE_SUCCESS, restart ? getString(R.string.msg_restart) : null);
+ }
+
+ // Cleanup salt
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.removeLegacySalt(userId);
+ }
+ }
+
+ private int getUid(int id) {
+ String packageName = mMapId.get(id);
+ if (packageName == null) {
+ Util.log(null, Log.WARN, "Unknown id=" + id);
+ return -1;
+ } else if (!mMapUid.containsKey(packageName))
+ try {
+ int newuid = ActivityShare.this.getPackageManager().getPackageInfo(packageName, 0).applicationInfo.uid;
+ mMapUid.put(packageName, newuid);
+ } catch (NameNotFoundException ex) {
+ // Do not lookup again
+ mMapUid.put(packageName, -1);
+ Util.log(null, Log.WARN, "Unknown package name=" + packageName);
+ }
+ return (mMapUid.containsKey(packageName) ? mMapUid.get(packageName) : -1);
+ }
+
+ public Map>> getPackageMap() {
+ return mMapPackage;
+ }
+
+ public class MethodDescription {
+ private String mMethodName;
+ private boolean mRestricted;
+
+ public MethodDescription(String methodName, boolean restricted) {
+ mMethodName = methodName;
+ mRestricted = restricted;
+ }
+
+ public String getMethodName() {
+ return mMethodName;
+ }
+
+ public boolean isRestricted() {
+ return mRestricted;
+ }
+ }
+ }
+
+ private class FetchTask extends AsyncTask {
+ @Override
+ @SuppressLint("DefaultLocale")
+ protected Throwable doInBackground(Boolean... params) {
+ // Get wakelock
+ PowerManager pm = (PowerManager) ActivityShare.this.getSystemService(Context.POWER_SERVICE);
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "XPrivacy.Fetch");
+ wl.acquire();
+ try {
+ // Get data
+ boolean clear = params[0];
+ List lstApp = mAppAdapter.getListAppInfo();
+
+ int userId = Util.getUserId(Process.myUid());
+ String[] license = Util.getProLicenseUnchecked();
+ String android_id = Secure.getString(ActivityShare.this.getContentResolver(), Secure.ANDROID_ID);
+ PackageInfo xInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
+ String confidence = PrivacyManager.getSetting(userId, PrivacyManager.cSettingConfidence, "");
+
+ // Initialize progress
+ mProgressCurrent = 0;
+
+ // Process applications
+ for (ApplicationInfoEx appInfo : lstApp)
+ try {
+ publishProgress(++mProgressCurrent, lstApp.size() + 1);
+
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+
+ setState(appInfo.getUid(), STATE_RUNNING, ActivityShare.this.getString(R.string.menu_fetch));
+
+ JSONArray appName = new JSONArray();
+ for (String name : appInfo.getApplicationName())
+ appName.put(name);
+
+ JSONArray pkgName = new JSONArray();
+ for (String name : appInfo.getPackageName())
+ pkgName.put(name);
+
+ JSONArray pkgVersion = new JSONArray();
+ for (String version : appInfo.getPackageVersionName(ActivityShare.this))
+ pkgVersion.put(version);
+
+ // Encode package
+ JSONObject jRoot = new JSONObject();
+ jRoot.put("protocol_version", cProtocolVersion);
+ jRoot.put("android_id", Util.md5(android_id).toLowerCase());
+ jRoot.put("android_sdk", Build.VERSION.SDK_INT);
+ jRoot.put("xprivacy_version", xInfo.versionCode);
+ jRoot.put("application_name", appName);
+ jRoot.put("package_name", pkgName);
+ jRoot.put("package_version", pkgVersion);
+ jRoot.put("email", license[1]);
+ jRoot.put("signature", license[2]);
+ jRoot.put("confidence", confidence);
+
+ // Fetch
+ HttpParams httpParams = new BasicHttpParams();
+ HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpClient httpclient = new DefaultHttpClient(httpParams);
+
+ HttpPost httpost = new HttpPost(getBaseURL() + "?format=json&action=fetch");
+ httpost.setEntity(new ByteArrayEntity(jRoot.toString().getBytes("UTF-8")));
+ httpost.setHeader("Accept", "application/json");
+ httpost.setHeader("Content-type", "application/json");
+ HttpResponse response = httpclient.execute(httpost);
+ StatusLine statusLine = response.getStatusLine();
+
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+
+ setState(appInfo.getUid(), STATE_RUNNING, ActivityShare.this.getString(R.string.msg_applying));
+
+ if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
+ // Succeeded
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ response.getEntity().writeTo(out);
+ out.close();
+
+ // Deserialize
+ JSONObject status = new JSONObject(out.toString("UTF-8"));
+ if (status.getBoolean("ok")) {
+ JSONArray settings = status.getJSONArray("settings");
+ // Delete existing restrictions
+ List oldState = PrivacyManager.getRestartStates(appInfo.getUid(), null);
+
+ // Clear existing restriction
+ if (clear)
+ PrivacyManager.deleteRestrictions(appInfo.getUid(), null, true);
+
+ // Set fetched restrictions
+ List listRestriction = new ArrayList();
+ for (int i = 0; i < settings.length(); i++) {
+ JSONObject entry = settings.getJSONObject(i);
+ String restrictionName = entry.getString("restriction");
+ String methodName = entry.has("method") ? entry.getString("method") : null;
+ int voted_restricted = entry.getInt("restricted");
+ int voted_not_restricted = entry.getInt("not_restricted");
+ boolean restricted = (voted_restricted > voted_not_restricted);
+ if (clear || restricted)
+ listRestriction.add(new PRestriction(appInfo.getUid(), restrictionName,
+ methodName, restricted));
+ }
+ PrivacyManager.setRestrictionList(listRestriction);
+ List newState = PrivacyManager.getRestartStates(appInfo.getUid(), null);
+
+ // Mark as new/changed
+ PrivacyManager.setSetting(appInfo.getUid(), PrivacyManager.cSettingState,
+ Integer.toString(ApplicationInfoEx.STATE_ATTENTION));
+
+ // Change app modification time
+ PrivacyManager.setSetting(appInfo.getUid(), PrivacyManager.cSettingModifyTime,
+ Long.toString(System.currentTimeMillis()));
+
+ setState(appInfo.getUid(), STATE_SUCCESS,
+ !newState.equals(oldState) ? getString(R.string.msg_restart) : null);
+ } else {
+ int errno = status.getInt("errno");
+ String message = status.getString("error");
+ ServerException ex = new ServerException(ActivityShare.this, errno, message);
+ setState(appInfo.getUid(), STATE_FAILURE, ex.getMessage());
+ }
+ } else {
+ // Failed
+ response.getEntity().getContent().close();
+ throw new IOException(statusLine.getReasonPhrase());
+ }
+ } catch (Throwable ex) {
+ setState(appInfo.getUid(), STATE_FAILURE, ex.getMessage());
+ throw ex;
+ }
+ return null;
+ } catch (ConnectTimeoutException ex) {
+ return ex;
+ } catch (HttpHostConnectException ex) {
+ return ex;
+ } catch (SocketTimeoutException ex) {
+ return ex;
+ } catch (SSLException ex) {
+ return ex;
+ } catch (UnknownHostException ex) {
+ return ex;
+ } catch (IOException ex) {
+ return ex;
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ return ex;
+ } finally {
+ wl.release();
+ }
+ }
+
+ @Override
+ protected void onProgressUpdate(Integer... values) {
+ blueStreakOfProgress(values[0], values[1]);
+ super.onProgressUpdate(values);
+ }
+
+ @Override
+ protected void onPostExecute(Throwable result) {
+ if (!ActivityShare.this.isFinishing())
+ done(result);
+ super.onPostExecute(result);
+ }
+ }
+
+ @SuppressLint("DefaultLocale")
+ private class SubmitTask extends AsyncTask {
+ @Override
+ protected Throwable doInBackground(Object... params) {
+ // Get wakelock
+ PowerManager pm = (PowerManager) ActivityShare.this.getSystemService(Context.POWER_SERVICE);
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "XPrivacy.Submit");
+ wl.acquire();
+ try {
+ // Get data
+ List lstApp = mAppAdapter.getListAppInfo();
+
+ // Initialize progress
+ mProgressCurrent = 0;
+
+ for (ApplicationInfoEx appInfo : lstApp)
+ try {
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+
+ // Update progess
+ publishProgress(++mProgressCurrent, lstApp.size() + 1);
+ setState(appInfo.getUid(), STATE_RUNNING, ActivityShare.this.getString(R.string.msg_loading));
+
+ // Check if any account allowed
+ boolean allowedAccounts = false;
+ AccountManager accountManager = AccountManager.get(ActivityShare.this);
+ for (Account account : accountManager.getAccounts()) {
+ String sha1 = Util.sha1(account.name + account.type);
+ boolean allowed = PrivacyManager.getSettingBool(appInfo.getUid(), Meta.cTypeAccount, sha1,
+ false);
+ if (allowed) {
+ allowedAccounts = true;
+ break;
+ }
+ }
+
+ // Check if any application allowed
+ boolean allowedApplications = false;
+ for (ApplicationInfoEx aAppInfo : ApplicationInfoEx.getXApplicationList(ActivityShare.this,
+ null))
+ for (String packageName : aAppInfo.getPackageName()) {
+ boolean allowed = PrivacyManager.getSettingBool(-appInfo.getUid(),
+ Meta.cTypeApplication, packageName, false);
+ if (allowed) {
+ allowedApplications = true;
+ break;
+ }
+ }
+
+ // Check if any contact allowed
+ boolean allowedContacts = false;
+ Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,
+ new String[] { ContactsContract.Contacts._ID }, null, null, null);
+ if (cursor != null)
+ try {
+ while (cursor.moveToNext()) {
+ long id = cursor.getLong(cursor.getColumnIndex(ContactsContract.Contacts._ID));
+ boolean allowed = PrivacyManager.getSettingBool(-appInfo.getUid(),
+ Meta.cTypeContact, Long.toString(id), false);
+ if (allowed) {
+ allowedContacts = true;
+ break;
+ }
+ }
+ } finally {
+ cursor.close();
+ }
+
+ // Get white lists
+ Map> mapWhitelist = PrivacyManager.listWhitelisted(
+ appInfo.getUid(), null);
+
+ // Encode restrictions
+ JSONArray jSettings = new JSONArray();
+ for (String restrictionName : PrivacyManager.getRestrictions()) {
+ boolean restricted = PrivacyManager.getRestrictionEx(appInfo.getUid(), restrictionName,
+ null).restricted;
+ // Category
+ long used = PrivacyManager.getUsage(appInfo.getUid(), restrictionName, null);
+ JSONObject jRestriction = new JSONObject();
+ jRestriction.put("restriction", restrictionName);
+ jRestriction.put("restricted", restricted);
+ jRestriction.put("used", used);
+ if (restrictionName.equals(PrivacyManager.cAccounts))
+ jRestriction.put("allowed", allowedAccounts ? 1 : 0);
+ else if (restrictionName.equals(PrivacyManager.cSystem))
+ jRestriction.put("allowed", allowedApplications ? 1 : 0);
+ else if (restrictionName.equals(PrivacyManager.cContacts))
+ jRestriction.put("allowed", allowedContacts ? 1 : 0);
+ jSettings.put(jRestriction);
+
+ // Methods
+ for (Hook md : PrivacyManager.getHooks(restrictionName, null)) {
+ boolean mRestricted = restricted
+ && PrivacyManager.getRestrictionEx(appInfo.getUid(), restrictionName,
+ md.getName()).restricted;
+ long mUsed = PrivacyManager.getUsage(appInfo.getUid(), restrictionName, md.getName());
+
+ boolean mWhitelisted = false;
+ if (md.whitelist() != null && mapWhitelist.containsKey(md.whitelist()))
+ for (Boolean allowed : mapWhitelist.get(md.whitelist()).values())
+ if (mRestricted ? allowed : !allowed) {
+ mWhitelisted = true;
+ break;
+ }
+
+ JSONObject jMethod = new JSONObject();
+ jMethod.put("restriction", restrictionName);
+ jMethod.put("method", md.getName());
+ jMethod.put("restricted", mRestricted);
+ jMethod.put("used", mUsed);
+ jMethod.put("allowed", mWhitelisted ? 1 : 0);
+ jSettings.put(jMethod);
+ }
+ }
+
+ // Get data
+ String[] license = Util.getProLicenseUnchecked();
+ PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
+ String android_id = Secure
+ .getString(ActivityShare.this.getContentResolver(), Secure.ANDROID_ID);
+
+ JSONArray appName = new JSONArray();
+ for (String name : appInfo.getApplicationName())
+ appName.put(name);
+
+ JSONArray pkgName = new JSONArray();
+ for (String name : appInfo.getPackageName())
+ pkgName.put(name);
+
+ JSONArray pkgVersionName = new JSONArray();
+ for (String version : appInfo.getPackageVersionName(ActivityShare.this))
+ pkgVersionName.put(version);
+
+ JSONArray pkgVersionCode = new JSONArray();
+ for (Integer version : appInfo.getPackageVersionCode(ActivityShare.this))
+ pkgVersionCode.put((int) version);
+
+ // Encode package
+ JSONObject jRoot = new JSONObject();
+ jRoot.put("protocol_version", cProtocolVersion);
+ jRoot.put("android_id", Util.md5(android_id).toLowerCase());
+ jRoot.put("android_sdk", Build.VERSION.SDK_INT);
+ jRoot.put("xprivacy_version", pInfo.versionCode);
+ jRoot.put("application_name", appName);
+ jRoot.put("package_name", pkgName);
+ jRoot.put("package_version_name", pkgVersionName);
+ jRoot.put("package_version_code", pkgVersionCode);
+ jRoot.put("settings", jSettings);
+ if (license != null) {
+ jRoot.put("email", license[1]);
+ jRoot.put("signature", license[2]);
+ }
+
+ if (mAbort)
+ throw new AbortException(ActivityShare.this);
+
+ setState(appInfo.getUid(), STATE_RUNNING, ActivityShare.this.getString(R.string.menu_submit));
+
+ // Submit
+ HttpParams httpParams = new BasicHttpParams();
+ HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpClient httpclient = new DefaultHttpClient(httpParams);
+
+ HttpPost httpost = new HttpPost(getBaseURL() + "?format=json&action=submit");
+ httpost.setEntity(new ByteArrayEntity(jRoot.toString().getBytes("UTF-8")));
+ httpost.setHeader("Accept", "application/json");
+ httpost.setHeader("Content-type", "application/json");
+ HttpResponse response = httpclient.execute(httpost);
+ StatusLine statusLine = response.getStatusLine();
+
+ if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
+ // Succeeded
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ response.getEntity().writeTo(out);
+ out.close();
+ JSONObject status = new JSONObject(out.toString("UTF-8"));
+ if (status.getBoolean("ok")) {
+ // Mark as shared
+ PrivacyManager.setSetting(appInfo.getUid(), PrivacyManager.cSettingState,
+ Integer.toString(ApplicationInfoEx.STATE_SHARED));
+ setState(appInfo.getUid(), STATE_SUCCESS, null);
+ } else {
+ int errno = status.getInt("errno");
+ String message = status.getString("error");
+ ServerException ex = new ServerException(ActivityShare.this, errno, message);
+
+ // Mark as unregistered
+ if (errno == ServerException.cErrorNotActivated) {
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingRegistered,
+ Boolean.toString(false));
+ throw ex;
+ } else
+ setState(appInfo.getUid(), STATE_FAILURE, ex.getMessage());
+ }
+ } else {
+ // Failed
+ response.getEntity().getContent().close();
+ throw new IOException(statusLine.getReasonPhrase());
+ }
+ } catch (Throwable ex) {
+ setState(appInfo.getUid(), STATE_FAILURE, ex.getMessage());
+ throw ex;
+ }
+ return null;
+ } catch (ConnectTimeoutException ex) {
+ return ex;
+ } catch (HttpHostConnectException ex) {
+ return ex;
+ } catch (SocketTimeoutException ex) {
+ return ex;
+ } catch (SSLException ex) {
+ return ex;
+ } catch (UnknownHostException ex) {
+ return ex;
+ } catch (IOException ex) {
+ return ex;
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ return ex;
+ } finally {
+ wl.release();
+ }
+ }
+
+ @Override
+ protected void onProgressUpdate(Integer... values) {
+ blueStreakOfProgress(values[0], values[1]);
+ super.onProgressUpdate(values);
+ }
+
+ @Override
+ protected void onPostExecute(Throwable result) {
+ if (!ActivityShare.this.isFinishing())
+ done(result);
+ super.onPostExecute(result);
+ }
+ }
+
+ @SuppressLint("InflateParams")
+ public static boolean registerDevice(final ActivityBase context) {
+ int userId = Util.getUserId(Process.myUid());
+ if (Util.hasProLicense(context) == null
+ && !PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingRegistered, false)) {
+ // Get accounts
+ String email = null;
+ for (Account account : AccountManager.get(context).getAccounts())
+ if ("com.google".equals(account.type)) {
+ email = account.name;
+ break;
+ }
+
+ LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ View view = LayoutInflater.inflate(R.layout.register, null);
+ final EditText input = (EditText) view.findViewById(R.id.etEmail);
+ if (email != null)
+ input.setText(email);
+
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(context);
+ alertDialogBuilder.setTitle(R.string.msg_register);
+ alertDialogBuilder.setIcon(context.getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setView(view);
+ alertDialogBuilder.setPositiveButton(context.getString(android.R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ String email = input.getText().toString();
+ if (Patterns.EMAIL_ADDRESS.matcher(email).matches())
+ new RegisterTask(context).executeOnExecutor(mExecutor, email);
+ }
+ });
+ alertDialogBuilder.setNegativeButton(context.getString(android.R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Do nothing
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+
+ return false;
+ }
+ return true;
+ }
+
+ @SuppressLint("DefaultLocale")
+ private static class RegisterTask extends AsyncTask {
+ private ActivityBase mContext;
+
+ public RegisterTask(ActivityBase context) {
+ mContext = context;
+ }
+
+ protected Throwable doInBackground(String... params) {
+ // Get wakelock
+ PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "XPrivacy.Register");
+ wl.acquire();
+ try {
+ String android_id = Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID);
+
+ // Encode message
+ JSONObject jRoot = new JSONObject();
+ jRoot.put("protocol_version", cProtocolVersion);
+ jRoot.put("email", params[0]);
+ jRoot.put("android_id", Util.md5(android_id).toLowerCase());
+
+ // Submit
+ HttpParams httpParams = new BasicHttpParams();
+ HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpClient httpclient = new DefaultHttpClient(httpParams);
+
+ HttpPost httpost = new HttpPost(getBaseURL() + "device?format=json&action=register");
+ httpost.setEntity(new ByteArrayEntity(jRoot.toString().getBytes("UTF-8")));
+ httpost.setHeader("Accept", "application/json");
+ httpost.setHeader("Content-type", "application/json");
+ HttpResponse response = httpclient.execute(httpost);
+ StatusLine statusLine = response.getStatusLine();
+
+ if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
+ // Succeeded
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ response.getEntity().writeTo(out);
+ out.close();
+ JSONObject status = new JSONObject(out.toString("UTF-8"));
+ if (status.getBoolean("ok")) {
+ // Mark as registered
+ int userId = Util.getUserId(Process.myUid());
+ PrivacyManager.setSetting(userId, PrivacyManager.cSettingRegistered, Boolean.toString(true));
+ return null;
+ } else {
+ int errno = status.getInt("errno");
+ String message = status.getString("error");
+ throw new ServerException(errno, message);
+ }
+ } else {
+ // Failed
+ response.getEntity().getContent().close();
+ throw new IOException(statusLine.getReasonPhrase());
+ }
+ } catch (ConnectTimeoutException ex) {
+ return ex;
+ } catch (HttpHostConnectException ex) {
+ return ex;
+ } catch (SocketTimeoutException ex) {
+ return ex;
+ } catch (SSLException ex) {
+ return ex;
+ } catch (UnknownHostException ex) {
+ return ex;
+ } catch (IOException ex) {
+ return ex;
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ return ex;
+ } finally {
+ wl.release();
+ }
+ }
+
+ @Override
+ protected void onPostExecute(Throwable result) {
+ if (!mContext.isFinishing()) {
+ String message;
+ if (result == null)
+ message = mContext.getString(R.string.msg_registered);
+ else
+ message = result.getMessage();
+
+ // Build dialog
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(mContext);
+ alertDialogBuilder.setTitle(R.string.app_name);
+ alertDialogBuilder.setMessage(message);
+ alertDialogBuilder.setIcon(mContext.getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(mContext.getString(android.R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+
+ // Show dialog
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+ super.onPostExecute(result);
+ }
+ }
+
+ public static class UpdateTask extends AsyncTask {
+ private Context mContext;
+ private NotificationCompat.Builder builder;
+ private Notification notification;
+ private NotificationManager notificationManager;
+
+ public UpdateTask(Context context) {
+ mContext = context;
+ builder = new NotificationCompat.Builder(context);
+ notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
+
+ }
+
+ @Override
+ protected void onPreExecute() {
+ // Build notification
+ builder.setSmallIcon(R.drawable.ic_launcher);
+ builder.setContentTitle(mContext.getString(R.string.app_name));
+ builder.setAutoCancel(false);
+ builder.setOngoing(true);
+ }
+
+ @Override
+ @SuppressLint("DefaultLocale")
+ protected Object doInBackground(Object... args) {
+ try {
+ // Notify
+ builder.setContentText(mContext.getString(R.string.title_update_checking));
+ builder.setWhen(System.currentTimeMillis());
+ notification = builder.build();
+ notificationManager.notify(Util.NOTIFY_UPDATE, notification);
+
+ // Encode package
+ String[] license = Util.getProLicenseUnchecked();
+ int userId = Util.getUserId(Process.myUid());
+ boolean test = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingTestVersions, false);
+ String android_id = Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID);
+
+ JSONObject jRoot = new JSONObject();
+ jRoot.put("protocol_version", cProtocolVersion);
+ jRoot.put("android_id", Util.md5(android_id).toLowerCase());
+ jRoot.put("android_sdk", Build.VERSION.SDK_INT);
+ jRoot.put("xprivacy_version", Util.getSelfVersionCode(mContext));
+ jRoot.put("xprivacy_version_name", Util.getSelfVersionName(mContext));
+ jRoot.put("test_versions", test);
+ jRoot.put("email", license[1]);
+ jRoot.put("signature", license[2]);
+
+ // Update
+ HttpParams httpParams = new BasicHttpParams();
+ HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
+ HttpClient httpclient = new DefaultHttpClient(httpParams);
+
+ HttpPost httpost = new HttpPost(getBaseURL() + "?format=json&action=update");
+ httpost.setEntity(new ByteArrayEntity(jRoot.toString().getBytes("UTF-8")));
+ httpost.setHeader("Accept", "application/json");
+ httpost.setHeader("Content-type", "application/json");
+ HttpResponse response = httpclient.execute(httpost);
+ StatusLine statusLine = response.getStatusLine();
+ if (statusLine.getStatusCode() == HttpStatus.SC_OK) {
+ String contentType = response.getFirstHeader("Content-Type").getValue();
+ if ("application/octet-stream".equals(contentType)) {
+ // Update notification
+ builder.setContentText(mContext.getString(R.string.title_update_downloading));
+ builder.setWhen(System.currentTimeMillis());
+ notification = builder.build();
+ notificationManager.notify(Util.NOTIFY_UPDATE, notification);
+
+ // Download APK
+ File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
+ folder.mkdirs();
+ String fileName = response.getFirstHeader("Content-Disposition").getElements()[0]
+ .getParameterByName("filename").getValue();
+ File download = new File(folder, fileName);
+ FileOutputStream fos = null;
+ try {
+ fos = new FileOutputStream(download);
+ response.getEntity().writeTo(fos);
+ } finally {
+ if (fos != null)
+ fos.close();
+ }
+
+ return download;
+ } else if ("application/json".equals(contentType)) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ response.getEntity().writeTo(out);
+ out.close();
+ throw new IOException(out.toString("UTF-8"));
+ } else
+ throw new IOException(contentType);
+ } else
+ return statusLine;
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ return ex;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (result instanceof StatusLine) {
+ notificationManager.cancel(Util.NOTIFY_UPDATE);
+ StatusLine status = (StatusLine) result;
+ if (status.getStatusCode() == 204) { // No Content
+ String none = mContext.getString(R.string.title_update_none);
+ Toast.makeText(mContext, none, Toast.LENGTH_LONG).show();
+ } else
+ Toast.makeText(mContext, status.getStatusCode() + " " + status.getReasonPhrase(), Toast.LENGTH_LONG)
+ .show();
+
+ } else if (result instanceof Throwable) {
+ notificationManager.cancel(Util.NOTIFY_UPDATE);
+ Throwable ex = (Throwable) result;
+ Toast.makeText(mContext, ex.toString(), Toast.LENGTH_LONG).show();
+
+ } else {
+ File download = (File) result;
+ Intent intent = new Intent(Intent.ACTION_VIEW);
+ intent.setDataAndType(Uri.fromFile(download), "application/vnd.android.package-archive");
+
+ PendingIntent pi = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ // Update notification
+ builder.setContentText(mContext.getString(R.string.title_update_install));
+ builder.setWhen(System.currentTimeMillis());
+ builder.setAutoCancel(true);
+ builder.setOngoing(false);
+ builder.setContentIntent(pi);
+ notification = builder.build();
+ notificationManager.notify(Util.NOTIFY_UPDATE, notification);
+ }
+
+ }
+ }
+
+ // Helper methods
+
+ private void blueStreakOfProgress(Integer current, Integer max) {
+ // Set up the progress bar
+ if (mProgressWidth == 0) {
+ final View vShareProgressEmpty = (View) findViewById(R.id.vShareProgressEmpty);
+ mProgressWidth = vShareProgressEmpty.getMeasuredWidth();
+ }
+ // Display stuff
+ if (max == 0)
+ max = 1;
+ int width = (int) ((float) mProgressWidth) * current / max;
+
+ View vShareProgressFull = (View) findViewById(R.id.vShareProgressFull);
+ vShareProgressFull.getLayoutParams().width = width;
+ vShareProgressFull.invalidate();
+ vShareProgressFull.requestLayout();
+ }
+
+ private void done(Throwable ex) {
+ String result = null;
+ if (ex != null && !(ex instanceof AbortException))
+ result = ex.getMessage();
+
+ // Check result string and display toast with error
+ if (result != null)
+ Toast.makeText(this, result, Toast.LENGTH_LONG).show();
+
+ // Reset progress bar
+ blueStreakOfProgress(0, 1);
+ mRunning = false;
+
+ // Update buttons
+ final Button btnCancel = (Button) findViewById(R.id.btnCancel);
+ final Button btnOk = (Button) findViewById(R.id.btnOk);
+ btnCancel.setEnabled(false);
+ btnOk.setEnabled(true);
+
+ // Handle close
+ btnOk.setOnClickListener(new Button.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
+ }
+
+ public void fileChooser() {
+ Intent chooseFile = new Intent(Intent.ACTION_GET_CONTENT);
+ Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath() + "/.xprivacy/");
+ chooseFile.setDataAndType(uri, "text/xml");
+ Intent intent = Intent.createChooser(chooseFile, getString(R.string.app_name));
+ startActivityForResult(intent, ACTIVITY_IMPORT_SELECT);
+ }
+
+ private void showFileName() {
+ TextView tvDescription = (TextView) findViewById(R.id.tvDescription);
+ tvDescription.setText(mFileName);
+ Button btnOk = (Button) findViewById(R.id.btnOk);
+ btnOk.setEnabled(true);
+ }
+
+ public static String getBaseURL() {
+ int userId = Util.getUserId(Process.myUid());
+ if (PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingHttps, true))
+ return HTTPS_BASE_URL;
+ else
+ return HTTP_BASE_URL;
+ }
+
+ public static String getFileName(Context context, boolean multiple, String packageName) {
+ File folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator
+ + ".xprivacy");
+ folder.mkdir();
+ String fileName;
+ if (multiple) {
+ SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ROOT);
+ fileName = String.format("%s_XPrivacy_%s_%s%s.xml", format.format(new Date()),
+ Util.getSelfVersionName(context), Build.DEVICE, (packageName == null ? "" : "_" + packageName));
+ } else
+ fileName = "XPrivacy.xml";
+ return new File(folder + File.separator + fileName).getAbsolutePath();
+ }
+
+ // Helper classes
+
+ public static class AbortException extends Exception {
+ private static final long serialVersionUID = 1L;
+
+ public AbortException(Context context) {
+ super(context.getString(R.string.msg_aborted));
+ }
+ }
+
+ public static class ServerException extends Exception {
+ private int mErrorNo;
+ private Context mContext = null;
+ private static final long serialVersionUID = 1L;
+
+ public final static int cErrorNotActivated = 206;
+ public final static int cErrorNoRestrictions = 305;
+
+ public ServerException(int errorno, String message) {
+ super(message);
+ mErrorNo = errorno;
+ }
+
+ public ServerException(Context context, int errorno, String message) {
+ super(message);
+ mErrorNo = errorno;
+ mContext = context;
+ }
+
+ @Override
+ @SuppressLint("DefaultLocale")
+ public String getMessage() {
+ if (mErrorNo == cErrorNoRestrictions && mContext != null)
+ return mContext.getString(R.string.msg_no_restrictions);
+ return String.format("Error %d: %s", mErrorNo, super.getMessage());
+ // general:
+ // 'errno' => 101, 'error' => 'Empty request'
+ // 'errno' => 102, 'error' => 'Please upgrade to at least ...'
+ // 'errno' => 103, 'error' => 'Error connecting to database'
+ // 'errno' => 104, 'error' => 'Unknown action: ...'
+
+ // submit:
+ // 'errno' => 201, 'error' => 'Not authorized'
+ // 'errno' => 202, 'error' => 'Android ID missing'
+ // 'errno' => 203, 'error' => 'Package name missing'
+ // 'errno' => 204, 'error' => 'Too many packages for application'
+ // 'errno' => 205, 'error' => 'Error storing restrictions'
+ // 'errno' => 206, 'error' => 'Device not activated'
+ // 'errno' => 207, 'error' => 'Unknown category'
+
+ // fetch:
+ // 'errno' => 301, 'error' => 'Not authorized'
+ // 'errno' => 303, 'error' => 'Package name missing'
+ // 'errno' => 304, 'error' => 'Too many packages for application'
+ // 'errno' => 305, 'error' => 'No restrictions available'
+ // 'errno' => 306, 'error' => 'Error retrieving restrictions'
+ // 'errno' => 307, 'error' => 'There is a maximum of ...'
+ }
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityUsage.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityUsage.java
new file mode 100644
index 0000000..922ae23
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ActivityUsage.java
@@ -0,0 +1,459 @@
+package biz.bokhorst.xprivacy;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import android.annotation.SuppressLint;
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.Process;
+import android.support.v4.app.NavUtils;
+import android.support.v4.app.TaskStackBuilder;
+import android.support.v7.widget.Toolbar;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Filter;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.ListView;
+import android.widget.TextView;
+
+public class ActivityUsage extends ActivityBase {
+ private boolean mAll = true;
+ private int mUid;
+ private String mRestrictionName;
+ private UsageAdapter mUsageAdapter;
+
+ public static final String cUid = "Uid";
+ public static final String cRestriction = "Restriction";
+
+ private static ExecutorService mExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(),
+ new PriorityThreadFactory());
+
+ private static class PriorityThreadFactory implements ThreadFactory {
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r);
+ t.setPriority(Thread.NORM_PRIORITY);
+ return t;
+ }
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ // Check privacy service client
+ if (!PrivacyService.checkClient())
+ return;
+
+ // Set layout
+ setContentView(R.layout.usagelist);
+ setSupportActionBar((Toolbar) findViewById(R.id.widgetToolbar));
+
+ // Get uid
+ Bundle extras = getIntent().getExtras();
+ mUid = (extras == null ? 0 : extras.getInt(cUid, 0));
+ mRestrictionName = (extras == null ? null : extras.getString(cRestriction));
+
+ // Show title
+ updateTitle();
+
+ // Start task to get usage data
+ UsageTask usageTask = new UsageTask();
+ usageTask.executeOnExecutor(mExecutor, (Object) null);
+
+ // Up navigation
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+
+ @Override
+ protected void onResume() {
+ super.onResume();
+ if (mUsageAdapter != null)
+ mUsageAdapter.notifyDataSetChanged();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ MenuInflater inflater = getMenuInflater();
+ if (inflater != null && PrivacyService.checkClient()) {
+ inflater.inflate(R.menu.usage, menu);
+ return true;
+ } else
+ return false;
+ }
+
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ menu.findItem(R.id.menu_whitelists).setVisible(mUid != 0);
+ return super.onPrepareOptionsMenu(menu);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ UsageTask usageTask;
+ switch (item.getItemId()) {
+ case android.R.id.home:
+ Intent upIntent = NavUtils.getParentActivityIntent(this);
+ if (upIntent != null)
+ if (NavUtils.shouldUpRecreateTask(this, upIntent))
+ TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
+ else
+ NavUtils.navigateUpTo(this, upIntent);
+ return true;
+
+ case R.id.menu_usage_all:
+ mAll = !mAll;
+ if (mUsageAdapter != null)
+ mUsageAdapter.getFilter().filter(Boolean.toString(mAll));
+ return true;
+
+ case R.id.menu_refresh:
+ updateTitle();
+ usageTask = new UsageTask();
+ usageTask.executeOnExecutor(mExecutor, (Object) null);
+ return true;
+
+ case R.id.menu_clear:
+ PrivacyManager.deleteUsage(mUid);
+ usageTask = new UsageTask();
+ usageTask.executeOnExecutor(mExecutor, (Object) null);
+ return true;
+
+ case R.id.menu_whitelists:
+ if (Util.hasProLicense(this) == null) {
+ // Redirect to pro page
+ Util.viewUri(this, ActivityMain.cProUri);
+ } else {
+ WhitelistTask whitelistsTask = new WhitelistTask(mUid, null, this);
+ whitelistsTask.executeOnExecutor(mExecutor, (Object) null);
+ }
+ return true;
+
+ case R.id.menu_settings:
+ Intent intent = new Intent(this, ActivitySettings.class);
+ startActivity(intent);
+ return true;
+
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ // Tasks
+
+ private class UsageTask extends AsyncTask> {
+ @Override
+ protected List doInBackground(Object... arg0) {
+ List listUsageData = new ArrayList();
+ for (PRestriction usageData : PrivacyManager.getUsageList(ActivityUsage.this, mUid, mRestrictionName))
+ listUsageData.add(usageData);
+ return listUsageData;
+ }
+
+ @Override
+ protected void onPostExecute(List listUsageData) {
+ if (!ActivityUsage.this.isFinishing()) {
+ mUsageAdapter = new UsageAdapter(ActivityUsage.this, R.layout.usageentry, listUsageData);
+ ListView lvUsage = (ListView) findViewById(R.id.lvUsage);
+ lvUsage.setAdapter(mUsageAdapter);
+ mUsageAdapter.getFilter().filter(Boolean.toString(mAll));
+ }
+
+ super.onPostExecute(listUsageData);
+ }
+ }
+
+ // Adapters
+
+ private class UsageAdapter extends ArrayAdapter {
+ private boolean mHasProLicense = false;
+ private List mListUsageData;
+ private LayoutInflater mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ public UsageAdapter(Context context, int textViewResourceId, List objects) {
+ super(context, textViewResourceId, objects);
+ mHasProLicense = (Util.hasProLicense(ActivityUsage.this) != null);
+ mListUsageData = new ArrayList();
+ mListUsageData.addAll(objects);
+ }
+
+ @Override
+ public Filter getFilter() {
+ return new UsageFilter();
+ }
+
+ private class UsageFilter extends Filter {
+ public UsageFilter() {
+ }
+
+ @Override
+ protected FilterResults performFiltering(CharSequence constraint) {
+ FilterResults results = new FilterResults();
+
+ // Get argument
+ boolean all = Boolean.parseBoolean((String) constraint);
+
+ // Match applications
+ List lstResult = new ArrayList();
+ for (PRestriction usageData : UsageAdapter.this.mListUsageData) {
+ if (all ? true : usageData.restricted)
+ lstResult.add(usageData);
+ }
+
+ synchronized (this) {
+ results.values = lstResult;
+ results.count = lstResult.size();
+ }
+
+ return results;
+ }
+
+ @Override
+ @SuppressWarnings("unchecked")
+ protected void publishResults(CharSequence constraint, FilterResults results) {
+ clear();
+ if (results.values == null)
+ notifyDataSetInvalidated();
+ else {
+ addAll((ArrayList) results.values);
+ notifyDataSetChanged();
+ }
+ }
+ }
+
+ private class ViewHolder {
+ private View row;
+ private int position;
+ public LinearLayout llUsage;
+ public TextView tvTime;
+ public ImageView imgIcon;
+ public ImageView imgRestricted;
+ public TextView tvApp;
+ public TextView tvRestriction;
+ public TextView tvParameter;
+ public TextView tvValue;
+
+ public ViewHolder(View theRow, int thePosition) {
+ row = theRow;
+ position = thePosition;
+ llUsage = (LinearLayout) row.findViewById(R.id.llUsage);
+ tvTime = (TextView) row.findViewById(R.id.tvTime);
+ imgIcon = (ImageView) row.findViewById(R.id.imgIcon);
+ imgRestricted = (ImageView) row.findViewById(R.id.imgRestricted);
+ tvApp = (TextView) row.findViewById(R.id.tvApp);
+ tvRestriction = (TextView) row.findViewById(R.id.tvRestriction);
+ tvParameter = (TextView) row.findViewById(R.id.tvParameter);
+ tvValue = (TextView) row.findViewById(R.id.tvValue);
+ }
+ }
+
+ private class HolderTask extends AsyncTask {
+ private int position;
+ private ViewHolder holder;
+ private PRestriction usageData;
+ private Drawable icon = null;
+ private boolean system;
+ private Hook hook;
+
+ public HolderTask(int thePosition, ViewHolder theHolder, PRestriction theUsageData) {
+ position = thePosition;
+ holder = theHolder;
+ usageData = theUsageData;
+ }
+
+ @Override
+ protected Object doInBackground(Object... params) {
+ if (usageData != null) {
+ ApplicationInfoEx appInfo = new ApplicationInfoEx(ActivityUsage.this, usageData.uid);
+ icon = appInfo.getIcon(ActivityUsage.this);
+ system = appInfo.isSystem();
+ hook = PrivacyManager.getHook(usageData.restrictionName, usageData.methodName);
+ return holder;
+ }
+ return null;
+ }
+
+ @Override
+ protected void onPostExecute(Object result) {
+ if (holder.position == position && result != null) {
+ if (system || (hook != null && hook.isDangerous()))
+ holder.row.setBackgroundColor(getResources().getColor(getThemed(R.attr.color_dangerous)));
+ else
+ holder.row.setBackgroundColor(Color.TRANSPARENT);
+ holder.imgIcon.setImageDrawable(icon);
+ holder.imgIcon.setVisibility(View.VISIBLE);
+
+ View.OnClickListener clickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ PRestriction usageData = mUsageAdapter.getItem(position);
+ Intent intent = new Intent(ActivityUsage.this, ActivityApp.class);
+ intent.putExtra(ActivityApp.cUid, usageData.uid);
+ intent.putExtra(ActivityApp.cRestrictionName, usageData.restrictionName);
+ intent.putExtra(ActivityApp.cMethodName, usageData.methodName);
+ startActivity(intent);
+ }
+ };
+
+ View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View view) {
+ int userId = Util.getUserId(Process.myUid());
+ final PRestriction usageData = mUsageAdapter.getItem(position);
+ final Hook hook = PrivacyManager.getHook(usageData.restrictionName, usageData.methodName);
+
+ boolean isApp = PrivacyManager.isApplication(usageData.uid);
+ boolean odSystem = PrivacyManager.getSettingBool(userId,
+ PrivacyManager.cSettingOnDemandSystem, false);
+ final boolean wnomod = PrivacyManager.getSettingBool(usageData.uid,
+ PrivacyManager.cSettingWhitelistNoModify, false);
+
+ if ((isApp || odSystem) && hook != null && hook.whitelist() != null
+ && usageData.extra != null) {
+ if (Util.hasProLicense(ActivityUsage.this) == null)
+ Util.viewUri(ActivityUsage.this, ActivityMain.cProUri);
+ else {
+ AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(ActivityUsage.this);
+ alertDialogBuilder.setTitle(R.string.menu_whitelists);
+ alertDialogBuilder.setMessage(usageData.restrictionName + "/"
+ + usageData.methodName + "(" + usageData.extra + ")");
+ alertDialogBuilder.setIcon(getThemed(R.attr.icon_launcher));
+ alertDialogBuilder.setPositiveButton(getString(R.string.title_deny),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Deny
+ PrivacyManager.setSetting(usageData.uid, hook.whitelist(),
+ usageData.extra, Boolean.toString(false));
+ if (!wnomod)
+ PrivacyManager.updateState(usageData.uid);
+ }
+ });
+ alertDialogBuilder.setNeutralButton(getString(R.string.title_allow),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ // Allow
+ PrivacyManager.setSetting(usageData.uid, hook.whitelist(),
+ usageData.extra, Boolean.toString(true));
+ if (!wnomod)
+ PrivacyManager.updateState(usageData.uid);
+ }
+ });
+ alertDialogBuilder.setNegativeButton(getString(android.R.string.cancel),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ }
+ });
+ AlertDialog alertDialog = alertDialogBuilder.create();
+ alertDialog.show();
+ }
+ return true;
+ } else
+ return false;
+ }
+ };
+
+ holder.llUsage.setOnClickListener(clickListener);
+ holder.tvRestriction.setOnClickListener(clickListener);
+ holder.llUsage.setOnLongClickListener(longClickListener);
+ holder.tvRestriction.setOnLongClickListener(longClickListener);
+ }
+ }
+ }
+
+ @Override
+ @SuppressLint("InflateParams")
+ public View getView(int position, View convertView, ViewGroup parent) {
+ ViewHolder holder;
+ if (convertView == null) {
+ convertView = mInflater.inflate(R.layout.usageentry, null);
+ holder = new ViewHolder(convertView, position);
+ convertView.setTag(holder);
+ } else {
+ holder = (ViewHolder) convertView.getTag();
+ holder.position = position;
+ }
+
+ // Get data
+ PRestriction usageData = getItem(position);
+
+ // Build entry
+ holder.row.setBackgroundColor(Color.TRANSPARENT);
+
+ Date date = new Date(usageData.time);
+ SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss", Locale.ROOT);
+ holder.tvTime.setText(format.format(date));
+
+ holder.imgIcon.setVisibility(View.INVISIBLE);
+ holder.imgRestricted.setVisibility(usageData.restricted ? View.VISIBLE : View.INVISIBLE);
+ holder.tvApp.setText(Integer.toString(usageData.uid));
+ holder.tvRestriction.setText(String.format("%s/%s", usageData.restrictionName, usageData.methodName));
+
+ if (!TextUtils.isEmpty(usageData.extra) && mHasProLicense) {
+ holder.tvParameter.setText(usageData.extra);
+ holder.tvParameter.setVisibility(View.VISIBLE);
+ } else
+ holder.tvParameter.setVisibility(View.GONE);
+
+ if (usageData.value != null && mHasProLicense) {
+ holder.tvValue.setText(getString(R.string.title_original) + ": " + usageData.value);
+ holder.tvValue.setVisibility(View.VISIBLE);
+ } else
+ holder.tvValue.setVisibility(View.GONE);
+
+ // Async update
+ new HolderTask(position, holder, usageData).executeOnExecutor(mExecutor, (Object) null);
+
+ return convertView;
+ }
+ }
+
+ // Helpers
+
+ private void updateTitle() {
+ if (mUid == 0) {
+ // Get statistics
+ long count = 0;
+ long restricted = 0;
+ double persec = 0;
+ try {
+ @SuppressWarnings("rawtypes")
+ Map statistics = PrivacyService.getClient().getStatistics();
+ count = (Long) statistics.get("restriction_count");
+ restricted = (Long) statistics.get("restriction_restricted");
+ long uptime = (Long) statistics.get("uptime_milliseconds");
+ persec = (double) count / (uptime / 1000);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+
+ // Set sub title
+ getSupportActionBar().setSubtitle(String.format("%d/%d %.2f/s", restricted, count, persec));
+ } else
+ getSupportActionBar().setSubtitle(
+ TextUtils.join(", ", new ApplicationInfoEx(this, mUid).getApplicationName()));
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ApplicationEx.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ApplicationEx.java
new file mode 100644
index 0000000..43bf26a
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ApplicationEx.java
@@ -0,0 +1,28 @@
+package biz.bokhorst.xprivacy;
+
+import android.app.Application;
+import android.util.Log;
+
+public class ApplicationEx extends Application {
+ private Thread.UncaughtExceptionHandler mPrevHandler;
+
+ @Override
+ public void onCreate() {
+ super.onCreate();
+
+ Util.log(null, Log.WARN, "UI started");
+ mPrevHandler = Thread.getDefaultUncaughtExceptionHandler();
+ Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
+ @Override
+ public void uncaughtException(Thread thread, Throwable ex) {
+ Util.bug(null, ex);
+ if (mPrevHandler != null)
+ mPrevHandler.uncaughtException(thread, ex);
+ }
+ });
+ }
+
+ public void onDestroy() {
+ Util.log(null, Log.WARN, "UI stopped");
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ApplicationInfoEx.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ApplicationInfoEx.java
new file mode 100644
index 0000000..d054fdf
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/ApplicationInfoEx.java
@@ -0,0 +1,303 @@
+package biz.bokhorst.xprivacy;
+
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
+import android.annotation.SuppressLint;
+import android.app.ProgressDialog;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
+import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.SparseArray;
+
+@SuppressLint("DefaultLocale")
+public class ApplicationInfoEx implements Comparable {
+ private int mUid;
+ private TreeMap mMapAppInfo = null;
+ private Map mMapPkgInfo = new HashMap();
+
+ // Cache
+ private Boolean mInternet = null;
+ private Boolean mFrozen = null;
+ private long mInstallTime = -1;
+ private long mUpdateTime = -1;
+
+ public static final int STATE_ATTENTION = 0;
+ public static final int STATE_CHANGED = 1;
+ public static final int STATE_SHARED = 2;
+
+ public ApplicationInfoEx(Context context, int uid) {
+ mUid = uid;
+ mMapAppInfo = new TreeMap();
+ PackageManager pm = context.getPackageManager();
+ String[] packages = pm.getPackagesForUid(uid);
+ if (packages != null)
+ for (String packageName : packages)
+ try {
+ ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
+ mMapAppInfo.put(pm.getApplicationLabel(appInfo).toString(), appInfo);
+ } catch (NameNotFoundException ignored) {
+ }
+ }
+
+ public static List getXApplicationList(Context context, ProgressDialog dialog) {
+ // Get references
+ PackageManager pm = context.getPackageManager();
+
+ // Get app list
+ SparseArray mapApp = new SparseArray();
+ List listApp = new ArrayList();
+ List listAppInfo = pm.getInstalledApplications(PackageManager.GET_META_DATA);
+ if (dialog != null)
+ dialog.setMax(listAppInfo.size());
+ for (int app = 0; app < listAppInfo.size(); app++) {
+ if (dialog != null)
+ dialog.setProgress(app + 1);
+
+ ApplicationInfo appInfo = listAppInfo.get(app);
+ Util.log(null, Log.INFO, "package=" + appInfo.packageName + " uid=" + appInfo.uid);
+
+ ApplicationInfoEx appInfoEx = new ApplicationInfoEx(context, appInfo.uid);
+ if (mapApp.get(appInfoEx.getUid()) == null) {
+ mapApp.put(appInfoEx.getUid(), appInfoEx);
+ listApp.add(appInfoEx);
+ }
+ }
+
+ // Sort result
+ Collections.sort(listApp);
+ return listApp;
+ }
+
+ public ArrayList getApplicationName() {
+ return new ArrayList(mMapAppInfo.navigableKeySet());
+ }
+
+ public String getApplicationName(String packageName) {
+ for (Entry entry : mMapAppInfo.entrySet())
+ if (entry.getValue().packageName.equals(packageName))
+ return entry.getKey();
+ return "";
+ }
+
+ public List getPackageName() {
+ List listPackageName = new ArrayList();
+ for (ApplicationInfo appInfo : mMapAppInfo.values())
+ listPackageName.add(appInfo.packageName);
+ return listPackageName;
+ }
+
+ private void getPackageInfo(Context context, String packageName) throws NameNotFoundException {
+ PackageManager pm = context.getPackageManager();
+ mMapPkgInfo.put(packageName, pm.getPackageInfo(packageName, 0));
+ }
+
+ public List getPackageVersionName(Context context) {
+ List listVersionName = new ArrayList();
+ for (String packageName : this.getPackageName())
+ try {
+ getPackageInfo(context, packageName);
+ String version = mMapPkgInfo.get(packageName).versionName;
+ if (version == null)
+ listVersionName.add("???");
+ else
+ listVersionName.add(version);
+ } catch (NameNotFoundException ex) {
+ listVersionName.add(ex.getMessage());
+ }
+ return listVersionName;
+ }
+
+ public String getPackageVersionName(Context context, String packageName) {
+ try {
+ getPackageInfo(context, packageName);
+ String version = mMapPkgInfo.get(packageName).versionName;
+ if (version == null)
+ return "???";
+ else
+ return version;
+ } catch (NameNotFoundException ex) {
+ return ex.getMessage();
+ }
+ }
+
+ public List getPackageVersionCode(Context context) {
+ List listVersionCode = new ArrayList();
+ for (String packageName : this.getPackageName())
+ try {
+ getPackageInfo(context, packageName);
+ listVersionCode.add(mMapPkgInfo.get(packageName).versionCode);
+ } catch (NameNotFoundException ex) {
+ listVersionCode.add(0);
+ }
+ return listVersionCode;
+ }
+
+ public Drawable getIcon(Context context) {
+ // Pick first icon
+ if (mMapAppInfo.size() > 0)
+ return mMapAppInfo.firstEntry().getValue().loadIcon(context.getPackageManager());
+ else
+ return new ColorDrawable(Color.TRANSPARENT);
+ }
+
+ public Bitmap getIconBitmap(Context context) {
+ if (mMapAppInfo.size() > 0) {
+ try {
+ final ApplicationInfo appInfo = mMapAppInfo.firstEntry().getValue();
+ if (appInfo.icon == 0)
+ appInfo.icon = android.R.drawable.sym_def_app_icon;
+ final Resources resources = context.getPackageManager().getResourcesForApplication(appInfo);
+
+ final BitmapFactory.Options options = new BitmapFactory.Options();
+ options.inJustDecodeBounds = true;
+ BitmapFactory.decodeResource(resources, appInfo.icon, options);
+
+ final int pixels = Math.round(Util.dipToPixels(context, 48));
+ options.inSampleSize = Util.calculateInSampleSize(options, pixels, pixels);
+ options.inJustDecodeBounds = false;
+ return BitmapFactory.decodeResource(resources, appInfo.icon, options);
+ } catch (NameNotFoundException ex) {
+ Util.bug(null, ex);
+ return null;
+ }
+ } else
+ return null;
+ }
+
+ public boolean hasInternet(Context context) {
+ if (mInternet == null) {
+ mInternet = false;
+ PackageManager pm = context.getPackageManager();
+ for (ApplicationInfo appInfo : mMapAppInfo.values())
+ if (pm.checkPermission("android.permission.INTERNET", appInfo.packageName) == PackageManager.PERMISSION_GRANTED) {
+ mInternet = true;
+ break;
+ }
+ }
+ return mInternet;
+ }
+
+ public boolean isFrozen(Context context) {
+ if (mFrozen == null) {
+ PackageManager pm = context.getPackageManager();
+ boolean enabled = false;
+ for (ApplicationInfo appInfo : mMapAppInfo.values())
+ try {
+ int setting = pm.getApplicationEnabledSetting(appInfo.packageName);
+ enabled = (enabled || setting == PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);
+ enabled = (enabled || setting == PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
+ if (enabled)
+ break;
+ } catch (IllegalArgumentException ignored) {
+ }
+ mFrozen = !enabled;
+ }
+ return mFrozen;
+ }
+
+ public int getUid() {
+ return mUid;
+ }
+
+ @SuppressLint("FieldGetter")
+ public int getState(Context context) {
+ return Integer.parseInt(PrivacyManager.getSetting(-getUid(), PrivacyManager.cSettingState,
+ Integer.toString(STATE_CHANGED)));
+ }
+
+ public long getInstallTime(Context context) {
+ if (mInstallTime == -1) {
+ long now = System.currentTimeMillis();
+ mInstallTime = now;
+ for (String packageName : this.getPackageName())
+ try {
+ getPackageInfo(context, packageName);
+ long time = mMapPkgInfo.get(packageName).firstInstallTime;
+ if (time < mInstallTime)
+ mInstallTime = time;
+ } catch (NameNotFoundException ex) {
+ }
+ if (mInstallTime == now)
+ // no install time, so assume it is old
+ mInstallTime = 0;
+ }
+ return mInstallTime;
+ }
+
+ public long getUpdateTime(Context context) {
+ if (mUpdateTime == -1) {
+ mUpdateTime = 0;
+ for (String packageName : this.getPackageName())
+ try {
+ getPackageInfo(context, packageName);
+ long time = mMapPkgInfo.get(packageName).lastUpdateTime;
+ if (time > mUpdateTime)
+ mUpdateTime = time;
+ } catch (NameNotFoundException ex) {
+ }
+ }
+ return mUpdateTime;
+ }
+
+ @SuppressLint("FieldGetter")
+ public long getModificationTime(Context context) {
+ return Long.parseLong(PrivacyManager.getSetting(-getUid(), PrivacyManager.cSettingModifyTime, "0"));
+ }
+
+ public boolean isSystem() {
+ boolean mSystem = false;
+ for (ApplicationInfo appInfo : mMapAppInfo.values()) {
+ mSystem = ((appInfo.flags & (ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0);
+ mSystem = mSystem || appInfo.packageName.equals(this.getClass().getPackage().getName());
+ mSystem = mSystem || appInfo.packageName.equals(this.getClass().getPackage().getName() + ".pro");
+ mSystem = mSystem || appInfo.packageName.equals("de.robv.android.xposed.installer");
+ }
+ return mSystem;
+ }
+
+ public boolean isShared() {
+ for (ApplicationInfo appInfo : mMapAppInfo.values())
+ if (PrivacyManager.isShared(appInfo.uid))
+ return true;
+ return false;
+ }
+
+ public boolean isIsolated() {
+ for (ApplicationInfo appInfo : mMapAppInfo.values())
+ if (PrivacyManager.isIsolated(appInfo.uid))
+ return true;
+ return false;
+ }
+
+ @Override
+ @SuppressLint("FieldGetter")
+ public String toString() {
+ return String.format("%d %s", getUid(), TextUtils.join(", ", getApplicationName()));
+ }
+
+ @Override
+ public int compareTo(ApplicationInfoEx other) {
+ // Locale respecting sorter
+ Collator collator = Collator.getInstance(Locale.getDefault());
+ return collator.compare(TextUtils.join(", ", getApplicationName()),
+ TextUtils.join(", ", other.getApplicationName()));
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/BootReceiver.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/BootReceiver.java
new file mode 100644
index 0000000..8dab4d4
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/BootReceiver.java
@@ -0,0 +1,72 @@
+package biz.bokhorst.xprivacy;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.support.v4.app.NotificationCompat;
+
+public class BootReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(final Context context, Intent bootIntent) {
+ // Start boot update
+ Intent changeIntent = new Intent();
+ changeIntent.setClass(context, UpdateService.class);
+ changeIntent.putExtra(UpdateService.cAction, UpdateService.cActionBoot);
+ context.startService(changeIntent);
+
+ NotificationManager notificationManager = (NotificationManager) context
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+
+ // Check if Xposed enabled
+ if (Util.isXposedEnabled() && PrivacyService.checkClient())
+ try {
+ if (PrivacyService.getClient().databaseCorrupt()) {
+ // Build notification
+ NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context);
+ notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
+ notificationBuilder.setContentTitle(context.getString(R.string.app_name));
+ notificationBuilder.setContentText(context.getString(R.string.msg_corrupt));
+ notificationBuilder.setWhen(System.currentTimeMillis());
+ notificationBuilder.setAutoCancel(true);
+ Notification notification = notificationBuilder.build();
+
+ // Display notification
+ notificationManager.notify(Util.NOTIFY_CORRUPT, notification);
+ } else
+ context.sendBroadcast(new Intent("biz.bokhorst.xprivacy.action.ACTIVE"));
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ else {
+ // Create Xposed installer intent
+ // @formatter:off
+ Intent xInstallerIntent = new Intent("de.robv.android.xposed.installer.OPEN_SECTION")
+ .setPackage("de.robv.android.xposed.installer")
+ .putExtra("section", "modules")
+ .putExtra("module", context.getPackageName())
+ .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ // @formatter:on
+
+ PendingIntent pi = (xInstallerIntent == null ? null : PendingIntent.getActivity(context, 0,
+ xInstallerIntent, PendingIntent.FLAG_UPDATE_CURRENT));
+
+ // Build notification
+ NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context);
+ notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
+ notificationBuilder.setContentTitle(context.getString(R.string.app_name));
+ notificationBuilder.setContentText(context.getString(R.string.app_notenabled));
+ notificationBuilder.setWhen(System.currentTimeMillis());
+ notificationBuilder.setAutoCancel(true);
+ if (pi != null)
+ notificationBuilder.setContentIntent(pi);
+ Notification notification = notificationBuilder.build();
+
+ // Display notification
+ notificationManager.notify(Util.NOTIFY_NOTXPOSED, notification);
+ }
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/CRestriction.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/CRestriction.java
new file mode 100644
index 0000000..ce031ac
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/CRestriction.java
@@ -0,0 +1,89 @@
+package biz.bokhorst.xprivacy;
+
+import java.util.Date;
+
+public class CRestriction {
+ private long mExpiry;
+ private int mUid;
+ private String mRestrictionName;
+ private String mMethodName;
+ private String mExtra;
+ public boolean restricted;
+ public boolean asked;
+
+ public CRestriction(int uid, String restrictionName, String methodName, String extra) {
+ mExpiry = new Date().getTime() + PrivacyManager.cRestrictionCacheTimeoutMs;
+ mUid = uid;
+ mRestrictionName = restrictionName;
+ mMethodName = methodName;
+ mExtra = extra;
+ restricted = false;
+ asked = false;
+ }
+
+ public CRestriction(PRestriction restriction, String extra) {
+ mExpiry = new Date().getTime() + PrivacyManager.cRestrictionCacheTimeoutMs;
+ mUid = restriction.uid;
+ mRestrictionName = restriction.restrictionName;
+ mMethodName = restriction.methodName;
+ mExtra = extra;
+ restricted = restriction.restricted;
+ asked = restriction.asked;
+ }
+
+ public void setExpiry(long time) {
+ mExpiry = time;
+ }
+
+ public boolean isExpired() {
+ return (new Date().getTime() > mExpiry);
+ }
+
+ public int getUid() {
+ return mUid;
+ }
+
+ public void setMethodName(String methodName) {
+ mMethodName = methodName;
+ }
+
+ public void setExtra(String extra) {
+ mExtra = extra;
+ }
+
+ public boolean isSameMethod(PRestriction restriction) {
+ // @formatter:off
+ return (restriction.uid == mUid
+ && restriction.restrictionName.equals(mRestrictionName)
+ && (restriction.methodName == null || restriction.methodName.equals(mMethodName)));
+ // @formatter:on
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ CRestriction other = (CRestriction) obj;
+ // @formatter:off
+ return (mUid == other.mUid
+ && mRestrictionName.equals(other.mRestrictionName)
+ && (mMethodName == null ? other.mMethodName == null : mMethodName.equals(other.mMethodName))
+ && (mExtra == null ? other.mExtra == null : mExtra.equals(other.mExtra)));
+ // @formatter:on
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = mUid;
+ if (mRestrictionName != null)
+ hash = hash ^ mRestrictionName.hashCode();
+ if (mMethodName != null)
+ hash = hash ^ mMethodName.hashCode();
+ if (mExtra != null)
+ hash = hash ^ mExtra.hashCode();
+ return hash;
+ }
+
+ @Override
+ public String toString() {
+ return mUid + ":" + mRestrictionName + "/" + mMethodName + "(" + mExtra + ")" + "=" + restricted + "/" + asked;
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/CSetting.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/CSetting.java
new file mode 100644
index 0000000..01ebf14
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/CSetting.java
@@ -0,0 +1,69 @@
+package biz.bokhorst.xprivacy;
+
+import java.util.Date;
+
+import android.util.Log;
+
+public class CSetting {
+ private long mTimestamp;
+ private int mUid;
+ private String mType;
+ private String mName;
+ private String mValue;
+
+ public CSetting(int uid, String type, String name) {
+ mTimestamp = new Date().getTime();
+ mUid = Math.abs(uid);
+ mType = type;
+ mName = name;
+ mValue = null;
+ if (type == null) {
+ Util.log(null, Log.WARN, "CSetting null");
+ Util.logStack(null, Log.WARN);
+ }
+ }
+
+ public void setValue(String value) {
+ mValue = value;
+ }
+
+ public boolean willExpire() {
+ if (mUid == 0) {
+ if (mName.equals(PrivacyManager.cSettingVersion))
+ return false;
+ if (mName.equals(PrivacyManager.cSettingLog))
+ return false;
+ if (mName.equals(PrivacyManager.cSettingExperimental))
+ return false;
+ }
+ return true;
+ }
+
+ public boolean isExpired() {
+ return (willExpire() ? (mTimestamp + PrivacyManager.cSettingCacheTimeoutMs < new Date().getTime()) : false);
+ }
+
+ public int getUid() {
+ return mUid;
+ }
+
+ public String getValue() {
+ return mValue;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ CSetting other = (CSetting) obj;
+ return (this.mUid == other.mUid && this.mType.equals(other.mType) && this.mName.equals(other.mName));
+ }
+
+ @Override
+ public int hashCode() {
+ return mUid ^ mType.hashCode() ^ mName.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return mUid + ":" + mType + "/" + mName + "=" + mValue;
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/DeviceAdministratorReceiver.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/DeviceAdministratorReceiver.java
new file mode 100644
index 0000000..406853f
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/DeviceAdministratorReceiver.java
@@ -0,0 +1,20 @@
+package biz.bokhorst.xprivacy;
+
+import android.app.admin.DeviceAdminReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.util.Log;
+
+public class DeviceAdministratorReceiver extends DeviceAdminReceiver {
+ @Override
+ public void onEnabled(Context context, Intent intent) {
+ super.onEnabled(context, intent);
+ Util.log(null, Log.WARN, "Device admin enabled");
+ }
+
+ @Override
+ public void onDisabled(Context context, Intent intent) {
+ super.onDisabled(context, intent);
+ Util.log(null, Log.WARN, "Device admin disabled");
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/Hook.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/Hook.java
new file mode 100644
index 0000000..cc3165b
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/Hook.java
@@ -0,0 +1,319 @@
+package biz.bokhorst.xprivacy;
+
+import android.annotation.SuppressLint;
+import android.os.Build;
+
+public class Hook implements Comparable {
+ private String mRestrictionName;
+ private String mMethodName;
+ private String[] mPermissions;
+ private int mSdkFrom;
+ private int mSdkTo = Integer.MAX_VALUE;
+ private Version mFrom;
+ private String mReplacedRestriction;
+ private String mReplacedMethod;
+
+ private boolean mDangerous = false;
+ private boolean mRestart = false;
+ private boolean mNoUsageData = false;
+ private boolean mNoOnDemand = false;
+ private String mWhitelist = null;
+ private boolean mNotify = false;
+ private int mAOSPSdk = 0;
+ private int mNotAOSPSdk = 0;
+ private boolean mUnsafe = false;
+ private boolean mOptional = false;
+ private boolean mObsolete = false;
+ private String mAnnotation = null;
+
+ public Hook(String restrictionName, String methodName) {
+ mRestrictionName = restrictionName;
+ mMethodName = methodName;
+ }
+
+ public Hook(String restrictionName, String methodName, String permissions, int sdk, String from, String replaces) {
+ mRestrictionName = restrictionName;
+ mMethodName = methodName;
+ mPermissions = (permissions == null ? null : permissions.split(","));
+ mSdkFrom = sdk;
+ mFrom = (from == null ? null : new Version(from));
+ if (replaces != null) {
+ int slash = replaces.indexOf('/');
+ if (slash > 0) {
+ mReplacedRestriction = replaces.substring(0, slash);
+ mReplacedMethod = replaces.substring(slash + 1);
+ if ("".equals(mReplacedMethod))
+ mReplacedMethod = methodName;
+ } else {
+ mReplacedRestriction = mRestrictionName;
+ mReplacedMethod = replaces;
+ }
+ }
+ }
+
+ // Definitions
+
+ public Hook to(int sdk) {
+ mSdkTo = sdk;
+ return this;
+ }
+
+ public Hook dangerous() {
+ mDangerous = true;
+ return this;
+ }
+
+ @SuppressLint("FieldGetter")
+ public void toggleDangerous() {
+ String name = String.format("%s.%s.%s", PrivacyManager.cSettingDangerous, this.getRestrictionName(),
+ this.getName());
+ PrivacyManager.setSetting(0, name, Boolean.toString(!isDangerous()));
+ }
+
+ public Hook restart() {
+ mRestart = true;
+ return this;
+ }
+
+ public Hook noUsageData() {
+ mNoUsageData = true;
+ return this;
+ }
+
+ public Hook noOnDemand() {
+ mNoOnDemand = true;
+ return this;
+ }
+
+ public Hook whitelist(String whitelist) {
+ mWhitelist = whitelist;
+ return this;
+ }
+
+ public Hook doNotify() {
+ mNotify = true;
+ return this;
+ }
+
+ public Hook AOSP(int sdk) {
+ mAOSPSdk = sdk;
+ return this;
+ }
+
+ public Hook notAOSP(int sdk) {
+ mNotAOSPSdk = sdk;
+ if (!PrivacyManager.cIPC.equals(mRestrictionName))
+ mUnsafe = true;
+ return this;
+ }
+
+ public Hook unsafe() {
+ mUnsafe = true;
+ return this;
+ }
+
+ protected Hook optional() {
+ mOptional = true;
+ return this;
+ }
+
+ protected Hook obsolete() {
+ mObsolete = true;
+ return this;
+ }
+
+ public void annotate(String text) {
+ mAnnotation = text;
+ }
+
+ // Getters
+
+ public String getRestrictionName() {
+ return mRestrictionName;
+ }
+
+ public String getName() {
+ return mMethodName;
+ }
+
+ public String[] getPermissions() {
+ return mPermissions;
+ }
+
+ public boolean isAvailable() {
+ if (mObsolete)
+ return false;
+ if (Build.VERSION.SDK_INT < mSdkFrom)
+ return false;
+ if (Build.VERSION.SDK_INT > mSdkTo)
+ return false;
+ if (mAOSPSdk > 0 && !isAOSP(mAOSPSdk))
+ return false;
+ if (mNotAOSPSdk > 0 && isAOSP(mNotAOSPSdk))
+ return false;
+ return true;
+ }
+
+ public static boolean isAOSP(int sdk) {
+ if (!PrivacyManager.cVersion3)
+ return false;
+ if (Build.VERSION.SDK_INT >= sdk) {
+ if ("true".equals(System.getenv("XPrivacy.AOSP")))
+ return true;
+ if (Build.DISPLAY == null || Build.HOST == null)
+ return false;
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)
+ // @formatter:off
+ return (
+ isAOSP() ||
+ isCyanogenMod() ||
+ isOmni() ||
+ isMIUI() ||
+ isSlim() ||
+ isParanoidAndroid() ||
+ isCarbon() ||
+ isDirtyUnicorns() ||
+ isLiquidSmooth() ||
+ isAndroidRevolutionHD() ||
+ isMahdi() ||
+ isOmega()
+ );
+ // @formatter:on
+ else
+ return isAOSP();
+ } else
+ return false;
+ }
+
+ public static boolean isAOSP() {
+ return Build.HOST.endsWith(".google.com");
+ }
+
+ public static boolean isCyanogenMod() {
+ return Build.HOST.equals("cyanogenmod") || Build.DISPLAY.startsWith("cm_");
+ }
+
+ public static boolean isOmni() {
+ return Build.DISPLAY.startsWith("slim");
+ }
+
+ public static boolean isMIUI() {
+ return Build.HOST.equals("xiaomi");
+ }
+
+ public static boolean isSlim() {
+ return Build.DISPLAY.startsWith("omni");
+ }
+
+ public static boolean isParanoidAndroid() {
+ return Build.HOST.startsWith("paranoid") || Build.DISPLAY.startsWith("pa_");
+ }
+
+ public static boolean isCarbon() {
+ return Build.DISPLAY.startsWith("carbon");
+ }
+
+ public static boolean isDirtyUnicorns() {
+ return Build.DISPLAY.startsWith("du_");
+ }
+
+ public static boolean isLiquidSmooth() {
+ return Build.DISPLAY.startsWith("liquid_");
+ }
+
+ public static boolean isAndroidRevolutionHD() {
+ return Build.DISPLAY.startsWith("Android Revolution HD");
+ }
+
+ public static boolean isMahdi() {
+ return Build.HOST.startsWith("mahdi");
+ }
+
+ public static boolean isOmega() {
+ return Build.DISPLAY.startsWith("Omega");
+ }
+
+ public Version getFrom() {
+ return mFrom;
+ }
+
+ public String getReplacedRestriction() {
+ return mReplacedRestriction;
+ }
+
+ public String getReplacedMethod() {
+ return mReplacedMethod;
+ }
+
+ @SuppressLint("FieldGetter")
+ public boolean isDangerous() {
+ String name = String.format("%s.%s.%s", PrivacyManager.cSettingDangerous, this.getRestrictionName(),
+ this.getName());
+ return PrivacyManager.getSettingBool(0, name, mDangerous);
+ }
+
+ public boolean isDangerousDefined() {
+ return mDangerous;
+ }
+
+ public boolean isRestartRequired() {
+ return mRestart;
+ }
+
+ public boolean hasUsageData() {
+ return !mNoUsageData;
+ }
+
+ public boolean canOnDemand() {
+ return !mNoOnDemand;
+ }
+
+ public String whitelist() {
+ return mWhitelist;
+ }
+
+ public boolean shouldNotify() {
+ return mNotify;
+ }
+
+ public boolean isUnsafe() {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
+ return false;
+ if (PrivacyManager.cVersion3)
+ return mUnsafe;
+ else
+ return false;
+ }
+
+ public boolean isOptional() {
+ return mOptional;
+ }
+
+ public String getAnnotation() {
+ return mAnnotation;
+ }
+
+ // Comparison
+
+ @Override
+ public int hashCode() {
+ return (mRestrictionName.hashCode() ^ mMethodName.hashCode());
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ Hook other = (Hook) obj;
+ return (mRestrictionName.equals(other.mRestrictionName) && mMethodName.equals(other.mMethodName));
+ }
+
+ @Override
+ public int compareTo(Hook another) {
+ int x = mRestrictionName.compareTo(another.mRestrictionName);
+ return (x == 0 ? mMethodName.compareTo(another.mMethodName) : x);
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s/%s", mRestrictionName, mMethodName);
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/IPrivacyService.aidl b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/IPrivacyService.aidl
new file mode 100644
index 0000000..cb8d0a2
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/IPrivacyService.aidl
@@ -0,0 +1,33 @@
+package biz.bokhorst.xprivacy;
+
+import biz.bokhorst.xprivacy.PRestriction;
+import biz.bokhorst.xprivacy.PSetting;
+
+interface IPrivacyService {
+ int getVersion();
+ List /* String */ check();
+ boolean databaseCorrupt();
+ void reportError(String message);
+ Map getStatistics();
+
+ void setRestriction(in PRestriction restriction);
+ void setRestrictionList(in List listRestriction);
+ PRestriction getRestriction(in PRestriction restriction, boolean usage, String secret);
+ List getRestrictionList(in PRestriction selector);
+ boolean isRestrictionSet(in PRestriction restriction);
+ void deleteRestrictions(int uid, String restrictionName);
+
+ long getUsage(in List restriction);
+ List getUsageList(int uid, String restrictionName);
+ void deleteUsage(int uid);
+
+ void setSetting(in PSetting setting);
+ void setSettingList(in List listSetting);
+ PSetting getSetting(in PSetting setting);
+ List getSettingList(in PSetting selector);
+ void deleteSettings(int uid);
+
+ void clear();
+ void flush();
+ void dump(int uid);
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/IniFile.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/IniFile.java
new file mode 100644
index 0000000..3a13902
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/IniFile.java
@@ -0,0 +1,37 @@
+package biz.bokhorst.xprivacy;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class IniFile {
+
+ private Map mIni = new HashMap();
+
+ public IniFile(File file) throws IOException {
+ String line;
+ Pattern pattern = Pattern.compile("\\s*([^=]*)=(.*)");
+ FileReader fr = new FileReader(file);
+ BufferedReader br = new BufferedReader(fr);
+ while ((line = br.readLine()) != null)
+ if (!line.startsWith("#")) {
+ Matcher matcher = pattern.matcher(line);
+ if (matcher.matches()) {
+ String key = matcher.group(1).trim();
+ String value = matcher.group(2).trim();
+ mIni.put(key, value);
+ }
+ }
+ br.close();
+ fr.close();
+ }
+
+ public String get(String key, String defaultvalue) {
+ return mIni.get(key);
+ }
+}
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/Meta.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/Meta.java
new file mode 100644
index 0000000..4f369be
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/Meta.java
@@ -0,0 +1,684 @@
+package biz.bokhorst.xprivacy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import android.annotation.SuppressLint;
+import android.content.Intent;
+import android.content.res.Resources;
+import android.nfc.NfcAdapter;
+import android.os.Build;
+import android.provider.MediaStore;
+import android.provider.Telephony;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+@SuppressLint("InlinedApi")
+public class Meta {
+ private static boolean mAnnotated = false;
+ private static List mListHook = new ArrayList();
+
+ public final static String cTypeAccount = "Account";
+ public final static String cTypeAccountHash = "AccountHash";
+ public final static String cTypeApplication = "Application";
+ public final static String cTypeContact = "Contact";
+ public final static String cTypeTemplate = "Template";
+ public final static String cTypeTemplateName = "TemplateName";
+
+ public final static String cTypeAddress = "Address";
+ public final static String cTypeAction = "Action";
+ public final static String cTypeCommand = "Command";
+ public final static String cTypeFilename = "Filename";
+ public final static String cTypeIPAddress = "IPAddress";
+ public final static String cTypeLibrary = "Library";
+ public final static String cTypeMethod = "Method";
+ public final static String cTypePermission = "Permission";
+ public final static String cTypeProc = "Proc";
+ public final static String cTypeTransaction = "Transaction";
+ public final static String cTypeUrl = "Url";
+
+ public static boolean isWhitelist(String type) {
+ return (cTypeAddress.equals(type) || cTypeAction.equals(type) || cTypeCommand.equals(type)
+ || cTypeFilename.equals(type) || cTypeIPAddress.equals(type) || cTypeLibrary.equals(type)
+ || cTypeMethod.equals(type) || cTypePermission.equals(type) || cTypeProc.equals(type)
+ || cTypeTransaction.equals(type) || cTypeUrl.equals(type));
+ }
+
+ public static List get() {
+ // http://developer.android.com/reference/android/Manifest.permission.html
+ if (mListHook.size() > 0)
+ return mListHook;
+
+ // @formatter:off
+ mListHook.add(new Hook("accounts", "addOnAccountsUpdatedListener", "GET_ACCOUNTS", 5, null, null).notAOSP(19));
+ mListHook.add(new Hook("accounts", "blockingGetAuthToken", "USE_CREDENTIALS", 5, null, null).dangerous().unsafe());
+ mListHook.add(new Hook("accounts", "getAccounts", "GET_ACCOUNTS", 5, null, null).notAOSP(19));
+ mListHook.add(new Hook("accounts", "getAccountsByType", "GET_ACCOUNTS", 5, null, null).notAOSP(19));
+ mListHook.add(new Hook("accounts", "getAccountsByTypeAndFeatures", "GET_ACCOUNTS", 5, null, null).notAOSP(19));
+ mListHook.add(new Hook("accounts", "getAuthToken", "USE_CREDENTIALS", 5, null, null).unsafe().dangerous());
+ mListHook.add(new Hook("accounts", "getAuthTokenByFeatures", "MANAGE_ACCOUNTS", 5, null, null).unsafe().dangerous());
+ mListHook.add(new Hook("accounts", "hasFeatures", "GET_ACCOUNTS", 8, null, null).unsafe().dangerous());
+ mListHook.add(new Hook("accounts", "getAccountsByTypeForPackage", "GET_ACCOUNTS", 18, null, null).notAOSP(19));
+
+ mListHook.add(new Hook("accounts", "getTokenGoogle", "GET_ACCOUNTS", 1, null, null).unsafe().dangerous().optional());
+ mListHook.add(new Hook("accounts", "getTokenWithNotificationGoogle", "GET_ACCOUNTS", 1, null, null).unsafe().dangerous().optional());
+
+ mListHook.add(new Hook("accounts", "getAuthenticatorTypes", "GET_ACCOUNTS", 5, "1.99.24", null).unsafe().dangerous());
+ mListHook.add(new Hook("accounts", "getCurrentSync", "READ_SYNC_SETTINGS", 8, "1.99.24", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("accounts", "getCurrentSyncs", "READ_SYNC_SETTINGS", 11, "1.99.24", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("accounts", "getSyncAdapterTypes", "", 5, "1.99.24", null).unsafe().dangerous());
+
+ mListHook.add(new Hook("accounts", "Srv_getAccounts", "GET_ACCOUNTS", 19, "2.99", "getAccounts").AOSP(19));
+ mListHook.add(new Hook("accounts", "Srv_getAccountsAsUser", "GET_ACCOUNTS", 19, "2.99", null).AOSP(19));
+ mListHook.add(new Hook("accounts", "Srv_getAccountsByFeatures", "GET_ACCOUNTS", 19, "2.99", "getAccountsByTypeAndFeatures").AOSP(19));
+ mListHook.add(new Hook("accounts", "Srv_getAccountsForPackage", "GET_ACCOUNTS", 19, "3.5.6", null).AOSP(19));
+ mListHook.add(new Hook("accounts", "Srv_getSharedAccountsAsUser", "GET_ACCOUNTS", 19, "2.99", null).AOSP(19));
+ mListHook.add(new Hook("accounts", "Srv_getCurrentSyncs", "READ_SYNC_SETTINGS", 19, "2.99", "getCurrentSyncs").AOSP(19));
+ mListHook.add(new Hook("accounts", "Srv_getCurrentSyncsAsUser", "READ_SYNC_SETTINGS", 21, "3.5.6", null).AOSP(21));
+
+ mListHook.add(new Hook("browser", "BrowserProvider2", "com.android.browser.permission.READ_HISTORY_BOOKMARKS,GLOBAL_SEARCH", 1, null, null));
+ mListHook.add(new Hook("browser", "Downloads", "ACCESS_DOWNLOAD_MANAGER,ACCESS_DOWNLOAD_MANAGER_ADVANCED,ACCESS_ALL_DOWNLOADS", 1, "1.99.43", null).dangerous());
+
+ mListHook.add(new Hook("calendar", "CalendarProvider2", "READ_CALENDAR,WRITE_CALENDAR", 1, null, null));
+
+ mListHook.add(new Hook("calling", "sendDataMessage", "SEND_SMS", 4, null, null).notAOSP(19).whitelist(cTypeAddress).doNotify());
+ mListHook.add(new Hook("calling", "sendMultimediaMessage", "SEND_SMS", 21, "3.5.6", null).doNotify());
+ mListHook.add(new Hook("calling", "sendMultipartTextMessage", "SEND_SMS", 4, null, null).notAOSP(19).whitelist(cTypeAddress).doNotify());
+ mListHook.add(new Hook("calling", "sendTextMessage", "SEND_SMS", 4, null, null).notAOSP(19).whitelist(cTypeAddress).doNotify());
+
+ mListHook.add(new Hook("calling", "Srv_sendData", "SEND_SMS", 19, "2.99", "sendDataMessage").AOSP(19).whitelist(cTypeAddress).doNotify());
+ mListHook.add(new Hook("calling", "Srv_sendMultipartText", "SEND_SMS", 19, "2.99", "sendMultipartTextMessage").AOSP(19).whitelist(cTypeAddress).doNotify());
+ mListHook.add(new Hook("calling", "Srv_sendText", "SEND_SMS", 19, "2.99", "sendTextMessage").AOSP(19).whitelist(cTypeAddress).doNotify());
+
+ mListHook.add(new Hook("calling", TelephonyManager.ACTION_RESPOND_VIA_MESSAGE, "SEND_RESPOND_VIA_MESSAGE", 18, null, null).doNotify());
+ mListHook.add(new Hook("calling", Intent.ACTION_CALL, "CALL_PHONE", 10, null, null).doNotify());
+ mListHook.add(new Hook("calling", Intent.ACTION_DIAL, "", 10, "2.2.2", null).doNotify());
+ mListHook.add(new Hook("calling", Intent.ACTION_NEW_OUTGOING_CALL, "PROCESS_OUTGOING_CALLS", 10, "2.1.23", "phone/android.intent.action.NEW_OUTGOING_CALL").doNotify());
+ mListHook.add(new Hook("calling", "CallLogProvider", "READ_CALL_LOG,WRITE_CALL_LOG", 1, "2.1.23", "phone/CallLogProvider"));
+
+ mListHook.add(new Hook("calling", "SIP.isApiSupported", "USE_SIP", 9, null, null).unsafe().doNotify());
+ mListHook.add(new Hook("calling", "SIP.isSipWifiOnly", "USE_SIP", 9, null, null).unsafe().doNotify());
+ mListHook.add(new Hook("calling", "SIP.isVoipSupported", "USE_SIP", 9, null, null).unsafe().doNotify());
+ mListHook.add(new Hook("calling", "SIP.newInstance", "USE_SIP", 9, null, null).unsafe().doNotify());
+
+ mListHook.add(new Hook("clipboard", "addPrimaryClipChangedListener", "", 11, null, null).notAOSP(19));
+ mListHook.add(new Hook("clipboard", "getPrimaryClip", "", 11, null, null).notAOSP(19).doNotify());
+ mListHook.add(new Hook("clipboard", "getPrimaryClipDescription", "", 11, null, null).notAOSP(19).doNotify());
+ mListHook.add(new Hook("clipboard", "getText", "", 10, null, null).notAOSP(19).doNotify());
+ mListHook.add(new Hook("clipboard", "hasPrimaryClip", "", 11, null, null).notAOSP(19).doNotify());
+ mListHook.add(new Hook("clipboard", "hasText", "", 10, null, null).notAOSP(19).doNotify());
+
+ mListHook.add(new Hook("clipboard", "Srv_addPrimaryClipChangedListener", "", 19, "2.99", "addPrimaryClipChangedListener").AOSP(19));
+ mListHook.add(new Hook("clipboard", "Srv_getPrimaryClip", "", 19, "2.99", "getPrimaryClip").AOSP(19).doNotify());
+ mListHook.add(new Hook("clipboard", "Srv_getPrimaryClipDescription", "", 19, "2.99", "getPrimaryClipDescription").AOSP(19).doNotify());
+ mListHook.add(new Hook("clipboard", "Srv_hasClipboardText", "", 19, "2.99", "hasText").AOSP(19).doNotify());
+ mListHook.add(new Hook("clipboard", "Srv_hasPrimaryClip", "", 19, "2.99", "hasPrimaryClip").AOSP(19).doNotify());
+
+ mListHook.add(new Hook("contacts", "contacts/contacts", "READ_CONTACTS,WRITE_CONTACTS", 1, null, null));
+ mListHook.add(new Hook("contacts", "contacts/data", "READ_CONTACTS,WRITE_CONTACTS", 1, null, null));
+ mListHook.add(new Hook("contacts", "contacts/people", "READ_CONTACTS,WRITE_CONTACTS", 1, "1.99.46", null));
+ mListHook.add(new Hook("contacts", "contacts/phone_lookup", "READ_CONTACTS,WRITE_CONTACTS", 1, null, null));
+ mListHook.add(new Hook("contacts", "contacts/profile", "READ_PROFILE,WRITE_PROFILE", 1, "1.99.38", null).dangerous());
+ mListHook.add(new Hook("contacts", "contacts/raw_contacts", "READ_CONTACTS,WRITE_CONTACTS", 1, null, null));
+ mListHook.add(new Hook("contacts", "ContactsProvider2", "READ_CONTACTS,WRITE_CONTACTS,READ_PROFILE,WRITE_PROFILE", 1, "1.99.38", null).dangerous());
+ mListHook.add(new Hook("contacts", "IccProvider", "READ_CONTACTS,WRITE_CONTACTS", 1, "1.99.38", null));
+
+ mListHook.add(new Hook("dictionary", "UserDictionary", "READ_USER_DICTIONARY", 1, null, null));
+
+ mListHook.add(new Hook("email", "EMailProvider", "com.android.email.permission.ACCESS_PROVIDER", 1, null, null));
+ mListHook.add(new Hook("email", "GMailProvider", "com.google.android.gm.permission.READ_CONTENT_PROVIDER", 8, "1.99.20", null));
+
+ mListHook.add(new Hook("identification", "%hostname", "", 1, null, null).unsafe());
+ mListHook.add(new Hook("identification", "%imei", "", 1, null, null).unsafe());
+ mListHook.add(new Hook("identification", "%macaddr", "", 1, null, null).unsafe());
+ mListHook.add(new Hook("identification", "%serialno", "", 1, null, null).unsafe());
+ mListHook.add(new Hook("identification", "%cid", "", 1, null, null).unsafe());
+ mListHook.add(new Hook("identification", "/proc", "", 1, "1.7", null).unsafe().dangerous().whitelist(cTypeProc));
+ mListHook.add(new Hook("identification", "/system/build.prop", "", 1, "1.9.9", null).unsafe().dangerous());
+ mListHook.add(new Hook("identification", "/sys/block/.../cid", "", 1, null, null).unsafe().dangerous());
+ mListHook.add(new Hook("identification", "/sys/class/.../cid", "", 1, null, null).unsafe().dangerous());
+ mListHook.add(new Hook("identification", "AdvertisingId", "", 1, null, null).unsafe().optional());
+
+ mListHook.add(new Hook("identification", "getString", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook("identification", "InputDevice.getDescriptor", "", 16, "2.2.2", "getDescriptor").unsafe());
+ mListHook.add(new Hook("identification", "InputDevice.getName", "", 9, null, null).unsafe());
+ mListHook.add(new Hook("identification", "GservicesProvider", "com.google.android.providers.gsf.permission.READ_GSERVICES,com.google.android.providers.gsf.permission.WRITE_GSERVICES", 1, null, null).dangerous());
+ mListHook.add(new Hook("identification", "SERIAL", "", 1, null, null).restart().noUsageData());
+
+ mListHook.add(new Hook("identification", "USB.getDeviceId", "", 12, "2.1.7", null).unsafe());
+ mListHook.add(new Hook("identification", "USB.getDeviceName", "", 12, "2.1.7", null).unsafe());
+ mListHook.add(new Hook("identification", "USB.getSerialNumber", "", 20, "2.1.17", null).unsafe());
+
+ mListHook.add(new Hook("identification", "Srv_Android_ID", "", 19, "2.99", "getString").AOSP(19));
+
+ mListHook.add(new Hook("identification", "Cast.getDeviceId", "", 1, "3.5.11", null).unsafe());
+ mListHook.add(new Hook("identification", "Cast.getIpAddress", "", 1, "3.5.11", null).unsafe());
+
+ // java.net.NetworkInterface
+ mListHook.add(new Hook("internet", "NetworkInterface.getByIndex", "INTERNET", 19, "2.2.2", null).unsafe());
+ mListHook.add(new Hook("internet", "NetworkInterface.getByInetAddress", "INTERNET", 1, "2.2.2", "getByInetAddress").unsafe());
+ mListHook.add(new Hook("internet", "NetworkInterface.getByName", "INTERNET", 1, "2.2.2", "getByName").unsafe().dangerous().whitelist(cTypeIPAddress));
+ mListHook.add(new Hook("internet", "NetworkInterface.getNetworkInterfaces", "INTERNET", 1, "2.2.2", "getNetworkInterfaces").unsafe());
+
+ mListHook.add(new Hook("internet", "inet", "INTERNET", 1, null, null).dangerous().restart().noUsageData());
+ mListHook.add(new Hook("internet", "inet_admin", "NET_ADMIN", 1, "2.1.1", null).dangerous().restart().noUsageData());
+ mListHook.add(new Hook("internet", "inet_bw", "READ_NETWORK_USAGE_HISTORY,MODIFY_NETWORK_ACCOUNTING", 1, "2.1.1", null).dangerous().restart().noUsageData());
+ mListHook.add(new Hook("internet", "inet_vpn", "NET_TUNNELING", 1, "2.1.1", null).dangerous().restart().noUsageData());
+ mListHook.add(new Hook("internet", "inet_mesh", "LOOP_RADIO", 1, "2.1.1", null).dangerous().restart().noUsageData());
+
+ // android.net.ConnectivityManager
+ mListHook.add(new Hook("internet", "Connectivity.getActiveNetworkInfo", null, 1, "2.2.2", "getActiveNetworkInfo").unsafe().dangerous());
+ mListHook.add(new Hook("internet", "Connectivity.getAllNetworkInfo", null, 1, "2.2.2", "getAllNetworkInfo").unsafe());
+ mListHook.add(new Hook("internet", "Connectivity.getNetworkInfo", null, 1, "2.2.2", "getNetworkInfo").unsafe().dangerous());
+
+ // android.net.NetworkInfo
+ mListHook.add(new Hook("internet", "NetworkInfo.getDetailedState", null, 1, "2.2.2", "getDetailedState").unsafe());
+ mListHook.add(new Hook("internet", "NetworkInfo.getState", null, 1, "2.2.2", "getState").unsafe());
+ mListHook.add(new Hook("internet", "NetworkInfo.isConnected", null, 1, "2.2.2", "isConnected").unsafe());
+ mListHook.add(new Hook("internet", "NetworkInfo.isConnectedOrConnecting", null, 1, "2.2.2", "isConnectedOrConnecting").unsafe());
+
+ // android.net.wifi.WifiManager
+ mListHook.add(new Hook("internet", "WiFi.getConnectionInfo", null, 10, "2.2.2", "getConnectionInfo").notAOSP(19));
+ mListHook.add(new Hook("internet", "WiFi.Srv_getConnectionInfo", null, 10, "2.99", "WiFi.getConnectionInfo").AOSP(19));
+
+ // java.net.InetAddress
+ mListHook.add(new Hook("internet", "InetAddress.getAllByName", "INTERNET", 1, null, null).unsafe().dangerous().whitelist(cTypeIPAddress));
+ mListHook.add(new Hook("internet", "InetAddress.getAllByNameOnNet", "INTERNET", 21, "3.5.6", null).unsafe().dangerous().whitelist(cTypeIPAddress));
+ mListHook.add(new Hook("internet", "InetAddress.getByAddress", "INTERNET", 1, null, null).unsafe().dangerous().whitelist(cTypeIPAddress));
+ mListHook.add(new Hook("internet", "InetAddress.getByName", "INTERNET", 1, null, null).unsafe().dangerous().whitelist(cTypeIPAddress));
+ mListHook.add(new Hook("internet", "InetAddress.getByNameOnNet", "INTERNET", 21, "3.5.6", null).unsafe().dangerous().whitelist(cTypeIPAddress));
+
+ // android.net.IpPrefix
+ mListHook.add(new Hook("internet", "IpPrefix.getAddress", null, 21, "3.5.6", null).dangerous().unsafe());
+ mListHook.add(new Hook("internet", "IpPrefix.getRawAddress", null, 21, "3.5.6", null).dangerous().unsafe());
+
+ // android.net.LinkProperties
+ mListHook.add(new Hook("internet", "LinkProperties.getAddresses", null, 19, "3.5.6", null).dangerous().unsafe());
+ mListHook.add(new Hook("internet", "LinkProperties.getAllAddresses", null, 19, "3.5.6", null).dangerous().unsafe());
+ mListHook.add(new Hook("internet", "LinkProperties.getAllLinkAddresses", null, 19, "3.5.6", null).dangerous().unsafe());
+ mListHook.add(new Hook("internet", "LinkProperties.getLinkAddresses", null, 19, "3.5.6", null).dangerous().unsafe());
+ mListHook.add(new Hook("internet", "LinkProperties.getStackedLinks", null, 19, "3.5.6", null).dangerous().unsafe());
+
+ mListHook.add(new Hook("internet", "connect", null, 1, "1.99.45", null).unsafe().dangerous().whitelist(cTypeIPAddress));
+
+ mListHook.add(new Hook("ipc", "Binder", "", 1, "2.1.21", null).notAOSP(19).dangerous().whitelist(cTypeTransaction));
+
+ mListHook.add(new Hook("location", "addGeofence", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 17, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "addGpsStatusListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 3, "2.1.17", null).notAOSP(19));
+ mListHook.add(new Hook("location", "addNmeaListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 5, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "addProximityAlert", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "getAllProviders", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.20", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("location", "getBestProvider", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.20", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("location", "getGpsStatus", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 3, "1.99.29", null).notAOSP(19));
+ mListHook.add(new Hook("location", "getLastKnownLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "getProviders", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "1.99.1", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("location", "isProviderEnabled", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "1.99.1", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("location", "requestLocationUpdates", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, null, null).restart().notAOSP(19));
+ mListHook.add(new Hook("location", "requestSingleUpdate", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 9, null, null).restart().notAOSP(19));
+ mListHook.add(new Hook("location", "sendExtraCommand", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 3, null, null).notAOSP(19));
+
+ mListHook.add(new Hook("location", "Srv_requestGeofence", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 17, "2.99", "addGeofence").AOSP(19));
+ mListHook.add(new Hook("location", "Srv_addGpsStatusListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 3, "2.99", "addGpsStatusListener").AOSP(19));
+ mListHook.add(new Hook("location", "Srv_getAllProviders", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99", "getAllProviders").AOSP(19).dangerous());
+ mListHook.add(new Hook("location", "Srv_getBestProvider", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99", "getBestProvider").AOSP(19).dangerous());
+ mListHook.add(new Hook("location", "Srv_getProviders", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99", "getProviders").AOSP(19).dangerous());
+ mListHook.add(new Hook("location", "Srv_isProviderEnabled", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99", "isProviderEnabled").AOSP(19).dangerous());
+ mListHook.add(new Hook("location", "Srv_getLastLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99", "getLastKnownLocation").AOSP(19));
+ mListHook.add(new Hook("location", "Srv_requestLocationUpdates", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99", "requestLocationUpdates").restart().AOSP(19));
+ mListHook.add(new Hook("location", "Srv_sendExtraCommand", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 3, "2.99", "sendExtraCommand").AOSP(19));
+ mListHook.add(new Hook("location", "Srv_addGpsMeasurementsListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 21, "3.5.6", null).AOSP(21));
+ mListHook.add(new Hook("location", "Srv_addGpsNavigationMessageListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 21, "3.5.6", null).AOSP(21));
+
+ mListHook.add(new Hook("location", "enableLocationUpdates", "CONTROL_LOCATION_UPDATES", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "getAllCellInfo", "ACCESS_COARSE_UPDATES", 17, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "getCellLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "getNeighboringCellInfo", "ACCESS_COARSE_UPDATES", 3, null, null).notAOSP(19));
+
+ mListHook.add(new Hook("location", "Srv_enableLocationUpdates", "CONTROL_LOCATION_UPDATES", 10, "2.99", "enableLocationUpdates").AOSP(19));
+ mListHook.add(new Hook("location", "Srv_enableLocationUpdatesForSubscriber", "CONTROL_LOCATION_UPDATES", 21, "3.5.6", null).AOSP(21));
+ mListHook.add(new Hook("location", "Srv_getAllCellInfo", "ACCESS_COARSE_UPDATES", 17, "2.99", "getAllCellInfo").AOSP(19));
+ mListHook.add(new Hook("location", "Srv_getCellLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99", "getCellLocation").AOSP(19));
+ mListHook.add(new Hook("location", "Srv_getNeighboringCellInfo", "ACCESS_COARSE_UPDATES", 3, "2.99", "getNeighboringCellInfo").AOSP(19));
+
+ mListHook.add(new Hook("location", "WiFi.getScanResults", "ACCESS_WIFI_STATE", 1, "2.2.2", "getScanResults").notAOSP(19).dangerous());
+ mListHook.add(new Hook("location", "WiFi.Srv_getScanResults", "ACCESS_WIFI_STATE", 1, "2.99", "WiFi.getScanResults").AOSP(19).dangerous());
+
+ mListHook.add(new Hook("location", "listen", "ACCESS_COARSE_LOCATION", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook("location", "Srv_listen", "ACCESS_COARSE_LOCATION", 1, null, null).AOSP(19));
+
+ mListHook.add(new Hook("location", "GMS.addGeofences", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, null, null).unsafe().optional());
+ mListHook.add(new Hook("location", "GMS.getLastLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, null, null).unsafe().optional());
+ mListHook.add(new Hook("location", "GMS.requestLocationUpdates", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, null, null).unsafe().optional());
+ mListHook.add(new Hook("location", "GMS.requestActivityUpdates", "com.google.android.gms.permission.ACTIVITY_RECOGNITION", 1, null, null).unsafe());
+
+ mListHook.add(new Hook("location", "GMS5.getLastLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99.26", null).unsafe().optional());
+ mListHook.add(new Hook("location", "GMS5.requestLocationUpdates", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.99.26", null).unsafe().optional());
+ mListHook.add(new Hook("location", "GMS5.requestActivityUpdates", "com.google.android.gms.permission.ACTIVITY_RECOGNITION", 1, "2.99.26", null).unsafe());
+
+ mListHook.add(new Hook("location", "GMS5.getCurrentPlace", "ACCESS_FINE_LOCATION", 1, "3.6.9", null).unsafe());
+
+ mListHook.add(new Hook("location", "MapV1.enableMyLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.25", null).unsafe().optional());
+
+ mListHook.add(new Hook("location", "MapV2.getMyLocation", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.25", null).unsafe().optional());
+ mListHook.add(new Hook("location", "MapV2.getPosition", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.25", null).unsafe().optional());
+ mListHook.add(new Hook("location", "MapV2.setLocationSource", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.25", null).unsafe().optional());
+ mListHook.add(new Hook("location", "MapV2.setOnMapClickListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.25", null).unsafe().optional());
+ mListHook.add(new Hook("location", "MapV2.setOnMapLongClickListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.25", null).unsafe().optional());
+ mListHook.add(new Hook("location", "MapV2.setOnMyLocationChangeListener", "ACCESS_COARSE_LOCATION,ACCESS_FINE_LOCATION", 1, "2.1.25", null).unsafe().optional());
+
+ mListHook.add(new Hook("media", "Audio.startRecording", "RECORD_AUDIO", 3, "2.2.3", "startRecording").unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.setPreviewCallback", "CAMERA", 1, "2.99.21", "setPreviewCallback").unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.setPreviewCallbackWithBuffer", "CAMERA", 8, "2.99.21", null).unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.setPreviewDisplay", "CAMERA", 1, "2.99.21", null).unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.setPreviewTexture", "CAMERA", 11, "2.99.21", null).unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.setOneShotPreviewCallback", "CAMERA", 11, "2.99.21", null).unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.startPreview", "CAMERA", 1, "2.2.3", "setPreviewCallback").unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.takePicture", "CAMERA", 1, "2.2.3", "takePicture").unsafe().doNotify());
+ mListHook.add(new Hook("media", "MediaRecorder.start", "RECORD_AUDIO,RECORD_VIDEO", 1, "2.2.3", "setOutputFile").unsafe().doNotify());
+ mListHook.add(new Hook("media", "MediaRecorder.setOutputFile", "RECORD_AUDIO,RECORD_VIDEO", 1, "2.99.20", "setOutputFile").unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera.permission", "CAMERA", 1, "2.2.3", null).dangerous().doNotify());
+ mListHook.add(new Hook("media", "Record.Audio.permission", "RECORD_AUDIO", 3, "2.2.3", null).dangerous().doNotify());
+ mListHook.add(new Hook("media", "Record.Video.permission", "RECORD_VIDEO", 3, "2.2.3", null).dangerous().doNotify());
+
+ mListHook.add(new Hook("media", MediaStore.ACTION_IMAGE_CAPTURE, "", 3, null, null).doNotify());
+ mListHook.add(new Hook("media", MediaStore.ACTION_IMAGE_CAPTURE_SECURE, "", 17, null, null).doNotify());
+ mListHook.add(new Hook("media", MediaStore.ACTION_VIDEO_CAPTURE, "", 3, null, null).doNotify());
+
+ mListHook.add(new Hook("media", "Camera2.capture", "CAMERA", 20, null, null).unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera2.captureBurst", "CAMERA", 20, null, null).unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera2.setRepeatingRequest", "CAMERA", 20, null, null).unsafe().doNotify());
+ mListHook.add(new Hook("media", "Camera2.setRepeatingBurst", "CAMERA", 20, null, null).unsafe().doNotify());
+
+ mListHook.add(new Hook("messages", "getAllMessagesFromIcc", "RECEIVE_SMS", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("messages", "getCarrierConfigValues", "", 21, "3.5.6", null));
+ mListHook.add(new Hook("messages", "Srv_getAllMessagesFromIccEf", "RECEIVE_SMS", 19, "2.99", "getAllMessagesFromIcc").AOSP(19));
+
+ mListHook.add(new Hook("messages", "SmsProvider", "READ_SMS,WRITE_SMS", 1, null, null));
+ mListHook.add(new Hook("messages", "MmsProvider", "READ_SMS,WRITE_SMS", 1, null, null));
+ mListHook.add(new Hook("messages", "MmsSmsProvider", "READ_SMS,WRITE_SMS", 1, null, null));
+ mListHook.add(new Hook("messages", "VoicemailContentProvider", "com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL", 1, null, null));
+
+ mListHook.add(new Hook("messages", Telephony.Sms.Intents.DATA_SMS_RECEIVED_ACTION, "RECEIVE_SMS", 1, null, null));
+ mListHook.add(new Hook("messages", Telephony.Sms.Intents.SMS_RECEIVED_ACTION, "RECEIVE_SMS", 1, null, null));
+ mListHook.add(new Hook("messages", Telephony.Sms.Intents.WAP_PUSH_RECEIVED_ACTION, "RECEIVE_WAP_PUSH", 1, null, null));
+ mListHook.add(new Hook("messages", Telephony.Sms.Intents.SMS_DELIVER_ACTION, "BROADCAST_SMS", 19, "2.2.2", null));
+ mListHook.add(new Hook("messages", Telephony.Sms.Intents.WAP_PUSH_DELIVER_ACTION, "BROADCAST_WAP_PUSH", 19, "2.2.2", null));
+
+ // android.bluetooth.BluetoothAdapter/BluetoothDevice
+ mListHook.add(new Hook("network", "Bluetooth.getAddress", "BLUETOOTH", 5, "2.2.3", "getAddress").unsafe());
+ mListHook.add(new Hook("network", "Bluetooth.getBondedDevices", "BLUETOOTH", 5, "2.2.3", "getBondedDevices").unsafe());
+ mListHook.add(new Hook("network", "Bluetooth.Srv_getAddress", "BLUETOOTH", 5, "2.99", "getAddress").AOSP(19));
+ mListHook.add(new Hook("network", "Bluetooth.Srv_getName", "BLUETOOTH", 5, "2.99", null).AOSP(19));
+
+ // java.net.NetworkInterface
+ mListHook.add(new Hook("network", "NetworkInterface.getHardwareAddress", "ACCESS_NETWORK_STATE", 9, "2.2.2", "getHardwareAddress").unsafe());
+ mListHook.add(new Hook("network", "NetworkInterface.getInetAddresses", "ACCESS_NETWORK_STATE", 9, "2.2.2", "getInetAddresses").unsafe());
+ mListHook.add(new Hook("network", "NetworkInterface.getInterfaceAddresses", "ACCESS_NETWORK_STATE", 9, "2.2.2", "getInterfaceAddresses").unsafe());
+
+ // android.net.wifi.WifiManager
+ mListHook.add(new Hook("network", "WiFi.getConfiguredNetworks", "ACCESS_WIFI_STATE", 10, "2.2.2", "getConfiguredNetworks").notAOSP(19));
+ mListHook.add(new Hook("network", "WiFi.getConnectionInfo", "ACCESS_WIFI_STATE", 10, "2.2.2", "getConnectionInfo").notAOSP(19));
+ mListHook.add(new Hook("network", "WiFi.getDhcpInfo", "ACCESS_WIFI_STATE", 10, "2.2.2", "getDhcpInfo").notAOSP(19));
+ mListHook.add(new Hook("network", "WiFi.getScanResults", "ACCESS_WIFI_STATE", 10, "2.2.2", "getScanResults").notAOSP(19).dangerous());
+ mListHook.add(new Hook("network", "WiFi.getWifiApConfiguration", "ACCESS_WIFI_STATE", 10, "2.2.2", "getWifiApConfiguration").notAOSP(19));
+
+ mListHook.add(new Hook("network", "WiFi.Srv_getBatchedScanResults", "ACCESS_WIFI_STATE", 10, "2.99", null).AOSP(19).dangerous());
+ mListHook.add(new Hook("network", "WiFi.Srv_getConfiguredNetworks", "ACCESS_WIFI_STATE", 10, "2.99", "WiFi.getConfiguredNetworks").AOSP(19));
+ mListHook.add(new Hook("network", "WiFi.Srv_getConnectionInfo", "ACCESS_WIFI_STATE", 10, "2.99", "WiFi.getConnectionInfo").AOSP(19));
+ mListHook.add(new Hook("network", "WiFi.Srv_getDhcpInfo", "ACCESS_WIFI_STATE", 10, "2.99", "WiFi.getDhcpInfo").AOSP(19));
+ mListHook.add(new Hook("network", "WiFi.Srv_getScanResults", "ACCESS_WIFI_STATE", 10, "2.99", "WiFi.getScanResults").AOSP(19).dangerous());
+ mListHook.add(new Hook("network", "WiFi.Srv_getWifiApConfiguration", "ACCESS_WIFI_STATE", 10, "2.99", "WiFi.getWifiApConfiguration").AOSP(19));
+
+ mListHook.add(new Hook("network", "Srv_Default_DNS", "", 19, "2.99", "getString").AOSP(19).dangerous());
+ mListHook.add(new Hook("network", "Srv_WiFi_Country", "", 19, "2.99", "getString").AOSP(19).dangerous());
+
+ // android.net.NetworkInfo
+ mListHook.add(new Hook("network", "NetworkInfo.getExtraInfo", null, 1, "2.2.2", "internet/getExtraInfo").unsafe());
+
+ mListHook.add(new Hook("nfc", "getNfcAdapter", "NFC", 14, null, null).unsafe());
+ mListHook.add(new Hook("nfc", "getDefaultAdapter", "NFC", 10, null, null).unsafe());
+
+ mListHook.add(new Hook("nfc", NfcAdapter.ACTION_ADAPTER_STATE_CHANGED, "NFC", 18, null, null));
+ mListHook.add(new Hook("nfc", NfcAdapter.ACTION_NDEF_DISCOVERED, "NFC", 10, null, null));
+ mListHook.add(new Hook("nfc", NfcAdapter.ACTION_TAG_DISCOVERED, "NFC", 10, null, null));
+ mListHook.add(new Hook("nfc", NfcAdapter.ACTION_TECH_DISCOVERED, "NFC", 10, null, null));
+
+ mListHook.add(new Hook("notifications", "android.service.notification.NotificationListenerService", "BIND_NOTIFICATION_LISTENER_SERVICE", 18, null, null).unsafe());
+ mListHook.add(new Hook("notifications", "com.google.android.c2dm.intent.REGISTRATION", "com.google.android.c2dm.permission.RECEIVE", 10, null, null).dangerous());
+ mListHook.add(new Hook("notifications", "com.google.android.c2dm.intent.RECEIVE", "com.google.android.c2dm.permission.RECEIVE", 10, null, null).dangerous());
+
+ mListHook.add(new Hook("overlay", "addView", "SYSTEM_ALERT_WINDOW", 1, null, null).unsafe().optional());
+
+ mListHook.add(new Hook("phone", "getDeviceId", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getGroupIdLevel1", "READ_PHONE_STATE", 18, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getIsimDomain", "READ_PRIVILEGED_PHONE_STATE", 14, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getIsimImpi", "READ_PRIVILEGED_PHONE_STATE", 14, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getIsimImpu", "READ_PRIVILEGED_PHONE_STATE", 14, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getLine1AlphaTag", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getLine1Number", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getMsisdn", "READ_PHONE_STATE", 14, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getSimSerialNumber", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getSubscriberId", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getVoiceMailAlphaTag", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "getVoiceMailNumber", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+
+ mListHook.add(new Hook("phone", "Srv_getDeviceId", "READ_PHONE_STATE", 10, "2.99", "getDeviceId").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getGroupIdLevel1", "READ_PHONE_STATE", 18, "2.99", "getGroupIdLevel1").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getIsimDomain", "READ_PRIVILEGED_PHONE_STATE", 14, "2.99", "getIsimDomain").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getIsimImpi", "READ_PRIVILEGED_PHONE_STATE", 14, "2.99", "getIsimImpi").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getIsimImpu", "READ_PRIVILEGED_PHONE_STATE", 14, "2.99", "getIsimImpu").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getLine1AlphaTag", "READ_PHONE_STATE", 10, "2.99", "getLine1AlphaTag").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getLine1Number", "READ_PHONE_STATE", 10, "2.99", "getLine1Number").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getMsisdn", "READ_PHONE_STATE", 14, "2.99", "getMsisdn").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getIccSerialNumber", "READ_PHONE_STATE", 10, "2.99", "getSimSerialNumber").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getSubscriberId", "READ_PHONE_STATE", 10, "2.99", "getSubscriberId").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getVoiceMailAlphaTag", "READ_PHONE_STATE", 10, "2.99", "getVoiceMailAlphaTag").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getVoiceMailNumber", "READ_PHONE_STATE", 10, "2.99", "getVoiceMailNumber").AOSP(19).to(20));
+ mListHook.add(new Hook("phone", "Srv_getCompleteVoiceMailNumber", "READ_PHONE_STATE", 10, "2.99", null).AOSP(19).to(20));
+
+ mListHook.add(new Hook("phone", "Srv_getImei", "READ_PHONE_STATE", 21, "3.5.6", null).AOSP(21).obsolete());
+ mListHook.add(new Hook("phone", "Srv_getIsimIst", "READ_PRIVILEGED_PHONE_STATE", 21, "3.5.6", null).AOSP(21).obsolete());
+ mListHook.add(new Hook("phone", "Srv_getIsimPcscf", "READ_PRIVILEGED_PHONE_STATE", 21, "3.5.6", null).AOSP(21).obsolete());
+
+ mListHook.add(new Hook("phone", "Srv_getCdmaMdn", "MODIFY_PHONE_STATE", 21, "3.5.6", null).AOSP(21));
+ mListHook.add(new Hook("phone", "Srv_getCdmaMin", "MODIFY_PHONE_STATE", 21, "3.5.6", null).AOSP(21));
+ mListHook.add(new Hook("phone", "Srv_getLine1AlphaTagForDisplay", "READ_PHONE_STATE", 21, "3.5.6", null).AOSP(21).obsolete());
+ mListHook.add(new Hook("phone", "Srv_getLine1NumberForDisplay", "READ_PHONE_STATE", 21, "3.5.6", null).AOSP(21).obsolete());
+
+ mListHook.add(new Hook("phone", "Srv_getCompleteVoiceMailNumberForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getCompleteVoiceMailNumber").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getDeviceId5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getDeviceId").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getDeviceIdForPhone5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getDeviceId").AOSP(Build.VERSION_CODES.LOLLIPOP_MR1));
+ mListHook.add(new Hook("phone", "Srv_getDeviceIdForSubscriber5", "READ_PHONE_STATE", 21, "3.6.13", "Srv_getDeviceId").AOSP(Build.VERSION_CODES.LOLLIPOP).to(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getGroupIdLevel1ForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getGroupIdLevel1").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getIccSerialNumberForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getIccSerialNumber").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getImeiForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getImei").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getIsimDomain5", "READ_PRIVILEGED_PHONE_STATE", 21, "3.6.12", "Srv_getIsimDomain").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getIsimImpi5", "READ_PRIVILEGED_PHONE_STATE", 21, "3.6.12", "Srv_getIsimImpi").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getIsimImpu5", "READ_PRIVILEGED_PHONE_STATE", 21, "3.6.12", "Srv_getIsimImpu").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getIsimIst5", "READ_PRIVILEGED_PHONE_STATE", 21, "3.6.12", "Srv_getIsimIst").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getIsimPcscf5", "READ_PRIVILEGED_PHONE_STATE", 21, "3.6.12", "Srv_getIsimPcscf").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getLine1AlphaTagForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getLine1AlphaTagForDisplay").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getLine1NumberForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getLine1NumberForDisplay").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getMsisdnForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getMsisdn").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getNaiForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", null).AOSP(Build.VERSION_CODES.LOLLIPOP_MR1));
+ mListHook.add(new Hook("phone", "Srv_getSubscriberIdForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getSubscriberId").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getVoiceMailAlphaTagForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getVoiceMailAlphaTag").AOSP(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook("phone", "Srv_getVoiceMailNumberForSubscriber5", "READ_PHONE_STATE", 21, "3.6.12", "Srv_getVoiceMailNumber").AOSP(Build.VERSION_CODES.LOLLIPOP));
+
+ mListHook.add(new Hook("phone", "listen", "READ_PHONE_STATE", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook("phone", "Srv_listen", "READ_PHONE_STATE", 10, null, null).AOSP(19));
+
+ mListHook.add(new Hook("phone", "getNetworkCountryIso", "", 10, null, null).unsafe());
+ mListHook.add(new Hook("phone", "getNetworkOperator", "", 10, null, null).unsafe());
+ mListHook.add(new Hook("phone", "getNetworkOperatorName", "", 10, null, null).unsafe());
+ mListHook.add(new Hook("phone", "getSimCountryIso", "", 10, null, null).unsafe());
+ mListHook.add(new Hook("phone", "getSimOperator", "", 10, null, null).unsafe());
+ mListHook.add(new Hook("phone", "getSimOperatorName", "", 10, null, null).unsafe());
+
+ mListHook.add(new Hook("phone", TelephonyManager.ACTION_PHONE_STATE_CHANGED, "READ_PHONE_STATE", 10, null, null));
+ mListHook.add(new Hook("phone", "TelephonyProvider", "WRITE_APN_SETTINGS", 1, null, null));
+
+ mListHook.add(new Hook("phone", "Configuration.MCC", "", 1, "2.0", null).unsafe().noUsageData().noOnDemand());
+ mListHook.add(new Hook("phone", "Configuration.MNC", "", 1, "2.0", null).unsafe().noUsageData().noOnDemand());
+
+ mListHook.add(new Hook("sensors", "getDefaultSensor", "", 3, null, null).unsafe().dangerous());
+ mListHook.add(new Hook("sensors", "getSensorList", "", 3, null, null).unsafe().dangerous());
+ mListHook.add(new Hook("sensors", "registerListener", "", 3, "2.99.27", null).unsafe());
+ mListHook.add(new Hook("sensors", "acceleration", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "gravity", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "humidity", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "light", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "magnetic", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "motion", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "orientation", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "pressure", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "proximity", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "rotation", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "temperature", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "step", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("sensors", "heartrate", "", 20, null, null).unsafe());
+
+ mListHook.add(new Hook("shell", "sh", "", 10, null, null).unsafe().dangerous().whitelist(cTypeCommand));
+ mListHook.add(new Hook("shell", "su", "", 10, null, null).unsafe().dangerous().whitelist(cTypeCommand));
+ mListHook.add(new Hook("shell", "exec", "", 10, null, null).unsafe().dangerous().whitelist(cTypeCommand));
+ mListHook.add(new Hook("shell", "load", "", 10, null, null).unsafe().dangerous().restart().whitelist(cTypeLibrary));
+ mListHook.add(new Hook("shell", "loadLibrary", "", 10, null, null).unsafe().dangerous().restart().whitelist(cTypeLibrary));
+ mListHook.add(new Hook("shell", "start", "", 10, null, null).unsafe().dangerous().whitelist(cTypeCommand));
+
+ mListHook.add(new Hook("storage", "media", "WRITE_MEDIA_STORAGE", 10, null, null).dangerous().restart().noUsageData());
+ mListHook.add(new Hook("storage", "sdcard", "READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE,ACCESS_ALL_EXTERNAL_STORAGE", 10, null, null).dangerous().restart().noUsageData());
+ mListHook.add(new Hook("storage", "mtp", "ACCESS_MTP", 10, "2.1.1", null).dangerous().restart().noUsageData());
+ mListHook.add(new Hook("storage", "getExternalStorageState", null, 10, null, null).unsafe().whitelist(cTypeFilename));
+ mListHook.add(new Hook("storage", "open", null, 1, "1.99.46", null).unsafe().dangerous().whitelist(cTypeFilename));
+
+ mListHook.add(new Hook("storage", "openAssetFileDescriptor", null, 3, "2.1.17", null).unsafe().dangerous().whitelist(cTypeFilename));
+ mListHook.add(new Hook("storage", "openFileDescriptor", null, 1, "2.1.17", null).unsafe().dangerous().whitelist(cTypeFilename));
+ mListHook.add(new Hook("storage", "openInputStream", null, 1, "2.1.17", null).unsafe().dangerous().whitelist(cTypeFilename));
+ mListHook.add(new Hook("storage", "openOutputStream", null, 1, "2.1.17", null).unsafe().dangerous().whitelist(cTypeFilename));
+ mListHook.add(new Hook("storage", "openTypedAssetFileDescriptor", null, 11, "2.1.17", null).unsafe().dangerous().whitelist(cTypeFilename));
+ mListHook.add(new Hook("storage", "openAssetFile", null, 5, "2.1.17", null).unsafe().dangerous().whitelist(cTypeFilename));
+ mListHook.add(new Hook("storage", "openFile", null, 5, "2.1.17", null).unsafe().dangerous().whitelist(cTypeFilename));
+
+ mListHook.add(new Hook("system", "getInstalledApplications", "", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getInstalledPackages", "", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getPackagesForUid", "", 1, "2.1.17", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getPackagesHoldingPermissions", "", 18, "1.99.1", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getPreferredActivities", "", 1, "1.99.44", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getPreferredPackages", "", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "queryBroadcastReceivers", "", 1, null, null).dangerous());
+ mListHook.add(new Hook("system", "queryContentProviders", "", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "queryIntentActivities", "", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "queryIntentActivityOptions", "", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "queryIntentContentProviders", "", 19, "1.99.1", null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "queryIntentServices", "", 1, null, null).notAOSP(19).dangerous());
+
+ mListHook.add(new Hook("system", "Srv_getPackageInfo", "", 19, "2.99.30", null).AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getApplicationInfo", "", 19, "2.99.30", null).AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getInstalledApplications", "", 19, "2.99", "getInstalledApplications").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getInstalledPackages", "", 19, "2.99", "getInstalledPackages").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getPackagesForUid", "", 19, "2.99", "getPackagesForUid").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getPackagesHoldingPermissions", "", 19, "2.99", "getPackagesHoldingPermissions").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getPersistentApplications", "", 19, "2.99", null).AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getPreferredPackages", "", 19, "2.99", "getPreferredPackages").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_queryContentProviders", "", 19, "2.99", "queryContentProviders").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_queryIntentActivities", "", 19, "2.99", "queryIntentActivities").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_queryIntentActivityOptions", "", 19, "2.99", "queryIntentActivityOptions").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_queryIntentContentProviders", "", 19, "2.99", "queryIntentContentProviders").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_queryIntentReceivers", "", 19, "2.99", "queryBroadcastReceivers").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_queryIntentServices", "", 19, "2.99", "queryIntentServices").AOSP(19).dangerous());
+
+ mListHook.add(new Hook("system", "getInstalledProviders", "", 3, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getInstalledProvidersForProfile", "", 21, "3.5.6", null).notAOSP(21).dangerous());
+ mListHook.add(new Hook("system", "Srv_getInstalledProviders", "", 3, "2.99", "getInstalledProviders").AOSP(19).to(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getInstalledProvidersForProfile", "", 3, "3.6.6", null).AOSP(21).dangerous());
+
+ mListHook.add(new Hook("system", "getRecentTasks", "GET_TASKS", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getRunningAppProcesses", "", 3, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getRunningServices", "", 1, null, null).notAOSP(19).dangerous());
+ mListHook.add(new Hook("system", "getRunningTasks", "GET_TASKS", 1, null, null).notAOSP(19).dangerous());
+
+ mListHook.add(new Hook("system", "Srv_getRecentTasks", "GET_TASKS", 1, "2.99", "getRecentTasks").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getRunningAppProcesses", "", 3, "2.99", "getRunningAppProcesses").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getServices", "", 1, "2.99", "getRunningServices").AOSP(19).dangerous());
+ mListHook.add(new Hook("system", "Srv_getTasks", "GET_TASKS", 1, "2.99", "getRunningTasks").AOSP(19).dangerous());
+
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_ADDED, "", 1, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_REPLACED, "", 3, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_RESTARTED, "", 1, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_REMOVED, "", 1, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_CHANGED, "", 1, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_DATA_CLEARED, "", 3, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_FIRST_LAUNCH, "", 12, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_FULLY_REMOVED, "", 14, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_NEEDS_VERIFICATION, "", 14, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_PACKAGE_VERIFIED, "", 17, "2.2.2", null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE, "", 8, null, null).dangerous());
+ mListHook.add(new Hook("system", Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE, "", 8, null, null).dangerous());
+
+ mListHook.add(new Hook("system", "ApplicationsProvider", "", 1, null, null).to(18));
+
+ mListHook.add(new Hook("system", "checkPermission", "", 1, "2.1.24", null).AOSP(19).dangerous().whitelist(cTypePermission));
+ mListHook.add(new Hook("system", "checkUidPermission", "", 1, "2.1.24", null).AOSP(19).dangerous().whitelist(cTypePermission));
+
+ mListHook.add(new Hook("system", "IntentFirewall", "", 19, "2.2.2", null).AOSP(19).dangerous().whitelist(cTypeAction));
+
+ mListHook.add(new Hook("system", "queryAndAggregateUsageStats", null, 21, "3.5.6", null).notAOSP(21));
+ mListHook.add(new Hook("system", "queryConfigurations", null, 21, "3.5.6", null).notAOSP(21));
+ mListHook.add(new Hook("system", "queryEvents", null, 21, "3.5.6", null).notAOSP(21));
+ mListHook.add(new Hook("system", "queryUsageStats", null, 21, "3.5.6", null).notAOSP(21));
+ mListHook.add(new Hook("system", "Srv_queryConfigurationStats", null, 21, "3.5.6", null).AOSP(21));
+ mListHook.add(new Hook("system", "Srv_queryEvents", null, 21, "3.5.6", null).AOSP(21));
+ mListHook.add(new Hook("system", "Srv_queryUsageStats", null, 21, "3.5.6", null).AOSP(21));
+
+ mListHook.add(new Hook("view", "loadUrl", "", 1, "3.6.2", "false").unsafe().whitelist(cTypeUrl));
+ mListHook.add(new Hook("view", "postUrl", "", 1, "3.6.2", null).unsafe().whitelist(cTypeUrl));
+ mListHook.add(new Hook("view", "initUserAgentString", "", 3, "3.6.2", null).unsafe());
+ mListHook.add(new Hook("view", "getDefaultUserAgent", "", 17, null, null).unsafe());
+ mListHook.add(new Hook("view", "getUserAgent", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("view", "getUserAgentString", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("view", "setUserAgent", "", 3, null, null).unsafe());
+ mListHook.add(new Hook("view", "setUserAgentString", "", 3, null, null).unsafe());
+
+ mListHook.add(new Hook("view", Intent.ACTION_VIEW, "", 1, null, null).notAOSP(19).doNotify().whitelist(cTypeUrl));
+ mListHook.add(new Hook("view", "Srv_" + Intent.ACTION_VIEW, "", 19, "2.99", Intent.ACTION_VIEW).AOSP(19).doNotify().whitelist(cTypeUrl));
+
+ mListHook.add(new Hook("view", "GMS5.view", "", 1, "2.99.27", null).unsafe());
+
+ // AccountManager
+ mListHook.add(new Hook(null, "removeOnAccountsUpdatedListener", "", 5, null, null));
+
+ // Activity
+ mListHook.add(new Hook(null, "startActivities", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "startActivity", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "startActivityForResult", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "startActivityFromChild", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "startActivityFromFragment", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "startActivityIfNeeded", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "startNextMatchingActivity", "", 1, null, null).notAOSP(19));
+
+ // ActivityThread / MessageQueue
+ mListHook.add(new Hook(null, "next", "", 1, null, null).notAOSP(19).optional());
+ mListHook.add(new Hook(null, "handleReceiver", "", 1, null, null).notAOSP(19).optional());
+
+ // ActivityManager(Service)
+ mListHook.add(new Hook(null, "Srv_startActivities", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_startActivity", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_startActivityAsUser", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_startActivityAsCaller", "", 21, null, null).AOSP(21));
+ mListHook.add(new Hook(null, "Srv_startActivityAndWait", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_startActivityWithConfig", "", 19, null, null).AOSP(19));
+
+ mListHook.add(new Hook(null, "inputDispatchingTimedOut", "", 17, null, null));
+ mListHook.add(new Hook(null, "appNotResponding", "", 15, null, null).optional());
+ mListHook.add(new Hook(null, "systemReady", "", 15, null, null));
+ mListHook.add(new Hook(null, "finishBooting", "", 15, null, null));
+ mListHook.add(new Hook(null, "setLockScreenShown", "", 17, null, null).optional());
+ mListHook.add(new Hook(null, "goingToSleep", "", 16, null, null).to(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook(null, "wakingUp", "", 16, null, null).to(Build.VERSION_CODES.LOLLIPOP));
+ mListHook.add(new Hook(null, "updateSleepIfNeededLocked", "", Build.VERSION_CODES.LOLLIPOP_MR1, null, null));
+ mListHook.add(new Hook(null, "shutdown", "", 15, null, null));
+ mListHook.add(new Hook(null, "activityResumed", "", Build.VERSION_CODES.JELLY_BEAN_MR1, null, null));
+ mListHook.add(new Hook(null, "activityPaused", "", Build.VERSION_CODES.JELLY_BEAN_MR1, null, null));
+
+ // AppIndexApi
+ mListHook.add(new Hook(null, "GMS5.viewEnd", "", 1, null, null));
+
+ // Application
+ mListHook.add(new Hook(null, "onCreate", "", 1, null, null));
+
+ // AudioRecord
+ mListHook.add(new Hook(null, "Audio.stop", "", 3, null, null));
+
+ // Binder
+ mListHook.add(new Hook(null, "execTransact", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "transact", "", 1, null, null).notAOSP(19));
+
+ // ClipboardManager/Service
+ mListHook.add(new Hook(null, "removePrimaryClipChangedListener", "", 11, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "Srv_removePrimaryClipChangedListener", "", 11, null, null).AOSP(19));
+
+ // Content resolvers
+ mListHook.add(new Hook(null, "query", "", 1, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "Srv_call", "", 1, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_query", "", 1, null, null).AOSP(19));
+
+ // Camera
+ mListHook.add(new Hook(null, "Camera.stopPreview", "", 1, null, null));
+
+ // ContextImpl
+ mListHook.add(new Hook(null, "getPackageManager", "", 1, null, null).notAOSP(19));
+
+ // ContextImpl / Activity
+ mListHook.add(new Hook(null, "getSystemService", "", 1, null, null).notAOSP(19));
+
+ // FusedLocationProviderApi // ActivityRecognitionApi
+ mListHook.add(new Hook(null, "GMS5.removeLocationUpdates", "", 1, "2.99.26", null).optional());
+ mListHook.add(new Hook(null, "GMS5.removeActivityUpdates", "", 1, "2.99.26", null).optional());
+
+ // GoogleApiClient.Builder
+ mListHook.add(new Hook(null, "GMS5.addConnectionCallbacks", "", 1, null, null).optional());
+ mListHook.add(new Hook(null, "GMS5.onConnected", "", 1, null, null));
+
+ // IntentFirewall
+ mListHook.add(new Hook(null, "checkIntent", "", 19, null, null));
+
+ // LocationClient / ActivityRecognitionClient
+ mListHook.add(new Hook(null, "GMS.removeActivityUpdates", "", 1, null, null));
+ mListHook.add(new Hook(null, "GMS.removeGeofences", "", 1, null, null).optional());
+ mListHook.add(new Hook(null, "GMS.removeLocationUpdates", "", 1, null, null).optional());
+
+ // LocationManager/Service
+ mListHook.add(new Hook(null, "removeUpdates", "", 3, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "Srv_removeUpdates", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_removeGeofence", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_removeGpsStatusListener", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_removeGpsMeasurementsListener", "", 21, null, null).AOSP(21));
+ mListHook.add(new Hook(null, "Srv_removeGpsNavigationMessageListener", "", 21, null, null).AOSP(21));
+ mListHook.add(new Hook(null, "MapV1.disableMyLocation", "", 1, null, null).optional());
+
+ // MediaRecorder
+ mListHook.add(new Hook(null, "MediaRecorder.prepare", "", 1, null, null));
+ mListHook.add(new Hook(null, "MediaRecorder.stop", "", 1, null, null));
+
+ // Resources
+ mListHook.add(new Hook(null, "updateConfiguration", "", 1, null, null));
+
+ // TelephonyManager
+ mListHook.add(new Hook(null, "disableLocationUpdates", "", 10, null, null).notAOSP(19));
+ mListHook.add(new Hook(null, "Srv_disableLocationUpdates", "", 19, null, null).AOSP(19));
+ mListHook.add(new Hook(null, "Srv_disableLocationUpdatesForSubscriber", "", 21, null, null).AOSP(21));
+
+ // UtilHook
+ mListHook.add(new Hook(null, "isXposedEnabled", "", 15, null, null));
+
+ // WebView
+ mListHook.add(new Hook(null, "WebView", "", 1, null, null));
+ mListHook.add(new Hook(null, "getSettings", "", 1, null, null));
+
+ // WindowManagerImpl
+ mListHook.add(new Hook(null, "removeView", "", 1, null, null).optional());
+ mListHook.add(new Hook(null, "updateViewLayout", "", 1, null, null).optional());
+
+ // @formatter:on
+ return mListHook;
+ }
+
+ public static void annotate(Resources resources) {
+ if (mAnnotated)
+ return;
+
+ String self = Meta.class.getPackage().getName();
+ for (Hook hook : get())
+ if (hook.getRestrictionName() != null) {
+ String name = hook.getRestrictionName() + "_" + hook.getName();
+ name = name.replace(".", "_").replace("/", "_").replace("%", "_").replace("-", "_");
+ int resId = resources.getIdentifier(name, "string", self);
+ if (resId > 0)
+ hook.annotate(resources.getString(resId));
+ else
+ Util.log(null, Log.WARN, "Missing annotation hook=" + hook);
+ }
+
+ mAnnotated = true;
+ }
+}
\ No newline at end of file
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PRestriction.aidl b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PRestriction.aidl
new file mode 100644
index 0000000..16f52ae
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PRestriction.aidl
@@ -0,0 +1,3 @@
+package biz.bokhorst.xprivacy;
+
+parcelable PRestriction;
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PRestriction.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PRestriction.java
new file mode 100644
index 0000000..ff257a7
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PRestriction.java
@@ -0,0 +1,135 @@
+package biz.bokhorst.xprivacy;
+
+import android.annotation.SuppressLint;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class PRestriction implements Parcelable {
+ public int uid;
+ public String restrictionName;
+ public String methodName;
+ public boolean restricted;
+ public boolean asked;
+ public String extra;
+ public String value;
+ public long time;
+ public boolean debug;
+
+ // The extra is never needed in the result
+
+ public PRestriction() {
+ }
+
+ public PRestriction(PRestriction other) {
+ uid = other.uid;
+ restrictionName = other.restrictionName;
+ methodName = other.methodName;
+ restricted = other.restricted;
+ asked = other.asked;
+ extra = null;
+ value = other.value;
+ time = other.time;
+ debug = other.debug;
+ }
+
+ public PRestriction(int _uid, String category, String method) {
+ uid = _uid;
+ restrictionName = category;
+ methodName = method;
+ restricted = false;
+ asked = false;
+ extra = null;
+ value = null;
+ time = 0;
+ debug = false;
+ }
+
+ public PRestriction(int _uid, String category, String method, boolean _restricted) {
+ uid = _uid;
+ restrictionName = category;
+ methodName = method;
+ restricted = _restricted;
+ asked = false;
+ extra = null;
+ value = null;
+ time = 0;
+ debug = false;
+ }
+
+ public PRestriction(int _uid, String category, String method, boolean _restricted, boolean _asked) {
+ uid = _uid;
+ restrictionName = category;
+ methodName = method;
+ restricted = _restricted;
+ asked = _asked;
+ extra = null;
+ value = null;
+ time = 0;
+ debug = false;
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public PRestriction createFromParcel(Parcel in) {
+ return new PRestriction(in);
+ }
+
+ public PRestriction[] newArray(int size) {
+ return new PRestriction[size];
+ }
+ };
+
+ private PRestriction(Parcel in) {
+ readFromParcel(in);
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(uid);
+
+ out.writeInt(restrictionName == null ? 1 : 0);
+ if (restrictionName != null)
+ out.writeString(restrictionName);
+
+ out.writeInt(methodName == null ? 1 : 0);
+ if (methodName != null)
+ out.writeString(methodName);
+
+ out.writeInt(restricted ? 1 : 0);
+ out.writeInt(asked ? 1 : 0);
+
+ out.writeInt(extra == null ? 1 : 0);
+ if (extra != null)
+ out.writeString(extra);
+
+ out.writeInt(value == null ? 1 : 0);
+ if (value != null)
+ out.writeString(value);
+
+ out.writeLong(time);
+ out.writeInt(debug ? 1 : 0);
+ }
+
+ public void readFromParcel(Parcel in) {
+ uid = in.readInt();
+ restrictionName = (in.readInt() > 0 ? null : in.readString());
+ methodName = (in.readInt() > 0 ? null : in.readString());
+ restricted = (in.readInt() > 0 ? true : false);
+ asked = (in.readInt() > 0 ? true : false);
+ extra = (in.readInt() > 0 ? null : in.readString());
+ value = (in.readInt() > 0 ? null : in.readString());
+ time = in.readLong();
+ debug = (in.readInt() > 0 ? true : false);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ @SuppressLint("DefaultLocale")
+ public String toString() {
+ return String.format("%d/%s(%s;%s) %s=%srestricted%s", uid, methodName, extra, value, restrictionName,
+ (restricted ? "" : "!"), (asked ? "" : "?"));
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PSetting.aidl b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PSetting.aidl
new file mode 100644
index 0000000..7537240
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PSetting.aidl
@@ -0,0 +1,3 @@
+package biz.bokhorst.xprivacy;
+
+parcelable PSetting;
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PSetting.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PSetting.java
new file mode 100644
index 0000000..80b7ef5
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PSetting.java
@@ -0,0 +1,73 @@
+package biz.bokhorst.xprivacy;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class PSetting implements Parcelable {
+ public int uid;
+ public String type;
+ public String name;
+ public String value;
+
+ public PSetting() {
+ }
+
+ public PSetting(PSetting other) {
+ uid = other.uid;
+ type = other.type;
+ name = other.name;
+ value = other.value;
+ }
+
+ public PSetting(int _uid, String _type, String _name, String _value) {
+ uid = _uid;
+ type = _type;
+ name = _name;
+ value = _value;
+ }
+
+ public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
+ public PSetting createFromParcel(Parcel in) {
+ return new PSetting(in);
+ }
+
+ public PSetting[] newArray(int size) {
+ return new PSetting[size];
+ }
+ };
+
+ private PSetting(Parcel in) {
+ readFromParcel(in);
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(uid);
+ out.writeInt(type == null ? 1 : 0);
+ if (type != null)
+ out.writeString(type);
+ out.writeInt(name == null ? 1 : 0);
+ if (name != null)
+ out.writeString(name);
+ out.writeInt(value == null ? 1 : 0);
+ if (value != null)
+ out.writeString(value);
+ }
+
+ public void readFromParcel(Parcel in) {
+ uid = in.readInt();
+ type = (in.readInt() > 0 ? null : in.readString());
+ name = (in.readInt() > 0 ? null : in.readString());
+ value = (in.readInt() > 0 ? null : in.readString());
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public String toString() {
+ return "uid=" + uid + " " + type + "/" + name + "=" + (value == null ? "null" : value);
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PackageChange.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PackageChange.java
new file mode 100644
index 0000000..d7ebdb5
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PackageChange.java
@@ -0,0 +1,175 @@
+package biz.bokhorst.xprivacy;
+
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.support.v4.app.NotificationCompat;
+import android.util.Log;
+
+public class PackageChange extends BroadcastReceiver {
+ @Override
+ public void onReceive(final Context context, Intent intent) {
+ try {
+ // Check uri
+ Uri inputUri = intent.getData();
+ if (inputUri.getScheme().equals("package")) {
+ // Get data
+ int uid = intent.getIntExtra(Intent.EXTRA_UID, 0);
+ int userId = Util.getUserId(uid);
+ boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
+ boolean ondemand = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+ NotificationManager notificationManager = (NotificationManager) context
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+
+ Util.log(null, Log.WARN, "Package change action=" + intent.getAction() + " replacing=" + replacing
+ + " uid=" + uid);
+
+ // Check action
+ if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
+ // Check privacy service
+ if (PrivacyService.getClient() == null)
+ return;
+
+ // Get data
+ ApplicationInfoEx appInfo = new ApplicationInfoEx(context, uid);
+ String packageName = inputUri.getSchemeSpecificPart();
+
+ // Default deny new user apps
+ if (appInfo.getPackageName().size() == 1) {
+ if (replacing)
+ PrivacyManager.clearPermissionCache(uid);
+ else {
+ // Delete existing restrictions
+ PrivacyManager.deleteRestrictions(uid, null, true);
+ PrivacyManager.deleteSettings(uid);
+ PrivacyManager.deleteUsage(uid);
+ PrivacyManager.clearPermissionCache(uid);
+
+ // Apply template
+ PrivacyManager.applyTemplate(uid, Meta.cTypeTemplate, null, true, true, false);
+
+ // Enable on demand
+ if (ondemand)
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemand, Boolean.toString(true));
+ }
+ }
+
+ // Mark as new/changed
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingState,
+ Integer.toString(ApplicationInfoEx.STATE_ATTENTION));
+
+ // New/update notification
+ boolean notify = PrivacyManager.getSettingBool(userId, PrivacyManager.cSettingNotify, true);
+ if (notify)
+ notify = PrivacyManager.getSettingBool(-uid, PrivacyManager.cSettingNotify, true);
+ if (!replacing || notify) {
+ Intent resultIntent = new Intent(context, ActivityApp.class);
+ resultIntent.putExtra(ActivityApp.cUid, uid);
+
+ // Build pending intent
+ PendingIntent pendingIntent = PendingIntent.getActivity(context, uid, resultIntent,
+ PendingIntent.FLAG_UPDATE_CURRENT);
+
+ // Build result intent settings
+ Intent resultIntentSettings = new Intent(context, ActivityApp.class);
+ resultIntentSettings.putExtra(ActivityApp.cUid, uid);
+ resultIntentSettings.putExtra(ActivityApp.cAction, ActivityApp.cActionSettings);
+
+ // Build pending intent settings
+ PendingIntent pendingIntentSettings = PendingIntent.getActivity(context, uid - 10000,
+ resultIntentSettings, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ // Build result intent clear
+ Intent resultIntentClear = new Intent(context, ActivityApp.class);
+ resultIntentClear.putExtra(ActivityApp.cUid, uid);
+ resultIntentClear.putExtra(ActivityApp.cAction, ActivityApp.cActionClear);
+
+ // Build pending intent clear
+ PendingIntent pendingIntentClear = PendingIntent.getActivity(context, uid + 10000,
+ resultIntentClear, PendingIntent.FLAG_UPDATE_CURRENT);
+
+ // Title
+ String title = String.format("%s %s %s",
+ context.getString(replacing ? R.string.msg_update : R.string.msg_new),
+ appInfo.getApplicationName(packageName),
+ appInfo.getPackageVersionName(context, packageName));
+ if (!replacing)
+ title = String.format("%s %s", title, context.getString(R.string.msg_applied));
+
+ // Build notification
+ NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context);
+ notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
+ notificationBuilder.setContentTitle(context.getString(R.string.app_name));
+ notificationBuilder.setContentText(title);
+ notificationBuilder.setContentIntent(pendingIntent);
+ notificationBuilder.setWhen(System.currentTimeMillis());
+ notificationBuilder.setAutoCancel(true);
+
+ // Actions
+ notificationBuilder.addAction(android.R.drawable.ic_menu_edit,
+ context.getString(R.string.menu_app_settings), pendingIntentSettings);
+ notificationBuilder.addAction(android.R.drawable.ic_menu_delete,
+ context.getString(R.string.menu_clear), pendingIntentClear);
+
+ // Notify
+ Notification notification = notificationBuilder.build();
+ notificationManager.notify(appInfo.getUid(), notification);
+ }
+
+ } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
+ // Check privacy service
+ if (PrivacyService.getClient() == null)
+ return;
+
+ if (!replacing) {
+ // Package removed
+ notificationManager.cancel(uid);
+
+ // Delete restrictions
+ ApplicationInfoEx appInfo = new ApplicationInfoEx(context, uid);
+ if (appInfo.getPackageName().size() == 0) {
+ PrivacyManager.deleteRestrictions(uid, null, false);
+ PrivacyManager.deleteSettings(uid);
+ PrivacyManager.deleteUsage(uid);
+ PrivacyManager.clearPermissionCache(uid);
+ }
+ }
+
+ } else if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
+ // Notify reboot required
+ String packageName = inputUri.getSchemeSpecificPart();
+ if (packageName.equals(context.getPackageName())) {
+ // Mark self as new/changed
+ if (PrivacyService.getClient() != null)
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingState,
+ Integer.toString(ApplicationInfoEx.STATE_ATTENTION));
+
+ // Start package update
+ Intent changeIntent = new Intent();
+ changeIntent.setClass(context, UpdateService.class);
+ changeIntent.putExtra(UpdateService.cAction, UpdateService.cActionUpdated);
+ context.startService(changeIntent);
+
+ // Build notification
+ NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context);
+ notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
+ notificationBuilder.setContentTitle(context.getString(R.string.app_name));
+ notificationBuilder.setContentText(context.getString(R.string.msg_reboot));
+ notificationBuilder.setWhen(System.currentTimeMillis());
+ notificationBuilder.setAutoCancel(true);
+ Notification notification = notificationBuilder.build();
+
+ // Notify
+ notificationManager.notify(Util.NOTIFY_RESTART, notification);
+ }
+ }
+ }
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ }
+}
diff --git a/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PrivacyManager.java b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PrivacyManager.java
new file mode 100644
index 0000000..b6a1fac
--- /dev/null
+++ b/src/XPrivacy-master/XPrivacy-master/src/biz/bokhorst/xprivacy/PrivacyManager.java
@@ -0,0 +1,1419 @@
+package biz.bokhorst.xprivacy;
+
+import java.lang.reflect.Field;
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.UUID;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.location.Location;
+import android.os.Build;
+import android.os.Process;
+import android.os.RemoteException;
+import android.util.Log;
+import android.util.SparseArray;
+
+public class PrivacyManager {
+ public static final boolean cVersion3 = true;
+
+ // This should correspond with restrict_ in strings.xml
+ public static final String cAccounts = "accounts";
+ public static final String cBrowser = "browser";
+ public static final String cCalendar = "calendar";
+ public static final String cCalling = "calling";
+ public static final String cClipboard = "clipboard";
+ public static final String cContacts = "contacts";
+ public static final String cDictionary = "dictionary";
+ public static final String cEMail = "email";
+ public static final String cIdentification = "identification";
+ public static final String cInternet = "internet";
+ public static final String cIPC = "ipc";
+ public static final String cLocation = "location";
+ public static final String cMedia = "media";
+ public static final String cMessages = "messages";
+ public static final String cNetwork = "network";
+ public static final String cNfc = "nfc";
+ public static final String cNotifications = "notifications";
+ public static final String cOverlay = "overlay";
+ public static final String cPhone = "phone";
+ public static final String cSensors = "sensors";
+ public static final String cShell = "shell";
+ public static final String cStorage = "storage";
+ public static final String cSystem = "system";
+ public static final String cView = "view";
+
+ // This should correspond with the above definitions
+ private static final String cRestrictionNames[] = new String[] { cAccounts, cBrowser, cCalendar, cCalling,
+ cClipboard, cContacts, cDictionary, cEMail, cIdentification, cInternet, cIPC, cLocation, cMedia, cMessages,
+ cNetwork, cNfc, cNotifications, cOverlay, cPhone, cSensors, cShell, cStorage, cSystem, cView };
+
+ public static List cMethodNoState = Arrays.asList(new String[] { "IntentFirewall", "checkPermission",
+ "checkUidPermission" });
+
+ // Setting names
+ public final static String cSettingSerial = "Serial";
+ public final static String cSettingLatitude = "Latitude";
+ public final static String cSettingLongitude = "Longitude";
+ public final static String cSettingAltitude = "Altitude";
+ public final static String cSettingMac = "Mac";
+ public final static String cSettingIP = "IP";
+ public final static String cSettingImei = "IMEI";
+ public final static String cSettingPhone = "Phone";
+ public final static String cSettingId = "ID";
+ public final static String cSettingGsfId = "GSF_ID";
+ public final static String cSettingAdId = "AdId";
+ public final static String cSettingMcc = "MCC";
+ public final static String cSettingMnc = "MNC";
+ public final static String cSettingCountry = "Country";
+ public final static String cSettingOperator = "Operator";
+ public final static String cSettingIccId = "ICC_ID";
+ public final static String cSettingSubscriber = "Subscriber";
+ public final static String cSettingSSID = "SSID";
+ public final static String cSettingUa = "UA";
+ public final static String cSettingOpenTab = "OpenTab";
+ public final static String cSettingSelectedCategory = "SelectedCategory";
+ public final static String cSettingFUsed = "FUsed";
+ public final static String cSettingFInternet = "FInternet";
+ public final static String cSettingFRestriction = "FRestriction";
+ public final static String cSettingFRestrictionNot = "FRestrictionNot";
+ public final static String cSettingFPermission = "FPermission";
+ public final static String cSettingFOnDemand = "FOnDemand";
+ public final static String cSettingFOnDemandNot = "FOnDemandNot";
+ public final static String cSettingFUser = "FUser";
+ public final static String cSettingFSystem = "FSystem";
+ public final static String cSettingSortMode = "SortMode";
+ public final static String cSettingSortInverted = "SortInverted";
+ public final static String cSettingModifyTime = "ModifyTime";
+ public final static String cSettingTheme = "Theme";
+ public final static String cSettingSalt = "Salt";
+ public final static String cSettingVersion = "Version";
+ public final static String cSettingFirstRun = "FirstRun";
+ public final static String cSettingTutorialMain = "TutorialMain";
+ public final static String cSettingTutorialDetails = "TutorialDetails";
+ public final static String cSettingNotify = "Notify";
+ public final static String cSettingLog = "Log";
+ public final static String cSettingDangerous = "Dangerous";
+ public final static String cSettingExperimental = "Experimental";
+ public final static String cSettingRandom = "Random@boot";
+ public final static String cSettingState = "State";
+ public final static String cSettingConfidence = "Confidence";
+ public final static String cSettingHttps = "Https";
+ public final static String cSettingRegistered = "Registered";
+ public final static String cSettingUsage = "UsageData";
+ public final static String cSettingParameters = "Parameters";
+ public final static String cSettingValues = "Values";
+ public final static String cSettingSystem = "RestrictSystem";
+ public final static String cSettingRestricted = "Retricted";
+ public final static String cSettingOnDemand = "OnDemand";
+ public final static String cSettingMigrated = "Migrated";
+ public final static String cSettingCid = "Cid";
+ public final static String cSettingLac = "Lac";
+ public final static String cSettingBlacklist = "Blacklist";
+ public final static String cSettingResolve = "Resolve";
+ public final static String cSettingNoResolve = "NoResolve";
+ public final static String cSettingFreeze = "Freeze";
+ public final static String cSettingPermMan = "PermMan";
+ public final static String cSettingIntentWall = "IntentWall";
+ public final static String cSettingSafeMode = "SafeMode";
+ public final static String cSettingTestVersions = "TestVersions";
+ public final static String cSettingOnDemandSystem = "OnDemandSystem";
+ public final static String cSettingLegacy = "Legacy";
+ public final static String cSettingAOSPMode = "AOSPMode";
+ public final static String cSettingChangelog = "Changelog";
+ public final static String cSettingUpdates = "Updates";
+ public final static String cSettingMethodExpert = "MethodExpert";
+ public final static String cSettingWhitelistNoModify = "WhitelistNoModify";
+ public final static String cSettingNoUsageData = "NoUsageData";
+
+ public final static String cSettingODExpert = "ODExpert";
+ public final static String cSettingODCategory = "ODCategory";
+ public final static String cSettingODOnce = "ODOnce";
+ public final static String cSettingODOnceDuration = "ODOnceDuration";
+
+ // Special value names
+ public final static String cValueRandom = "#Random#";
+ public final static String cValueRandomLegacy = "\nRandom\n";
+
+ // Constants
+ public final static int cXposedAppProcessMinVersion = 46;
+ public final static int cWarnServiceDelayMs = 200;
+ public final static int cWarnHookDelayMs = 200;
+
+ private final static int cMaxExtra = 128;
+ private final static String cDeface = "DEFACE";
+
+ // Caching
+ public final static int cRestrictionCacheTimeoutMs = 15 * 1000;
+ public final static int cSettingCacheTimeoutMs = 30 * 1000;
+ private static Map> mMethod = new LinkedHashMap>();
+ private static Map> mRestart = new LinkedHashMap>();
+ private static Map> mPermission = new LinkedHashMap>();
+ private static Map mSettingsCache = new HashMap();
+ private static Map mTransientCache = new HashMap();
+ private static Map mRestrictionCache = new HashMap();
+ private static SparseArray> mPermissionRestrictionCache = new SparseArray>();
+ private static SparseArray> mPermissionHookCache = new SparseArray>();
+
+ // Meta data
+
+ static {
+ List listHook = Meta.get();
+ List listRestriction = getRestrictions();
+ for (Hook hook : listHook) {
+ String restrictionName = hook.getRestrictionName();
+ if (restrictionName == null)
+ restrictionName = "";
+
+ // Check restriction
+ else if (!listRestriction.contains(restrictionName))
+ if (hook.isAvailable())
+ Util.log(null, Log.WARN, "Not found restriction=" + restrictionName + " hook=" + hook);
+
+ // Enlist method
+ if (!mMethod.containsKey(restrictionName))
+ mMethod.put(restrictionName, new HashMap());
+ mMethod.get(restrictionName).put(hook.getName(), hook);
+
+ // Cache restart required methods
+ if (hook.isRestartRequired()) {
+ if (!mRestart.containsKey(restrictionName))
+ mRestart.put(restrictionName, new ArrayList());
+ mRestart.get(restrictionName).add(hook.getName());
+ }
+
+ // Enlist permissions
+ String[] permissions = hook.getPermissions();
+ if (permissions != null)
+ for (String perm : permissions)
+ if (!perm.equals("")) {
+ String aPermission = (perm.contains(".") ? perm : "android.permission." + perm);
+ if (!mPermission.containsKey(aPermission))
+ mPermission.put(aPermission, new ArrayList());
+ if (!mPermission.get(aPermission).contains(hook))
+ mPermission.get(aPermission).add(hook);
+ }
+ }
+ // Util.log(null, Log.WARN, listHook.size() + " hooks");
+ }
+
+ public static List getRestrictions() {
+ List listRestriction = new ArrayList(Arrays.asList(cRestrictionNames));
+ if (Hook.isAOSP(19))
+ listRestriction.remove(cIPC);
+ return listRestriction;
+ }
+
+ public static TreeMap getRestrictions(Context context) {
+ Collator collator = Collator.getInstance(Locale.getDefault());
+ TreeMap tmRestriction = new TreeMap(collator);
+ for (String restrictionName : getRestrictions()) {
+ int stringId = context.getResources().getIdentifier("restrict_" + restrictionName, "string",
+ context.getPackageName());
+ tmRestriction.put(stringId == 0 ? restrictionName : context.getString(stringId), restrictionName);
+ }
+ return tmRestriction;
+ }
+
+ public static Hook getHook(String _restrictionName, String methodName) {
+ String restrictionName = (_restrictionName == null ? "" : _restrictionName);
+ if (mMethod.containsKey(restrictionName))
+ if (mMethod.get(restrictionName).containsKey(methodName))
+ return mMethod.get(restrictionName).get(methodName);
+ return null;
+ }
+
+ public static List getHooks(String restrictionName, Version version) {
+ List listMethod = new ArrayList();
+ for (String methodName : mMethod.get(restrictionName).keySet()) {
+ Hook hook = mMethod.get(restrictionName).get(methodName);
+
+ if (!hook.isAvailable())
+ continue;
+
+ if (version != null && hook.getFrom() != null && version.compareTo(hook.getFrom()) < 0)
+ continue;
+
+ if ("IntentFirewall".equals(hook.getName()))
+ if (!PrivacyManager.getSettingBool(0, PrivacyManager.cSettingIntentWall, false))
+ continue;
+
+ if ("checkPermission".equals(hook.getName()) || "checkUidPermission".equals(hook.getName()))
+ if (!PrivacyManager.getSettingBool(0, PrivacyManager.cSettingPermMan, false))
+ continue;
+
+ listMethod.add(mMethod.get(restrictionName).get(methodName));
+ }
+ Collections.sort(listMethod);
+ return listMethod;
+ }
+
+ public static List getPermissions(String restrictionName, Version version) {
+ List listPermission = new ArrayList();
+ for (Hook md : getHooks(restrictionName, version))
+ if (md.getPermissions() != null)
+ for (String permission : md.getPermissions())
+ if (!listPermission.contains(permission))
+ listPermission.add(permission);
+ return listPermission;
+ }
+
+ // Restrictions
+
+ public static PRestriction getRestrictionEx(int uid, String restrictionName, String methodName) {
+ PRestriction query = new PRestriction(uid, restrictionName, methodName, false);
+ PRestriction result = new PRestriction(uid, restrictionName, methodName, false, true);
+ try {
+ // Check cache
+ boolean cached = false;
+ CRestriction key = new CRestriction(uid, restrictionName, methodName, null);
+ synchronized (mRestrictionCache) {
+ if (mRestrictionCache.containsKey(key)) {
+ CRestriction entry = mRestrictionCache.get(key);
+ if (!entry.isExpired()) {
+ cached = true;
+ result.restricted = entry.restricted;
+ result.asked = entry.asked;
+ }
+ }
+ }
+
+ if (!cached) {
+ // Get restriction
+ result = PrivacyService.getRestrictionProxy(query, false, "");
+ if (result.debug)
+ Util.logStack(null, Log.WARN);
+
+ // Add to cache
+ key.restricted = result.restricted;
+ key.asked = result.asked;
+ if (result.time > 0) {
+ key.setExpiry(result.time);
+ Util.log(null, Log.WARN, "Caching " + result + " until " + new Date(result.time));
+ }
+ synchronized (mRestrictionCache) {
+ if (mRestrictionCache.containsKey(key))
+ mRestrictionCache.remove(key);
+ mRestrictionCache.put(key, key);
+ }
+ }
+ } catch (RemoteException ex) {
+ Util.bug(null, ex);
+ }
+ return result;
+ }
+
+ public static boolean getRestriction(final XHook hook, int uid, String restrictionName, String methodName,
+ String secret) {
+ return getRestrictionExtra(hook, uid, restrictionName, methodName, null, null, secret);
+ }
+
+ public static boolean getRestrictionExtra(final XHook hook, int uid, String restrictionName, String methodName,
+ String extra, String secret) {
+ return getRestrictionExtra(hook, uid, restrictionName, methodName, extra, null, secret);
+ }
+
+ public static boolean getRestrictionExtra(final XHook hook, int uid, String restrictionName, String methodName,
+ String extra, String value, String secret) {
+ long start = System.currentTimeMillis();
+ PRestriction result = new PRestriction(uid, restrictionName, methodName, false, true);
+
+ // Check uid
+ if (uid <= 0)
+ return false;
+
+ // Check secret
+ if (secret == null) {
+ Util.log(null, Log.ERROR, "Secret missing restriction=" + restrictionName + "/" + methodName);
+ Util.logStack(hook, Log.ERROR);
+ secret = "";
+ }
+
+ // Check restriction
+ if (restrictionName == null || restrictionName.equals("")) {
+ Util.log(hook, Log.ERROR, "restriction empty method=" + methodName);
+ Util.logStack(hook, Log.ERROR);
+ return false;
+ }
+
+ // Check usage
+ if (methodName == null || methodName.equals("")) {
+ Util.log(hook, Log.ERROR, "Method empty");
+ Util.logStack(hook, Log.ERROR);
+ } else if (getHook(restrictionName, methodName) == null) {
+ Util.log(hook, Log.ERROR, "Unknown method=" + methodName);
+ Util.logStack(hook, Log.ERROR);
+ }
+
+ // Check extra
+ if (extra != null && extra.length() > cMaxExtra)
+ extra = extra.substring(0, cMaxExtra) + "...";
+ result.extra = extra;
+
+ // Check cache
+ boolean cached = false;
+ CRestriction key = new CRestriction(uid, restrictionName, methodName, extra);
+ synchronized (mRestrictionCache) {
+ if (mRestrictionCache.containsKey(key)) {
+ CRestriction entry = mRestrictionCache.get(key);
+ if (!entry.isExpired()) {
+ cached = true;
+ result.restricted = entry.restricted;
+ result.asked = entry.asked;
+ }
+ }
+ }
+
+ // Get restriction
+ if (!cached)
+ try {
+ PRestriction query = new PRestriction(uid, restrictionName, methodName, false);
+ query.extra = extra;
+ query.value = value;
+ PRestriction restriction = PrivacyService.getRestrictionProxy(query, true, secret);
+ result.restricted = restriction.restricted;
+ if (restriction.debug)
+ Util.logStack(null, Log.WARN);
+
+ // Add to cache
+ if (result.time >= 0) {
+ key.restricted = result.restricted;
+ key.asked = result.asked;
+ if (result.time > 0) {
+ key.setExpiry(result.time);
+ Util.log(null, Log.WARN, "Caching " + result + " until " + new Date(result.time));
+ }
+ synchronized (mRestrictionCache) {
+ if (mRestrictionCache.containsKey(key))
+ mRestrictionCache.remove(key);
+ mRestrictionCache.put(key, key);
+ }
+ }
+ } catch (Throwable ex) {
+ Util.bug(hook, ex);
+ }
+
+ // Result
+ long ms = System.currentTimeMillis() - start;
+ Util.log(hook, ms < cWarnServiceDelayMs ? Log.INFO : Log.WARN,
+ String.format("Get client %s%s %d ms", result, (cached ? " (cached)" : ""), ms));
+
+ return result.restricted;
+ }
+
+ public static void setRestriction(int uid, String restrictionName, String methodName, boolean restricted,
+ boolean asked) {
+ checkCaller();
+
+ // Check uid
+ if (uid == 0) {
+ Util.log(null, Log.WARN, "uid=0");
+ return;
+ }
+
+ // Build list of restrictions
+ List listRestriction = new ArrayList();
+ if (restrictionName == null)
+ listRestriction.addAll(PrivacyManager.getRestrictions());
+ else
+ listRestriction.add(restrictionName);
+
+ // Create list of restrictions to set
+ List listPRestriction = new ArrayList();
+ for (String rRestrictionName : listRestriction)
+ listPRestriction.add(new PRestriction(uid, rRestrictionName, methodName, restricted, asked));
+
+ // Make exceptions
+ if (methodName == null)
+ for (String rRestrictionName : listRestriction)
+ for (Hook md : getHooks(rRestrictionName, null)) {
+ if (!canRestrict(uid, Process.myUid(), rRestrictionName, md.getName(), false))
+ listPRestriction.add(new PRestriction(uid, rRestrictionName, md.getName(), false, true));
+ else if (md.isDangerous())
+ listPRestriction.add(new PRestriction(uid, rRestrictionName, md.getName(), false, md
+ .whitelist() == null));
+ }
+
+ setRestrictionList(listPRestriction);
+ }
+
+ public static List cIDCant = Arrays.asList(new String[] { "getString", "Srv_Android_ID", "%serialno",
+ "SERIAL" });
+
+ public static boolean canRestrict(int uid, int xuid, String restrictionName, String methodName, boolean system) {
+ int _uid = Util.getAppId(uid);
+ int userId = Util.getUserId(uid);
+
+ if (_uid == Process.SYSTEM_UID) {
+ if (PrivacyManager.cIdentification.equals(restrictionName))
+ return false;
+ if (PrivacyManager.cShell.equals(restrictionName) && "loadLibrary".equals(methodName))
+ return false;
+ }
+
+ if (system)
+ if (!isApplication(_uid))
+ if (!getSettingBool(userId, PrivacyManager.cSettingSystem, false))
+ return false;
+
+ // @formatter:off
+ if (_uid == Util.getAppId(xuid) &&
+ ((PrivacyManager.cIdentification.equals(restrictionName) && cIDCant.contains(methodName))
+ || PrivacyManager.cIPC.equals(restrictionName)
+ || PrivacyManager.cStorage.equals(restrictionName)
+ || PrivacyManager.cSystem.equals(restrictionName)
+ || PrivacyManager.cView.equals(restrictionName)))
+ return false;
+ // @formatter:on
+
+ Hook hook = getHook(restrictionName, methodName);
+ if (hook != null && hook.isUnsafe())
+ if (getSettingBool(userId, PrivacyManager.cSettingSafeMode, false))
+ return false;
+
+ return true;
+ }
+
+ public static void updateState(int uid) {
+ setSetting(uid, cSettingState, Integer.toString(ApplicationInfoEx.STATE_CHANGED));
+ setSetting(uid, cSettingModifyTime, Long.toString(System.currentTimeMillis()));
+ }
+
+ public static void setRestrictionList(List listRestriction) {
+ checkCaller();
+
+ if (listRestriction.size() > 0)
+ try {
+ PrivacyService.getClient().setRestrictionList(listRestriction);
+
+ // Clear cache
+ synchronized (mRestrictionCache) {
+ mRestrictionCache.clear();
+ }
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ }
+
+ public static List getRestrictionList(int uid, String restrictionName) {
+ checkCaller();
+
+ try {
+ return PrivacyService.getClient().getRestrictionList(new PRestriction(uid, restrictionName, null, false));
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+ return new ArrayList();
+ }
+
+ public static boolean isRestrictionSet(PRestriction restriction) {
+ try {
+ return PrivacyService.getClient().isRestrictionSet(restriction);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ return false;
+ }
+ }
+
+ public static void deleteRestrictions(int uid, String restrictionName, boolean deleteWhitelists) {
+ checkCaller();
+
+ try {
+ // Delete restrictions
+ PrivacyService.getClient().deleteRestrictions(uid, restrictionName == null ? "" : restrictionName);
+
+ // Clear associated whitelists
+ if (deleteWhitelists && uid > 0) {
+ for (PSetting setting : getSettingList(uid, null))
+ if (Meta.isWhitelist(setting.type))
+ setSetting(uid, setting.type, setting.name, null);
+ }
+
+ // Clear cache
+ synchronized (mRestrictionCache) {
+ mRestrictionCache.clear();
+ }
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+
+ // Mark as new/changed
+ setSetting(uid, cSettingState, Integer.toString(restrictionName == null ? ApplicationInfoEx.STATE_CHANGED
+ : ApplicationInfoEx.STATE_ATTENTION));
+
+ // Change app modification time
+ setSetting(uid, cSettingModifyTime, Long.toString(System.currentTimeMillis()));
+ }
+
+ public static List getRestartStates(int uid, String restrictionName) {
+ // Returns a list of restriction states for functions whose application
+ // requires the app to be restarted.
+ List listRestartRestriction = new ArrayList();
+
+ Set listRestriction = new HashSet();
+ if (restrictionName == null)
+ listRestriction = mRestart.keySet();
+ else if (mRestart.keySet().contains(restrictionName))
+ listRestriction.add(restrictionName);
+
+ try {
+ for (String restriction : listRestriction) {
+ for (String method : mRestart.get(restriction))
+ listRestartRestriction.add(getRestrictionEx(uid, restriction, method).restricted);
+ }
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ }
+
+ return listRestartRestriction;
+ }
+
+ public static void applyTemplate(int uid, String templateName, String restrictionName, boolean methods,
+ boolean clear, boolean invert) {
+ checkCaller();
+
+ int userId = Util.getUserId(uid);
+
+ // Check on-demand
+ boolean ondemand = getSettingBool(userId, PrivacyManager.cSettingOnDemand, true);
+
+ // Build list of restrictions
+ List listRestriction = new ArrayList();
+ if (restrictionName == null)
+ listRestriction.addAll(getRestrictions());
+ else
+ listRestriction.add(restrictionName);
+
+ // Apply template
+ Util.log(null, Log.WARN, "Applying template=" + templateName);
+ boolean hasOndemand = false;
+ List listPRestriction = new ArrayList();
+ for (String rRestrictionName : listRestriction) {
+ // Cleanup
+ if (clear)
+ deleteRestrictions(uid, rRestrictionName, false);
+
+ // Parent
+ String parentValue = getSetting(userId, templateName, rRestrictionName, Boolean.toString(!ondemand)
+ + "+ask");
+ boolean parentRestricted = parentValue.contains("true");
+ boolean parentAsked = (!ondemand || parentValue.contains("asked"));
+ hasOndemand = hasOndemand || !parentAsked;
+
+ // Merge
+ PRestriction parentMerge;
+ if (clear)
+ parentMerge = new PRestriction(uid, rRestrictionName, null, parentRestricted, parentAsked);
+ else
+ parentMerge = getRestrictionEx(uid, rRestrictionName, null);
+
+ // Apply
+ if (canRestrict(uid, Process.myUid(), rRestrictionName, null, true))
+ if (invert && ((parentRestricted && parentMerge.restricted) || (!parentAsked && !parentMerge.asked))) {
+ listPRestriction.add(new PRestriction(uid, rRestrictionName, null, parentRestricted ? false
+ : parentMerge.restricted, !parentAsked ? true : parentMerge.asked));
+ continue; // leave functions
+ } else
+ listPRestriction.add(new PRestriction(uid, rRestrictionName, null, parentMerge.restricted
+ || parentRestricted, parentMerge.asked && parentAsked));
+
+ // Childs
+ if (methods)
+ for (Hook hook : getHooks(rRestrictionName, null))
+ if (canRestrict(uid, Process.myUid(), rRestrictionName, hook.getName(), true)) {
+ // Child
+ String settingName = rRestrictionName + "." + hook.getName();
+ String childValue = getSetting(userId, templateName, settingName, null);
+ if (childValue == null)
+ childValue = Boolean.toString(parentRestricted && !hook.isDangerous())
+ + (parentAsked || (hook.isDangerous() && hook.whitelist() == null) ? "+asked"
+ : "+ask");
+ boolean restricted = childValue.contains("true");
+ boolean asked = (!ondemand || childValue.contains("asked"));
+
+ // Merge
+ PRestriction childMerge;
+ if (clear)
+ childMerge = new PRestriction(uid, rRestrictionName, hook.getName(), parentRestricted
+ && restricted, parentAsked || asked);
+ else
+ childMerge = getRestrictionEx(uid, rRestrictionName, hook.getName());
+
+ // Invert
+ if (invert && parentRestricted && restricted) {
+ restricted = false;
+ childMerge.restricted = false;
+ }
+ if (invert && !parentAsked && !asked) {
+ asked = true;
+ childMerge.asked = true;
+ }
+
+ // Apply
+ if ((parentRestricted && !restricted) || (!parentAsked && asked)
+ || (invert ? false : hook.isDangerous() || !clear)) {
+ PRestriction child = new PRestriction(uid, rRestrictionName, hook.getName(),
+ (parentRestricted && restricted) || childMerge.restricted, (parentAsked || asked)
+ && childMerge.asked);
+ listPRestriction.add(child);
+ }
+ }
+ }
+
+ // Apply result
+ setRestrictionList(listPRestriction);
+ if (hasOndemand)
+ PrivacyManager.setSetting(uid, PrivacyManager.cSettingOnDemand, Boolean.toString(true));
+ }
+
+ // White/black listing
+
+ public static Map> listWhitelisted(int uid, String type) {
+ checkCaller();
+
+ Map> mapWhitelisted = new HashMap>();
+ for (PSetting setting : getSettingList(uid, type))
+ if (Meta.isWhitelist(setting.type)) {
+ if (!mapWhitelisted.containsKey(setting.type))
+ mapWhitelisted.put(setting.type, new TreeMap());
+ mapWhitelisted.get(setting.type).put(setting.name, Boolean.parseBoolean(setting.value));
+ }
+ return mapWhitelisted;
+ }
+
+ // Usage
+
+ public static long getUsage(int uid, String restrictionName, String methodName) {
+ checkCaller();
+
+ try {
+ List listRestriction = new ArrayList();
+ if (restrictionName == null)
+ for (String sRestrictionName : getRestrictions())
+ listRestriction.add(new PRestriction(uid, sRestrictionName, methodName, false));
+ else
+ listRestriction.add(new PRestriction(uid, restrictionName, methodName, false));
+ return PrivacyService.getClient().getUsage(listRestriction);
+ } catch (Throwable ex) {
+ Util.bug(null, ex);
+ return 0;
+ }
+ }
+
+ public static List