/*
* Copyright (C) 2014 Divide.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.divide.client.android.mock;
import android.app.*;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import com.google.inject.Inject;
import com.jug6ernaut.debugdrawer.DebugDrawer;
import com.jug6ernaut.debugdrawer.views.DebugGroup;
import com.jug6ernaut.debugdrawer.views.SpinnerElement;
import com.jug6ernaut.debugdrawer.views.TextElement;
import io.divide.client.android.AndroidBackend;
import io.divide.client.android.mock.AndroidDebugConfig.ModuleType;
import io.divide.shared.logging.Logger;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import static io.divide.client.android.mock.AndroidDebugConfig.ModuleType.*;
public class DivideDrawer {
public static void attach(Activity activity, int contentView) {
DrawerHolder dh = new DrawerHolder(activity);
dh.attach(contentView);
}
public static void attach(Activity activity, View contentView){
DrawerHolder dh = new DrawerHolder(activity);
dh.attach(contentView);
}
private static class DrawerHolder extends DebugDrawer {
private static Logger logger = Logger.getLogger(DrawerHolder.class);
@Inject
private AndroidDebugConfig config;
private SpinnerElement spinner;
private TextElement url;
List<String> endpointList = Arrays.asList(Prod.name(),Dev.name(),Mock.name());
List<String> urlList;
@Inject
public DrawerHolder(final Activity activity) {
super(activity,false);
AndroidBackend.inject(this);
urlList = Arrays.asList(
config.getProdUrl(),
config.getDevUrl(),
"Mock");
DebugGroup endpoints = new DebugGroup("Network",activity);
url = new TextElement(activity,"URL: ");
spinner = new SpinnerElement(
activity,
"Endpoints",
endpointList.toArray(new String[endpointList.size()])) {
@Override
public void onAction(String s) {
logger.debug("Changing endpoint: " + s);
showAlert(activity,s);
}
};
endpoints.addElement(url);
endpoints.addElement(spinner);
this.addDebugGroup(endpoints);
}
@Override
protected void postAttach(){
int current = getIndex();
url.setValue(urlList.get(current));
url.getActionView().setTextSize(TypedValue.COMPLEX_UNIT_DIP,10);
spinner.getActionView().setSelection(current);
}
private int getIndex(){
String current = config.getCurrentModuleType();
System.out.println("Current: " + current);
return endpointList.indexOf(config.getCurrentModuleType());
}
public void showAlert(final Activity activity,final String endpoint){
final AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("WARNING");
builder.setMessage("Data will be cleared and application restarted. Continue?");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
deleteCache(activity);
deleteData(activity);
deletePrefs(activity);
config.setModuleType(ModuleType.valueOf(endpoint));
// AndroidBackend.init(config);
// url.setValue(urlList.get(getIndex()));
// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
// activity.startActivity(intent);
activity.getApplication().registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override public void onActivityCreated(Activity activity, Bundle bundle) { }
@Override public void onActivityStarted(Activity activity) { }
@Override public void onActivityResumed(Activity activity) { }
@Override public void onActivityPaused(Activity activity) { }
@Override public void onActivityStopped(Activity activity) { }
@Override public void onActivitySaveInstanceState(Activity activity, Bundle bundle) { }
@Override
public void onActivityDestroyed(Activity activity) {
Intent intent = new Intent(activity, activity.getClass());
PendingIntent pi = PendingIntent.getActivity(activity, 0, intent, 0);
AlarmManager am=(AlarmManager)activity.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + ( 500 ), pi); // Millisec * Second * Minute
System.exit(0);
}
});
activity.finish();
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
dialogInterface.dismiss();
}
});
builder.show();
}
}
public static void deletePrefs(Context context){
try {
File parent = context.getFilesDir().getParentFile();
File dir = new File( parent.getPath() + File.separatorChar + "shared_prefs" );
if (dir != null && dir.isDirectory()) {
deleteDir(dir);
}
} catch (Exception e) {e.printStackTrace();}
}
public static void deleteData(Context context) {
try {
File dir = context.getFilesDir();
if (dir != null && dir.isDirectory()) {
deleteDir(dir);
}
} catch (Exception e) {e.printStackTrace();}
}
public static void deleteCache(Context context) {
try {
File dir = context.getCacheDir();
if (dir != null && dir.isDirectory()) {
deleteDir(dir);
}
} catch (Exception e) {e.printStackTrace();}
}
public static boolean deleteDir(File dir) {
if (dir != null && dir.isDirectory()) {
String[] children = dir.list();
for (String aChildren : children) {
boolean success = deleteDir(new File(dir, aChildren));
if (!success) {
return false;
}
}
}
System.out.println("Deleting: " + dir.getPath());
return dir.delete();
}
}