VancedMicroG/play-services-core/src/main/java/org/microg/gms/ui/GcmAppFragment.java

225 lines
9.5 KiB
Java

package org.microg.gms.ui;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.text.format.DateUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.Fragment;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;
import com.mgoogle.android.gms.R;
import org.microg.gms.gcm.GcmDatabase;
import org.microg.gms.gcm.PushRegisterManager;
import org.microg.tools.ui.AbstractSettingsActivity;
import org.microg.tools.ui.ResourceSettingsFragment;
import java.util.List;
import static android.text.format.DateUtils.FORMAT_SHOW_TIME;
import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
import static android.text.format.DateUtils.WEEK_IN_MILLIS;
public class GcmAppFragment extends ResourceSettingsFragment {
public static final String EXTRA_PACKAGE_NAME = "package_name";
public static final String PREF_WAKE_FOR_DELIVERY = "gcm_app_wake_for_delivery";
public static final String PREF_ALLOW_REGISTER = "gcm_app_allow_register";
public static final String PREF_REGISTER_DETAILS = "gcm_app_register_details";
public static final String PREF_MESSAGE_DETAILS = "gcm_app_message_details";
protected String packageName;
private String appName;
private GcmDatabase database;
public GcmAppFragment() {
preferencesResource = R.xml.preferences_gcm_app_detail;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
packageName = getArguments().getString(EXTRA_PACKAGE_NAME);
AbstractSettingsActivity activity = (AbstractSettingsActivity) getActivity();
if (packageName != null && activity != null) {
activity.setCustomBarLayout(R.layout.app_bar);
try {
PackageManager pm = activity.getPackageManager();
ApplicationInfo info = pm.getApplicationInfo(packageName, 0);
((ImageView) activity.findViewById(R.id.app_icon)).setImageDrawable(pm.getApplicationIcon(info));
appName = pm.getApplicationLabel(info).toString();
((TextView) activity.findViewById(R.id.app_name)).setText(appName);
View view = activity.findViewById(R.id.app_bar);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", packageName, null);
intent.setData(uri);
getContext().startActivity(intent);
}
});
view.setClickable(true);
} catch (Exception e) {
appName = packageName;
((TextView) activity.findViewById(R.id.app_name)).setText(packageName);
}
}
database = new GcmDatabase(getContext());
updateAppDetails();
}
@Override
public void onPause() {
super.onPause();
database.close();
}
@Override
public void onResume() {
super.onResume();
if (database != null) {
updateAppDetails();
}
}
private void updateAppDetails() {
GcmDatabase.App app = database.getApp(packageName);
if (app == null) {
getActivity().finish();
return;
}
PreferenceScreen root = getPreferenceScreen();
SwitchPreference wakeForDelivery = (SwitchPreference) root.findPreference(PREF_WAKE_FOR_DELIVERY);
wakeForDelivery.setChecked(app.wakeForDelivery);
wakeForDelivery.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue instanceof Boolean) {
database.setAppWakeForDelivery(packageName, (Boolean) newValue);
return true;
}
return false;
}
});
SwitchPreference allowRegister = (SwitchPreference) root.findPreference(PREF_ALLOW_REGISTER);
allowRegister.setChecked(app.allowRegister);
allowRegister.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
if (newValue instanceof Boolean) {
if (!(boolean) newValue) {
final List<GcmDatabase.Registration> registrations = database.getRegistrationsByApp(packageName);
if (!registrations.isEmpty()) {
showUnregisterConfirm(registrations, getString(R.string.gcm_unregister_after_deny_message));
}
}
database.setAppAllowRegister(packageName, (Boolean) newValue);
return true;
}
return false;
}
});
Preference registerDetails = root.findPreference(PREF_REGISTER_DETAILS);
final List<GcmDatabase.Registration> registrations = database.getRegistrationsByApp(packageName);
if (registrations.isEmpty()) {
registerDetails.setTitle("");
registerDetails.setSelectable(false);
registerDetails.setSummary(R.string.gcm_not_registered);
} else {
StringBuilder sb = new StringBuilder();
for (GcmDatabase.Registration registration : registrations) {
if (sb.length() != 0) sb.append("\n");
if (registration.timestamp == 0) {
sb.append(getString(R.string.gcm_registered));
} else {
sb.append(getString(R.string.gcm_registered_since, DateUtils.getRelativeDateTimeString(getContext(), registration.timestamp, MINUTE_IN_MILLIS, WEEK_IN_MILLIS, FORMAT_SHOW_TIME)));
}
}
registerDetails.setTitle(R.string.gcm_unregister_app);
registerDetails.setSummary(sb.toString());
registerDetails.setSelectable(true);
registerDetails.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
showUnregisterConfirm(registrations, getString(R.string.gcm_unregister_confirm_message));
return true;
}
});
}
Preference messageDetails = root.findPreference(PREF_MESSAGE_DETAILS);
if (app.totalMessageCount == 0) {
messageDetails.setSummary(R.string.gcm_no_message_yet);
} else {
String s = getString(R.string.gcm_messages_counter, app.totalMessageCount, app.totalMessageBytes);
if (app.lastMessageTimestamp != 0) {
s += "\n" + getString(R.string.gcm_last_message_at, DateUtils.getRelativeDateTimeString(getContext(), app.lastMessageTimestamp, MINUTE_IN_MILLIS, WEEK_IN_MILLIS, FORMAT_SHOW_TIME));
}
messageDetails.setSummary(s);
}
}
private void showUnregisterConfirm(final List<GcmDatabase.Registration> registrations, String unregisterConfirmDesc) {
new AlertDialog.Builder(getContext())
.setTitle(getString(R.string.gcm_unregister_confirm_title, appName))
.setMessage(unregisterConfirmDesc)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new Thread(new Runnable() {
@Override
public void run() {
for (GcmDatabase.Registration registration : registrations) {
PushRegisterManager.unregister(getContext(), registration.packageName, registration.signature, null, null);
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
updateAppDetails();
}
});
}
}).start();
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Do nothing
}
}).show();
}
public static class AsActivity extends AbstractSettingsActivity {
public AsActivity() {
showHomeAsUp = true;
}
@Override
protected Fragment getFragment() {
GcmAppFragment fragment = new GcmAppFragment();
fragment.setArguments(getIntent().getExtras());
return fragment;
}
}
}