Skip to content

Commit

Permalink
Edit documents && move to v0.4.7
Browse files Browse the repository at this point in the history
  • Loading branch information
renyuneyun committed Nov 27, 2017
2 parents 1e5c2cc + 689e4a5 commit 9665b69
Show file tree
Hide file tree
Showing 39 changed files with 482 additions and 139 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
CHANGELOG
======

* v0.4.7: Require permissions during runtime && fix several bugs
* Add permission checking and requesting codes for each plugin
* When loading the plugin's view, its permission is checked and requested (if necessary)
* Request root permission when enabling "root features"
* Fix incorrect root usages for `{AirplaneMode,Cellular,Command}Operationplugin`
* Fix "root preference" of `CommandOperationPlugin`

* v0.4.6.1: Fix start-on-boot && remove an unneeded class

* v0.4.6: Use *selection* instead of *directly listing* for *Operation*s && Add operations: airplane mode & send sms && Add event: receive sms && several bug fixes
Expand Down
4 changes: 2 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ android {
applicationId 'ryey.easer'
minSdkVersion 15
targetSdkVersion 23
versionCode 45
versionName "0.4.6.1"
versionCode 46
versionName "0.4.7"

vectorDrawables.useSupportLibrary = true

Expand Down
17 changes: 17 additions & 0 deletions app/src/main/java/ryey/easer/commons/plugindef/PluginDef.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,29 @@
package ryey.easer.commons.plugindef;

import android.app.Activity;
import android.content.Context;

public interface PluginDef {
/**
* Returns the plugin identifier.
* Only used internally. Never displayed to user.
*/
String name();

/**
* Checks all permission(s) used by this plugin
* @param context
* @return whether all permissions are satisfied (or not)
*/
boolean checkPermissions(Context context);

/**
* Request for all permissions used by this plugin
* @param activity
* @param requestCode
*/
void requestPermissions(Activity activity, int requestCode);

/**
* Returns a dummy (empty) instance of the relevant data structure.
*/
Expand Down
105 changes: 12 additions & 93 deletions app/src/main/java/ryey/easer/core/ui/PermissionOutlineFragment.java
Original file line number Diff line number Diff line change
@@ -1,40 +1,23 @@
package ryey.easer.core.ui;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.Fragment;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import com.orhanobut.logger.Logger;

import java.util.List;

import ryey.easer.R;
import ryey.easer.commons.plugindef.PluginDef;
import ryey.easer.plugins.PluginRegistry;

public class PermissionOutlineFragment extends Fragment {
static String[] normal_permissions = new String[]{
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN,
Manifest.permission.MODIFY_AUDIO_SETTINGS,
Manifest.permission.READ_CALENDAR,
Manifest.permission.READ_SMS,
Manifest.permission.RECEIVE_SMS,
Manifest.permission.SEND_SMS,
Manifest.permission.WRITE_SYNC_SETTINGS,
};

private static int REQCODE_BIND_NOTIFICATION_LISTENER_SERVICE = 100;

Button mButton;

Expand Down Expand Up @@ -79,85 +62,21 @@ public void onResume() {
}

boolean hasAllRequiredPermissions() {
for (String permission : normal_permissions) {
if (ContextCompat.checkSelfPermission(getActivity(), permission)
!= PackageManager.PERMISSION_GRANTED) {
Logger.d("Permission <%s> not satisfied", permission);
for (Object obj_plugin : PluginRegistry.getInstance().all().getPlugins()) {
PluginDef plugin = (PluginDef) obj_plugin;
if (!plugin.checkPermissions(getContext())) {
Logger.d("Permission for plugin <%s> not satisfied", plugin.name());
return false;
}
}
if (!hasSpecialPermissions())
return false;
return true;
}

void requestAllPermissions() {
for (int i = 0; i < normal_permissions.length; i++) {
final String permission = normal_permissions[i];
if (ActivityCompat.checkSelfPermission(getActivity(), permission)
!= PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(getActivity(),
new String[]{permission}, i);
}
requestSpecialPermissions();
}

@RequiresApi(api = Build.VERSION_CODES.M)
boolean canWriteSettings() {
return Settings.System.canWrite(getContext());
}

@RequiresApi(api = Build.VERSION_CODES.M)
void requestWriteSettings() {
startActivity(new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS));
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
boolean canBindNotificationListenerService() {
String permission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
return ContextCompat.checkSelfPermission(getActivity(), permission)
!= PackageManager.PERMISSION_GRANTED;
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
void requestBindNotificationListenerService() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
startActivity(new Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS));
} else {
String permission = Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE;
ActivityCompat.requestPermissions(getActivity(),
new String[]{permission}, REQCODE_BIND_NOTIFICATION_LISTENER_SERVICE);
}
}

boolean hasSpecialPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!canWriteSettings()) {
Logger.d("Special Permission <%s> not satisfied",
Manifest.permission.WRITE_SETTINGS);
return false;
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (!canBindNotificationListenerService()) {
Logger.d("Special Permission <%s> not satisfied",
Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE);
return false;
}
}
return true;
}

void requestSpecialPermissions() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!canWriteSettings()) {
requestWriteSettings();
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (!canBindNotificationListenerService()) {
requestBindNotificationListenerService();
}
List plugins = PluginRegistry.getInstance().all().getPlugins();
for (int i = 0; i < plugins.size(); i++) {
PluginDef plugin = (PluginDef) plugins.get(i);
plugin.requestPermissions(getActivity(), i);
}
}
}
14 changes: 9 additions & 5 deletions app/src/main/java/ryey/easer/core/ui/SettingsActivity.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,6 @@ protected void onCreate(Bundle savedInstanceState) {
.commit();
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(getString(R.string.key_pref_autostart))) {
Expand All @@ -60,6 +55,15 @@ public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, Strin
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
}
} else if (key.equals(getString(R.string.key_pref_use_root))) {
if (sharedPreferences.getBoolean(key, false)) {
try {
Process p = Runtime.getRuntime().exec("su");
} catch (IOException e) {
e.printStackTrace();
sharedPreferences.edit().putBoolean(key, false).apply();
}
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ryey.easer.core.ui.edit;

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
Expand All @@ -17,6 +18,7 @@
import ryey.easer.commons.plugindef.PluginViewFragment;
import ryey.easer.commons.plugindef.StorageData;
import ryey.easer.commons.plugindef.eventplugin.EventData;
import ryey.easer.commons.plugindef.eventplugin.EventPlugin;
import ryey.easer.commons.plugindef.eventplugin.EventType;
import ryey.easer.plugins.PluginRegistry;

Expand Down Expand Up @@ -46,6 +48,28 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
return v;
}

@Override
public void onResume() {
super.onResume();
EventPlugin plugin = PluginRegistry.getInstance().event().findPlugin(pluginViewFragment);
if (!plugin.checkPermissions(getContext())) {
pluginViewFragment.setEnabled(false);
plugin.requestPermissions(getActivity(), 1);
}
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 1) {
for (int i = 0; i < grantResults.length; i++) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
return;
}
}
pluginViewFragment.setEnabled(true);
}
}

@Override
protected void _fill(StorageData data) {
pluginViewFragment.fill(data);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,13 @@ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectedListener.onSelected(((PluginItemWrapper) parent.getItemAtPosition(position)).plugin);
dismiss();
OperationPlugin plugin = ((PluginItemWrapper) parent.getItemAtPosition(position)).plugin;
if (plugin.checkPermissions(getContext())) {
selectedListener.onSelected(plugin);
dismiss();
} else {
plugin.requestPermissions(getActivity(), 0);
}
}
});
return view;
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/java/ryey/easer/plugins/PluginRegistry.java
Original file line number Diff line number Diff line change
Expand Up @@ -196,15 +196,15 @@ public int getPluginIndex(T_data data) {
}
}

public static class OverallRegistry implements PluginLookuper {
public static class OverallRegistry implements PluginLookuper<PluginDef, StorageData> {

PluginLookuper<? extends PluginDef, ? extends StorageData>[] lookupers;

OverallRegistry(PluginLookuper<? extends PluginDef, ? extends StorageData>[] lookupers) {
this.lookupers = lookupers;
}

public final List<? extends PluginDef> getPlugins() {
public List<PluginDef> getPlugins() {
List<PluginDef> list = new ArrayList<>();
for (PluginLookuper<? extends PluginDef, ? extends StorageData> lookuper : lookupers) {
list.addAll(lookuper.getPlugins());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ryey.easer.plugins.event.battery;

import android.app.Activity;
import android.content.Context;

import ryey.easer.commons.plugindef.PluginViewFragment;
Expand All @@ -14,6 +15,16 @@ public String name() {
return "battery";
}

@Override
public boolean checkPermissions(Context context) {
return true;
}

@Override
public void requestPermissions(Activity activity, int requestCode) {

}

@Override
public EventData data() {
return new BatteryEventData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,15 @@

package ryey.easer.plugins.event.bluetooth_device;

import android.Manifest;
import android.app.Activity;
import android.content.Context;

import ryey.easer.commons.plugindef.PluginViewFragment;
import ryey.easer.commons.plugindef.eventplugin.AbstractSlot;
import ryey.easer.commons.plugindef.eventplugin.EventData;
import ryey.easer.commons.plugindef.eventplugin.EventPlugin;
import ryey.easer.plugins.reusable.PluginHelper;

public class BTDeviceEventPlugin implements EventPlugin {

Expand All @@ -33,6 +36,17 @@ public String name() {
return "bluetooth device";
}

@Override
public boolean checkPermissions(Context context) {
return PluginHelper.checkPermission(context,
Manifest.permission.BLUETOOTH);
}

@Override
public void requestPermissions(Activity activity, int requestCode) {
PluginHelper.requestPermission(activity, requestCode, Manifest.permission.BLUETOOTH);
}

@Override
public EventData data() {
return new BTDeviceEventData();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

package ryey.easer.plugins.event.broadcast;

import android.app.Activity;
import android.content.Context;

import ryey.easer.commons.plugindef.PluginViewFragment;
Expand All @@ -33,6 +34,16 @@ public String name() {
return "broadcast";
}

@Override
public boolean checkPermissions(Context context) {
return true;
}

@Override
public void requestPermissions(Activity activity, int requestCode) {

}

@Override
public EventData data() {
return new BroadcastEventData();
Expand Down
Loading

0 comments on commit 9665b69

Please sign in to comment.