Skip to content

Commit 1e28fb1

Browse files
committed
Fix bugs; add permission manager
1 parent d212f87 commit 1e28fb1

File tree

8 files changed

+226
-7
lines changed

8 files changed

+226
-7
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
android:name=".AppManagerActivity"
3333
android:label="@string/app_manager">
3434
</activity>
35+
<activity
36+
android:name=".PermissionsActivity"
37+
android:label="@string/app_permissions">
38+
</activity>
3539
</application>
36-
3740
</manifest>

app/src/main/java/ru/nikita/adb/AppManagerActivity.java

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.app.ListActivity;
1111
import android.app.ProgressDialog;
1212
import android.content.Context;
13+
import android.content.Intent;
1314
import android.widget.ArrayAdapter;
1415
import android.widget.TextView;
1516
import android.widget.ListView;
@@ -25,14 +26,16 @@
2526
import android.util.Log;
2627
import ru.nikita.adb.Device;
2728
import ru.nikita.adb.Task;
29+
import ru.nikita.adb.PermissionsActivity;
2830

2931
public class AppManagerActivity extends ListActivity{
3032
@Override
3133
public void onCreate(Bundle savedInstanceState) {
3234
super.onCreate(savedInstanceState);
3335
sortMode = SORT.TYPE;
34-
adb = (Binary) getIntent().getSerializableExtra("adb");
35-
device = (Device) getIntent().getSerializableExtra("device");
36+
Intent intent = getIntent();
37+
adb = (Binary) intent.getSerializableExtra("adb");
38+
device = (Device) intent.getSerializableExtra("device");
3639
ListView v = getListView();
3740
registerForContextMenu(v);
3841
new AppLoadTask().execute();
@@ -73,16 +76,27 @@ public boolean onContextItemSelected(MenuItem item) {
7376
int id = item.getItemId();
7477
App app = apps[info.position];
7578
if(id == R.id.app_uninstall_data){
76-
new AppTask().execute(R.string.app_uninstalling, "pm uninstall --user 0 " + app.pkg);
79+
new AppTask().uninstallWithData(app);
7780
return true;
7881
}else if(id == R.id.app_uninstall){
79-
new AppTask().execute(R.string.app_uninstalling, "pm uninstall -k --user 0 " + app.pkg);
82+
new AppTask().uninstall(app);
8083
return true;
8184
}else if(id == R.id.app_install){
82-
new AppTask().execute(R.string.app_installing, "cmd package install-existing " + app.pkg);
85+
new AppTask().install(app);
86+
return true;
87+
}else if(id == R.id.app_clear){
88+
new AppTask().clear(app);
89+
return true;
90+
}else if(id == R.id.app_permissions){
91+
Intent intent = new Intent(this, PermissionsActivity.class);
92+
Bundle bundle = new Bundle();
93+
bundle.putSerializable("adb", adb);
94+
bundle.putSerializable("device", device);
95+
bundle.putString("package", app.pkg);
96+
intent.putExtras(bundle);
97+
startActivity(intent);
8398
return true;
8499
}
85-
86100
return super.onContextItemSelected(item);
87101
}
88102
private void sortApps(){
@@ -124,6 +138,7 @@ public int compareTo(App app){
124138
private class AppTask extends ADBTask{
125139
public AppTask(){
126140
super(adb);
141+
update = false;
127142
}
128143
@Override
129144
protected void onPreExecute(){
@@ -139,13 +154,31 @@ protected void onPostExecute(String log){
139154
log = log.trim();
140155
if(log.length() > 0 && log.length() < 200)
141156
Toast.makeText(getApplicationContext(), log, Toast.LENGTH_SHORT).show();
157+
if(update)
158+
new AppLoadTask().execute();
142159
}
143160
public void execute(int stringId, String args){
144161
this.stringId=stringId;
145162
shell(device, args);
146163
}
164+
public void uninstallWithData(App app){
165+
update = true;
166+
execute(R.string.app_uninstalling, "pm uninstall --user 0 " + app.pkg);
167+
}
168+
public void uninstall(App app){
169+
update = true;
170+
execute(R.string.app_uninstalling, "pm uninstall -k --user 0 " + app.pkg);
171+
}
172+
public void install(App app){
173+
update = true;
174+
execute(R.string.app_installing, "cmd package install-existing " + app.pkg);
175+
}
176+
public void clear(App app){
177+
execute(R.string.app_clearing, "pm clear " + app.pkg);
178+
}
147179

148180
int stringId;
181+
boolean update;
149182
}
150183
private class AppLoadTask extends AppTask{
151184
@Override
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package ru.nikita.adb;
2+
3+
import java.util.ArrayList;
4+
import java.util.Arrays;
5+
import java.lang.Comparable;
6+
import android.os.Bundle;
7+
import android.os.AsyncTask;
8+
import android.app.ListActivity;
9+
import android.app.ProgressDialog;
10+
import android.content.Context;
11+
import android.content.Intent;
12+
import android.view.Menu;
13+
import android.view.MenuItem;
14+
import android.widget.ArrayAdapter;
15+
import android.widget.ListView;
16+
import android.widget.TextView;
17+
import android.widget.CheckBox;
18+
import android.widget.Toast;
19+
import android.R.layout;
20+
import android.util.SparseBooleanArray;
21+
import ru.nikita.adb.Device;
22+
import ru.nikita.adb.Task;
23+
24+
public class PermissionsActivity extends ListActivity{
25+
@Override
26+
public void onCreate(Bundle savedInstanceState) {
27+
super.onCreate(savedInstanceState);
28+
Intent intent = getIntent();
29+
adb = (Binary) intent.getSerializableExtra("adb");
30+
device = (Device) intent.getSerializableExtra("device");
31+
pkg = intent.getStringExtra("package");
32+
new AppPermissionLoadTask().execute();
33+
}
34+
@Override
35+
public boolean onCreateOptionsMenu(Menu menu){
36+
getMenuInflater().inflate(R.menu.permissions_activity, menu);
37+
return true;
38+
}
39+
@Override
40+
public boolean onOptionsItemSelected(MenuItem item){
41+
int id = item.getItemId();
42+
if(id == R.id.permissions_apply){
43+
SparseBooleanArray selected = getListView().getCheckedItemPositions();
44+
boolean granted[] = new boolean[permissions.length];
45+
for(int i = 0; i < granted.length; i++)
46+
granted[i] = selected.get(i);
47+
new AppPermissionsApplyTask().execute(granted);
48+
return true;
49+
}
50+
return false;
51+
}
52+
private class Permission implements Comparable<Permission>{
53+
Permission(String name){
54+
this.name = name;
55+
granted = false;
56+
}
57+
@Override
58+
public int compareTo(Permission p){
59+
return this.name.compareTo(p.name);
60+
}
61+
@Override
62+
public String toString(){
63+
return name;
64+
}
65+
public String name;
66+
public boolean granted;
67+
}
68+
private class AppPermissionLoadTask extends ADBTask{
69+
AppPermissionLoadTask(){
70+
super(adb);
71+
}
72+
@Override
73+
protected void onPreExecute(){
74+
super.onPreExecute();
75+
pd = new ProgressDialog(PermissionsActivity.this);
76+
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
77+
pd.setMessage(getResources().getString(R.string.permissions_loading));
78+
pd.show();
79+
}
80+
@Override
81+
protected void onPostExecute(String log){
82+
super.onPostExecute(log);
83+
pd.dismiss();
84+
String[] lines = log.split("\n");
85+
boolean requested = false;
86+
boolean install = false;
87+
ArrayList<Permission>list = new ArrayList<Permission>();
88+
for(String line : lines){
89+
line = line.trim();
90+
if(line.equals("requested permissions:"))
91+
requested = true;
92+
else if(line.equals("install permissions:"))
93+
install = true;
94+
else if(line.contains("User"))
95+
break;
96+
else if(install){
97+
if(!line.contains("REVOKE_ON_UPGRADE")){
98+
String name = line.split(":")[0];
99+
for(Permission p : list)
100+
if(p.name.equals(name))
101+
p.granted = true;
102+
}
103+
}else if(requested)
104+
list.add(new Permission(line));
105+
}
106+
permissions = list.toArray(new Permission[0]);
107+
Arrays.sort(permissions);
108+
109+
setListAdapter(new ArrayAdapter<Permission>(PermissionsActivity.this,
110+
android.R.layout.simple_list_item_multiple_choice, permissions));
111+
112+
ListView listView = getListView();
113+
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
114+
for(int i = 0; i < permissions.length; i++)
115+
listView.setItemChecked(i, permissions[i].granted);
116+
}
117+
118+
public void execute(){
119+
shell(device, "dumpsys package " + pkg);
120+
}
121+
private ProgressDialog pd;
122+
}
123+
private class AppPermissionsApplyTask extends ADBTask{
124+
AppPermissionsApplyTask(){
125+
super(adb);
126+
}
127+
@Override
128+
protected void onPreExecute(){
129+
super.onPreExecute();
130+
pd = new ProgressDialog(PermissionsActivity.this);
131+
pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
132+
pd.setMessage(getResources().getString(R.string.app_permissions_applying));
133+
pd.show();
134+
}
135+
@Override
136+
protected void onPostExecute(String log){
137+
super.onPostExecute(log);
138+
pd.dismiss();
139+
if(log.length() > 0)
140+
Toast.makeText(getApplicationContext(), log, Toast.LENGTH_LONG).show();
141+
new AppPermissionLoadTask().execute();
142+
}
143+
public void execute(boolean[] granted){
144+
String command = "";
145+
for(int i = 0; i < permissions.length; i++){
146+
Permission permission = permissions[i];
147+
if(permission.granted != granted[i])
148+
command += String.format("pm %s %s %s; ", granted[i]?"grant":"revoke",
149+
pkg, permission.name);
150+
}
151+
shell(device, command);
152+
}
153+
private ProgressDialog pd;
154+
}
155+
156+
157+
private Binary adb;
158+
private Device device;
159+
private String pkg;
160+
161+
private Permission[] permissions;
162+
}

app/src/main/res/menu/app_context_menu.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,8 @@
66
android:title="@string/app_uninstall" />
77
<item android:id="@+id/app_install"
88
android:title="@string/app_install" />
9+
<item android:id="@+id/app_clear"
10+
android:title="@string/app_clear" />
11+
<item android:id="@+id/app_permissions"
12+
android:title="@string/app_permissions" />
913
</menu>
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<menu xmlns:android="http://schemas.android.com/apk/res/android">
3+
<item
4+
android:id="@+id/permissions_apply"
5+
android:icon="@drawable/apply"
6+
android:showAsAction="always"/>
7+
</menu>

app/src/main/res/values-ru/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<string name="port">Порт</string>
1919
<string name="app_list">Список приложений</string>
2020
<string name="app_loading">Загрузка списка приложений...</string>
21+
<string name="permissions_loading">Загрузка разрешений...</string>
2122
<string name="show_installed_apps">Только сторонние</string>
2223
<string name="refresh_apps">Обновить список</string>
2324
<string name="file_manager">Менеджер файлов</string>
@@ -50,8 +51,12 @@
5051
<string name="app_uninstall_data">Удалить с данными</string>
5152
<string name="app_uninstall">Удалить</string>
5253
<string name="app_install">Переустановить</string>
54+
<string name="app_clear">Очистить данные</string>
55+
<string name="app_permissions">Установить разрешения</string>
5356
<string name="app_uninstalling">Удаление...</string>
5457
<string name="app_installing">Установка...</string>
58+
<string name="app_clearing">Очистка данных...</string>
59+
<string name="app_permissions_applying">Применение разрешений...</string>
5560
<string name="command_line">Командная строка</string>
5661
<string name="execute">Выполнить</string>
5762
<string name="sort_name">Сортировка по имени</string>

app/src/main/res/values/strings.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<string name="port">Device port</string>
1919
<string name="app_list">App list</string>
2020
<string name="app_loading">Loading applications...</string>
21+
<string name="permissions_loading">Loading permissions...</string>
2122
<string name="show_installed_apps">Show only installed apps</string>
2223
<string name="refresh_apps">Refresh</string>
2324
<string name="file_manager">File manager</string>
@@ -50,8 +51,12 @@
5051
<string name="app_uninstall_data">Uninstall with data</string>
5152
<string name="app_uninstall">Uninstall without data</string>
5253
<string name="app_install">Install</string>
54+
<string name="app_clear">Clear data</string>
55+
<string name="app_permissions">Set permissions</string>
5356
<string name="app_uninstalling">Uninstalling...</string>
5457
<string name="app_installing">Installing...</string>
58+
<string name="app_clearing">Clearing data...</string>
59+
<string name="app_permissions_applying">Applying permissions...</string>
5560
<string name="command_line">Command line</string>
5661
<string name="execute">Execute</string>
5762
<string name="sort_name">Sort by name</string>

0 commit comments

Comments
 (0)